blob: df761541badaa5db370ac59092b44b94ef16e458 [file] [log] [blame]
Chia-I Wu6464ff22014-08-05 11:59:54 +08001/*
2 * Mesa 3-D graphics library
3 *
4 * Copyright (C) 2012-2014 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 *
24 * Authors:
25 * Chia-I Wu <olv@lunarg.com>
26 */
27
28#ifndef INTEL_WINSYS_H
29#define INTEL_WINSYS_H
30
Chia-I Wu770b3092014-08-05 14:22:03 +080031#include <stdint.h>
32#include <stdbool.h>
Chia-I Wu6464ff22014-08-05 11:59:54 +080033
34/* this is compatible with i915_drm.h's definitions */
35enum intel_ring_type {
36 INTEL_RING_RENDER = 1,
37 INTEL_RING_BSD = 2,
38 INTEL_RING_BLT = 3,
39 INTEL_RING_VEBOX = 4,
40};
41
42/* this is compatible with i915_drm.h's definitions */
43enum intel_exec_flag {
44 INTEL_EXEC_GEN7_SOL_RESET = 1 << 8,
45};
46
47/* this is compatible with i915_drm.h's definitions */
48enum intel_domain_flag {
49 INTEL_DOMAIN_CPU = 0x00000001,
50 INTEL_DOMAIN_RENDER = 0x00000002,
51 INTEL_DOMAIN_SAMPLER = 0x00000004,
52 INTEL_DOMAIN_COMMAND = 0x00000008,
53 INTEL_DOMAIN_INSTRUCTION = 0x00000010,
54 INTEL_DOMAIN_VERTEX = 0x00000020,
55 INTEL_DOMAIN_GTT = 0x00000040,
56};
57
58/* this is compatible with i915_drm.h's definitions */
59enum intel_tiling_mode {
60 INTEL_TILING_NONE = 0,
61 INTEL_TILING_X = 1,
62 INTEL_TILING_Y = 2,
63};
64
Chia-I Wu770b3092014-08-05 14:22:03 +080065enum intel_winsys_handle_type {
66 INTEL_WINSYS_HANDLE_SHARED,
67 INTEL_WINSYS_HANDLE_KMS,
68 INTEL_WINSYS_HANDLE_FD,
69};
70
Chia-I Wu6464ff22014-08-05 11:59:54 +080071struct intel_winsys;
Chia-I Wu6464ff22014-08-05 11:59:54 +080072struct intel_bo;
73
74struct intel_winsys_info {
75 int devid;
76
77 int max_batch_size;
78 bool has_llc;
79 bool has_address_swizzling;
80 bool has_logical_context;
81 bool has_ppgtt;
82
83 /* valid registers for intel_winsys_read_reg() */
84 bool has_timestamp;
85
86 /* valid flags for intel_winsys_submit_bo() */
87 bool has_gen7_sol_reset;
88};
89
Chia-I Wu770b3092014-08-05 14:22:03 +080090struct intel_winsys_handle {
91 enum intel_winsys_handle_type type;
92 unsigned handle;
93 unsigned stride;
94};
95
Chia-I Wu6464ff22014-08-05 11:59:54 +080096struct intel_winsys *
97intel_winsys_create_for_fd(int fd);
98
99void
100intel_winsys_destroy(struct intel_winsys *winsys);
101
102const struct intel_winsys_info *
103intel_winsys_get_info(const struct intel_winsys *winsys);
104
105/**
Chia-I Wu6464ff22014-08-05 11:59:54 +0800106 * Read a register. Only registers that are considered safe, such as
107 *
108 * TIMESTAMP (0x2358)
109 *
110 * can be read.
111 */
112int
113intel_winsys_read_reg(struct intel_winsys *winsys,
114 uint32_t reg, uint64_t *val);
115
116/**
117 * Allocate a buffer object.
118 *
119 * \param name Informative description of the bo.
120 * \param tiling Tiling mode.
121 * \param pitch Pitch of the bo.
122 * \param height Height of the bo.
123 * \param initial_domain Initial (write) domain.
124 */
125struct intel_bo *
126intel_winsys_alloc_bo(struct intel_winsys *winsys,
127 const char *name,
128 enum intel_tiling_mode tiling,
129 unsigned long pitch,
130 unsigned long height,
131 uint32_t initial_domain);
132
133/**
134 * Allocate a linear buffer object.
135 */
136static inline struct intel_bo *
137intel_winsys_alloc_buffer(struct intel_winsys *winsys,
138 const char *name,
139 unsigned long size,
140 uint32_t initial_domain)
141{
142 return intel_winsys_alloc_bo(winsys, name,
143 INTEL_TILING_NONE, size, 1, initial_domain);
144}
145
146/**
147 * Create a bo from a winsys handle.
148 */
149struct intel_bo *
150intel_winsys_import_handle(struct intel_winsys *winsys,
151 const char *name,
Chia-I Wu770b3092014-08-05 14:22:03 +0800152 const struct intel_winsys_handle *handle,
Chia-I Wu6464ff22014-08-05 11:59:54 +0800153 unsigned long height,
154 enum intel_tiling_mode *tiling,
155 unsigned long *pitch);
156
157/**
158 * Export \p bo as a winsys handle for inter-process sharing.
159 */
160int
161intel_winsys_export_handle(struct intel_winsys *winsys,
162 struct intel_bo *bo,
163 enum intel_tiling_mode tiling,
164 unsigned long pitch,
165 unsigned long height,
Chia-I Wu770b3092014-08-05 14:22:03 +0800166 struct intel_winsys_handle *handle);
Chia-I Wu6464ff22014-08-05 11:59:54 +0800167
168/**
169 * Return true when buffer objects directly specified in \p bo_array, and
170 * those indirectly referenced by them, can fit in the aperture space.
171 */
172bool
173intel_winsys_can_submit_bo(struct intel_winsys *winsys,
174 struct intel_bo **bo_array,
175 int count);
176
177/**
178 * Submit \p bo for execution.
179 *
180 * \p bo and all bos referenced by \p bo will be considered busy until all
181 * commands are parsed and executed. \p ctx is ignored when the bo is not
182 * submitted to the render ring.
183 */
184int
185intel_winsys_submit_bo(struct intel_winsys *winsys,
186 enum intel_ring_type ring,
187 struct intel_bo *bo, int used,
Chia-I Wu6464ff22014-08-05 11:59:54 +0800188 unsigned long flags);
189
190/**
191 * Decode the commands contained in \p bo. For debugging.
192 *
193 * \param bo Batch buffer to decode.
194 * \param used Size of the commands in bytes.
195 */
196void
197intel_winsys_decode_bo(struct intel_winsys *winsys,
198 struct intel_bo *bo, int used);
199
200/**
201 * Increase the reference count of \p bo.
202 */
203void
204intel_bo_reference(struct intel_bo *bo);
205
206/**
207 * Decrease the reference count of \p bo. When the reference count reaches
208 * zero, \p bo is destroyed.
209 */
210void
211intel_bo_unreference(struct intel_bo *bo);
212
213/**
214 * Map \p bo for CPU access. Recursive mapping is allowed.
215 *
216 * map() maps the backing store into CPU address space, cached. It will block
217 * if the bo is busy. This variant allows fastest random reads and writes,
218 * but the caller needs to handle tiling or swizzling manually if the bo is
219 * tiled or swizzled. If write is enabled and there is no shared last-level
220 * cache (LLC), the CPU cache will be flushed, which is expensive.
221 *
222 * map_gtt() maps the bo for MMIO access, uncached but write-combined. It
223 * will block if the bo is busy. This variant promises a reasonable speed for
224 * sequential writes, but reads would be very slow. Callers always have a
225 * linear view of the bo.
226 *
227 * map_unsynchronized() is similar to map_gtt(), except that it does not
228 * block.
229 */
230void *
231intel_bo_map(struct intel_bo *bo, bool write_enable);
232
233void *
234intel_bo_map_gtt(struct intel_bo *bo);
235
236void *
237intel_bo_map_unsynchronized(struct intel_bo *bo);
238
239/**
240 * Unmap \p bo.
241 */
242void
243intel_bo_unmap(struct intel_bo *bo);
244
245/**
246 * Write data to \p bo.
247 */
248int
249intel_bo_pwrite(struct intel_bo *bo, unsigned long offset,
250 unsigned long size, const void *data);
251
252/**
253 * Read data from the bo.
254 */
255int
256intel_bo_pread(struct intel_bo *bo, unsigned long offset,
257 unsigned long size, void *data);
258
259/**
260 * Add \p target_bo to the relocation list.
261 *
262 * When \p bo is submitted for execution, and if \p target_bo has moved,
263 * the kernel will patch \p bo at \p offset to \p target_bo->offset plus
264 * \p target_offset.
265 *
266 * \p presumed_offset should be written to \p bo at \p offset.
267 */
268int
269intel_bo_add_reloc(struct intel_bo *bo, uint32_t offset,
270 struct intel_bo *target_bo, uint32_t target_offset,
271 uint32_t read_domains, uint32_t write_domain,
272 uint64_t *presumed_offset);
273
274/**
275 * Return the current number of relocations.
276 */
277int
278intel_bo_get_reloc_count(struct intel_bo *bo);
279
280/**
281 * Truncate all relocations except the first \p start ones.
282 *
283 * Combined with \p intel_bo_get_reloc_count(), they can be used to undo the
284 * \p intel_bo_add_reloc() calls that were just made.
285 */
286void
287intel_bo_truncate_relocs(struct intel_bo *bo, int start);
288
289/**
290 * Return true if \p target_bo is on the relocation list of \p bo, or on
291 * the relocation list of some bo that is referenced by \p bo.
292 */
293bool
294intel_bo_has_reloc(struct intel_bo *bo, struct intel_bo *target_bo);
295
296/**
297 * Wait until \bo is idle, or \p timeout nanoseconds have passed. A
298 * negative timeout means to wait indefinitely.
299 *
300 * \return 0 only when \p bo is idle
301 */
302int
303intel_bo_wait(struct intel_bo *bo, int64_t timeout);
304
305/**
306 * Return true if \p bo is busy.
307 */
308static inline bool
309intel_bo_is_busy(struct intel_bo *bo)
310{
311 return (intel_bo_wait(bo, 0) != 0);
312}
313
314#endif /* INTEL_WINSYS_H */