1*d83cc019SAndroid Build Coastguard Worker #ifndef INTEL_BATCHBUFFER_H
2*d83cc019SAndroid Build Coastguard Worker #define INTEL_BATCHBUFFER_H
3*d83cc019SAndroid Build Coastguard Worker
4*d83cc019SAndroid Build Coastguard Worker #include <stdint.h>
5*d83cc019SAndroid Build Coastguard Worker #include <intel_bufmgr.h>
6*d83cc019SAndroid Build Coastguard Worker #include <i915_drm.h>
7*d83cc019SAndroid Build Coastguard Worker
8*d83cc019SAndroid Build Coastguard Worker #include "igt_core.h"
9*d83cc019SAndroid Build Coastguard Worker #include "intel_reg.h"
10*d83cc019SAndroid Build Coastguard Worker
11*d83cc019SAndroid Build Coastguard Worker #define BATCH_SZ 4096
12*d83cc019SAndroid Build Coastguard Worker #define BATCH_RESERVED 16
13*d83cc019SAndroid Build Coastguard Worker
14*d83cc019SAndroid Build Coastguard Worker struct intel_batchbuffer {
15*d83cc019SAndroid Build Coastguard Worker drm_intel_bufmgr *bufmgr;
16*d83cc019SAndroid Build Coastguard Worker uint32_t devid;
17*d83cc019SAndroid Build Coastguard Worker int gen;
18*d83cc019SAndroid Build Coastguard Worker
19*d83cc019SAndroid Build Coastguard Worker drm_intel_context *ctx;
20*d83cc019SAndroid Build Coastguard Worker drm_intel_bo *bo;
21*d83cc019SAndroid Build Coastguard Worker
22*d83cc019SAndroid Build Coastguard Worker uint8_t buffer[BATCH_SZ];
23*d83cc019SAndroid Build Coastguard Worker uint8_t *ptr, *end;
24*d83cc019SAndroid Build Coastguard Worker };
25*d83cc019SAndroid Build Coastguard Worker
26*d83cc019SAndroid Build Coastguard Worker struct intel_batchbuffer *intel_batchbuffer_alloc(drm_intel_bufmgr *bufmgr,
27*d83cc019SAndroid Build Coastguard Worker uint32_t devid);
28*d83cc019SAndroid Build Coastguard Worker
29*d83cc019SAndroid Build Coastguard Worker void intel_batchbuffer_set_context(struct intel_batchbuffer *batch,
30*d83cc019SAndroid Build Coastguard Worker drm_intel_context *ctx);
31*d83cc019SAndroid Build Coastguard Worker
32*d83cc019SAndroid Build Coastguard Worker
33*d83cc019SAndroid Build Coastguard Worker void intel_batchbuffer_free(struct intel_batchbuffer *batch);
34*d83cc019SAndroid Build Coastguard Worker
35*d83cc019SAndroid Build Coastguard Worker
36*d83cc019SAndroid Build Coastguard Worker void intel_batchbuffer_flush(struct intel_batchbuffer *batch);
37*d83cc019SAndroid Build Coastguard Worker void intel_batchbuffer_flush_on_ring(struct intel_batchbuffer *batch, int ring);
38*d83cc019SAndroid Build Coastguard Worker void intel_batchbuffer_flush_with_context(struct intel_batchbuffer *batch,
39*d83cc019SAndroid Build Coastguard Worker drm_intel_context *context);
40*d83cc019SAndroid Build Coastguard Worker
41*d83cc019SAndroid Build Coastguard Worker void intel_batchbuffer_reset(struct intel_batchbuffer *batch);
42*d83cc019SAndroid Build Coastguard Worker
43*d83cc019SAndroid Build Coastguard Worker uint32_t intel_batchbuffer_copy_data(struct intel_batchbuffer *batch,
44*d83cc019SAndroid Build Coastguard Worker const void *data, unsigned int bytes,
45*d83cc019SAndroid Build Coastguard Worker uint32_t align);
46*d83cc019SAndroid Build Coastguard Worker
47*d83cc019SAndroid Build Coastguard Worker void intel_batchbuffer_emit_reloc(struct intel_batchbuffer *batch,
48*d83cc019SAndroid Build Coastguard Worker drm_intel_bo *buffer,
49*d83cc019SAndroid Build Coastguard Worker uint64_t delta,
50*d83cc019SAndroid Build Coastguard Worker uint32_t read_domains,
51*d83cc019SAndroid Build Coastguard Worker uint32_t write_domain,
52*d83cc019SAndroid Build Coastguard Worker int fenced);
53*d83cc019SAndroid Build Coastguard Worker
54*d83cc019SAndroid Build Coastguard Worker uint32_t
55*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_align(struct intel_batchbuffer *batch, uint32_t align);
56*d83cc019SAndroid Build Coastguard Worker
57*d83cc019SAndroid Build Coastguard Worker void *
58*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_subdata_alloc(struct intel_batchbuffer *batch,
59*d83cc019SAndroid Build Coastguard Worker uint32_t size, uint32_t align);
60*d83cc019SAndroid Build Coastguard Worker
61*d83cc019SAndroid Build Coastguard Worker uint32_t
62*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_subdata_offset(struct intel_batchbuffer *batch, void *ptr);
63*d83cc019SAndroid Build Coastguard Worker
64*d83cc019SAndroid Build Coastguard Worker /* Inline functions - might actually be better off with these
65*d83cc019SAndroid Build Coastguard Worker * non-inlined. Certainly better off switching all command packets to
66*d83cc019SAndroid Build Coastguard Worker * be passed as structs rather than dwords, but that's a little bit of
67*d83cc019SAndroid Build Coastguard Worker * work...
68*d83cc019SAndroid Build Coastguard Worker */
69*d83cc019SAndroid Build Coastguard Worker #pragma GCC diagnostic ignored "-Winline"
70*d83cc019SAndroid Build Coastguard Worker static inline unsigned int
intel_batchbuffer_space(struct intel_batchbuffer * batch)71*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_space(struct intel_batchbuffer *batch)
72*d83cc019SAndroid Build Coastguard Worker {
73*d83cc019SAndroid Build Coastguard Worker return (BATCH_SZ - BATCH_RESERVED) - (batch->ptr - batch->buffer);
74*d83cc019SAndroid Build Coastguard Worker }
75*d83cc019SAndroid Build Coastguard Worker
76*d83cc019SAndroid Build Coastguard Worker
77*d83cc019SAndroid Build Coastguard Worker static inline void
intel_batchbuffer_emit_dword(struct intel_batchbuffer * batch,uint32_t dword)78*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_emit_dword(struct intel_batchbuffer *batch, uint32_t dword)
79*d83cc019SAndroid Build Coastguard Worker {
80*d83cc019SAndroid Build Coastguard Worker igt_assert(intel_batchbuffer_space(batch) >= 4);
81*d83cc019SAndroid Build Coastguard Worker *(uint32_t *) (batch->ptr) = dword;
82*d83cc019SAndroid Build Coastguard Worker batch->ptr += 4;
83*d83cc019SAndroid Build Coastguard Worker }
84*d83cc019SAndroid Build Coastguard Worker
85*d83cc019SAndroid Build Coastguard Worker static inline void
intel_batchbuffer_require_space(struct intel_batchbuffer * batch,unsigned int sz)86*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_require_space(struct intel_batchbuffer *batch,
87*d83cc019SAndroid Build Coastguard Worker unsigned int sz)
88*d83cc019SAndroid Build Coastguard Worker {
89*d83cc019SAndroid Build Coastguard Worker igt_assert(sz < BATCH_SZ - BATCH_RESERVED);
90*d83cc019SAndroid Build Coastguard Worker if (intel_batchbuffer_space(batch) < sz)
91*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_flush(batch);
92*d83cc019SAndroid Build Coastguard Worker }
93*d83cc019SAndroid Build Coastguard Worker
94*d83cc019SAndroid Build Coastguard Worker /**
95*d83cc019SAndroid Build Coastguard Worker * BEGIN_BATCH:
96*d83cc019SAndroid Build Coastguard Worker * @n: number of DWORDS to emit
97*d83cc019SAndroid Build Coastguard Worker * @r: number of RELOCS to emit
98*d83cc019SAndroid Build Coastguard Worker *
99*d83cc019SAndroid Build Coastguard Worker * Prepares a batch to emit @n DWORDS, flushing it if there's not enough space
100*d83cc019SAndroid Build Coastguard Worker * available.
101*d83cc019SAndroid Build Coastguard Worker *
102*d83cc019SAndroid Build Coastguard Worker * This macro needs a pointer to an #intel_batchbuffer structure called batch in
103*d83cc019SAndroid Build Coastguard Worker * scope.
104*d83cc019SAndroid Build Coastguard Worker */
105*d83cc019SAndroid Build Coastguard Worker #define BEGIN_BATCH(n, r) do { \
106*d83cc019SAndroid Build Coastguard Worker int __n = (n); \
107*d83cc019SAndroid Build Coastguard Worker igt_assert(batch->end == NULL); \
108*d83cc019SAndroid Build Coastguard Worker if (batch->gen >= 8) __n += r; \
109*d83cc019SAndroid Build Coastguard Worker __n *= 4; \
110*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_require_space(batch, __n); \
111*d83cc019SAndroid Build Coastguard Worker batch->end = batch->ptr + __n; \
112*d83cc019SAndroid Build Coastguard Worker } while (0)
113*d83cc019SAndroid Build Coastguard Worker
114*d83cc019SAndroid Build Coastguard Worker /**
115*d83cc019SAndroid Build Coastguard Worker * OUT_BATCH:
116*d83cc019SAndroid Build Coastguard Worker * @d: DWORD to emit
117*d83cc019SAndroid Build Coastguard Worker *
118*d83cc019SAndroid Build Coastguard Worker * Emits @d into a batch.
119*d83cc019SAndroid Build Coastguard Worker *
120*d83cc019SAndroid Build Coastguard Worker * This macro needs a pointer to an #intel_batchbuffer structure called batch in
121*d83cc019SAndroid Build Coastguard Worker * scope.
122*d83cc019SAndroid Build Coastguard Worker */
123*d83cc019SAndroid Build Coastguard Worker #define OUT_BATCH(d) intel_batchbuffer_emit_dword(batch, d)
124*d83cc019SAndroid Build Coastguard Worker
125*d83cc019SAndroid Build Coastguard Worker /**
126*d83cc019SAndroid Build Coastguard Worker * OUT_RELOC_FENCED:
127*d83cc019SAndroid Build Coastguard Worker * @buf: relocation target libdrm buffer object
128*d83cc019SAndroid Build Coastguard Worker * @read_domains: gem domain bits for the relocation
129*d83cc019SAndroid Build Coastguard Worker * @write_domain: gem domain bit for the relocation
130*d83cc019SAndroid Build Coastguard Worker * @delta: delta value to add to @buffer's gpu address
131*d83cc019SAndroid Build Coastguard Worker *
132*d83cc019SAndroid Build Coastguard Worker * Emits a fenced relocation into a batch.
133*d83cc019SAndroid Build Coastguard Worker *
134*d83cc019SAndroid Build Coastguard Worker * This macro needs a pointer to an #intel_batchbuffer structure called batch in
135*d83cc019SAndroid Build Coastguard Worker * scope.
136*d83cc019SAndroid Build Coastguard Worker */
137*d83cc019SAndroid Build Coastguard Worker #define OUT_RELOC_FENCED(buf, read_domains, write_domain, delta) do { \
138*d83cc019SAndroid Build Coastguard Worker igt_assert((delta) >= 0); \
139*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_emit_reloc(batch, buf, delta, \
140*d83cc019SAndroid Build Coastguard Worker read_domains, write_domain, 1); \
141*d83cc019SAndroid Build Coastguard Worker } while (0)
142*d83cc019SAndroid Build Coastguard Worker
143*d83cc019SAndroid Build Coastguard Worker /**
144*d83cc019SAndroid Build Coastguard Worker * OUT_RELOC:
145*d83cc019SAndroid Build Coastguard Worker * @buf: relocation target libdrm buffer object
146*d83cc019SAndroid Build Coastguard Worker * @read_domains: gem domain bits for the relocation
147*d83cc019SAndroid Build Coastguard Worker * @write_domain: gem domain bit for the relocation
148*d83cc019SAndroid Build Coastguard Worker * @delta: delta value to add to @buffer's gpu address
149*d83cc019SAndroid Build Coastguard Worker *
150*d83cc019SAndroid Build Coastguard Worker * Emits a normal, unfenced relocation into a batch.
151*d83cc019SAndroid Build Coastguard Worker *
152*d83cc019SAndroid Build Coastguard Worker * This macro needs a pointer to an #intel_batchbuffer structure called batch in
153*d83cc019SAndroid Build Coastguard Worker * scope.
154*d83cc019SAndroid Build Coastguard Worker */
155*d83cc019SAndroid Build Coastguard Worker #define OUT_RELOC(buf, read_domains, write_domain, delta) do { \
156*d83cc019SAndroid Build Coastguard Worker igt_assert((delta) >= 0); \
157*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_emit_reloc(batch, buf, delta, \
158*d83cc019SAndroid Build Coastguard Worker read_domains, write_domain, 0); \
159*d83cc019SAndroid Build Coastguard Worker } while (0)
160*d83cc019SAndroid Build Coastguard Worker
161*d83cc019SAndroid Build Coastguard Worker /**
162*d83cc019SAndroid Build Coastguard Worker * ADVANCE_BATCH:
163*d83cc019SAndroid Build Coastguard Worker *
164*d83cc019SAndroid Build Coastguard Worker * Completes the batch command emission sequence started with #BEGIN_BATCH.
165*d83cc019SAndroid Build Coastguard Worker *
166*d83cc019SAndroid Build Coastguard Worker * This macro needs a pointer to an #intel_batchbuffer structure called batch in
167*d83cc019SAndroid Build Coastguard Worker * scope.
168*d83cc019SAndroid Build Coastguard Worker */
169*d83cc019SAndroid Build Coastguard Worker #define ADVANCE_BATCH() do { \
170*d83cc019SAndroid Build Coastguard Worker igt_assert(batch->ptr == batch->end); \
171*d83cc019SAndroid Build Coastguard Worker batch->end = NULL; \
172*d83cc019SAndroid Build Coastguard Worker } while(0)
173*d83cc019SAndroid Build Coastguard Worker
174*d83cc019SAndroid Build Coastguard Worker #define BLIT_COPY_BATCH_START(flags) do { \
175*d83cc019SAndroid Build Coastguard Worker BEGIN_BATCH(8, 2); \
176*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(XY_SRC_COPY_BLT_CMD | \
177*d83cc019SAndroid Build Coastguard Worker XY_SRC_COPY_BLT_WRITE_ALPHA | \
178*d83cc019SAndroid Build Coastguard Worker XY_SRC_COPY_BLT_WRITE_RGB | \
179*d83cc019SAndroid Build Coastguard Worker (flags) | \
180*d83cc019SAndroid Build Coastguard Worker (6 + 2*(batch->gen >= 8))); \
181*d83cc019SAndroid Build Coastguard Worker } while(0)
182*d83cc019SAndroid Build Coastguard Worker
183*d83cc019SAndroid Build Coastguard Worker #define COLOR_BLIT_COPY_BATCH_START(flags) do { \
184*d83cc019SAndroid Build Coastguard Worker BEGIN_BATCH(6, 1); \
185*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(XY_COLOR_BLT_CMD_NOLEN | \
186*d83cc019SAndroid Build Coastguard Worker COLOR_BLT_WRITE_ALPHA | \
187*d83cc019SAndroid Build Coastguard Worker XY_COLOR_BLT_WRITE_RGB | \
188*d83cc019SAndroid Build Coastguard Worker (flags) | \
189*d83cc019SAndroid Build Coastguard Worker (4 + (batch->gen >= 8))); \
190*d83cc019SAndroid Build Coastguard Worker } while(0)
191*d83cc019SAndroid Build Coastguard Worker
192*d83cc019SAndroid Build Coastguard Worker void
193*d83cc019SAndroid Build Coastguard Worker intel_blt_copy(struct intel_batchbuffer *batch,
194*d83cc019SAndroid Build Coastguard Worker drm_intel_bo *src_bo, int src_x1, int src_y1, int src_pitch,
195*d83cc019SAndroid Build Coastguard Worker drm_intel_bo *dst_bo, int dst_x1, int dst_y1, int dst_pitch,
196*d83cc019SAndroid Build Coastguard Worker int width, int height, int bpp);
197*d83cc019SAndroid Build Coastguard Worker void intel_copy_bo(struct intel_batchbuffer *batch,
198*d83cc019SAndroid Build Coastguard Worker drm_intel_bo *dst_bo, drm_intel_bo *src_bo,
199*d83cc019SAndroid Build Coastguard Worker long int size);
200*d83cc019SAndroid Build Coastguard Worker
201*d83cc019SAndroid Build Coastguard Worker /*
202*d83cc019SAndroid Build Coastguard Worker * Yf/Ys tiling
203*d83cc019SAndroid Build Coastguard Worker *
204*d83cc019SAndroid Build Coastguard Worker * Tiling mode in the I915_TILING_... namespace for new tiling modes which are
205*d83cc019SAndroid Build Coastguard Worker * defined in the kernel. (They are not fenceable so the kernel does not need
206*d83cc019SAndroid Build Coastguard Worker * to know about them.)
207*d83cc019SAndroid Build Coastguard Worker *
208*d83cc019SAndroid Build Coastguard Worker * They are to be used the the blitting routines below.
209*d83cc019SAndroid Build Coastguard Worker */
210*d83cc019SAndroid Build Coastguard Worker #define I915_TILING_Yf 3
211*d83cc019SAndroid Build Coastguard Worker #define I915_TILING_Ys 4
212*d83cc019SAndroid Build Coastguard Worker
213*d83cc019SAndroid Build Coastguard Worker /**
214*d83cc019SAndroid Build Coastguard Worker * igt_buf:
215*d83cc019SAndroid Build Coastguard Worker * @bo: underlying libdrm buffer object
216*d83cc019SAndroid Build Coastguard Worker * @stride: stride of the buffer
217*d83cc019SAndroid Build Coastguard Worker * @tiling: tiling mode bits
218*d83cc019SAndroid Build Coastguard Worker * @bpp: bits per pixel, 8, 16 or 32.
219*d83cc019SAndroid Build Coastguard Worker * @data: pointer to the memory mapping of the buffer
220*d83cc019SAndroid Build Coastguard Worker * @size: size of the buffer object
221*d83cc019SAndroid Build Coastguard Worker *
222*d83cc019SAndroid Build Coastguard Worker * This is a i-g-t buffer object wrapper structure which augments the baseline
223*d83cc019SAndroid Build Coastguard Worker * libdrm buffer object with suitable data needed by the render copy and the
224*d83cc019SAndroid Build Coastguard Worker * fill functions.
225*d83cc019SAndroid Build Coastguard Worker */
226*d83cc019SAndroid Build Coastguard Worker struct igt_buf {
227*d83cc019SAndroid Build Coastguard Worker drm_intel_bo *bo;
228*d83cc019SAndroid Build Coastguard Worker uint32_t stride;
229*d83cc019SAndroid Build Coastguard Worker uint32_t tiling;
230*d83cc019SAndroid Build Coastguard Worker uint32_t bpp;
231*d83cc019SAndroid Build Coastguard Worker uint32_t *data;
232*d83cc019SAndroid Build Coastguard Worker uint32_t size;
233*d83cc019SAndroid Build Coastguard Worker struct {
234*d83cc019SAndroid Build Coastguard Worker uint32_t offset;
235*d83cc019SAndroid Build Coastguard Worker uint32_t stride;
236*d83cc019SAndroid Build Coastguard Worker } aux;
237*d83cc019SAndroid Build Coastguard Worker /*< private >*/
238*d83cc019SAndroid Build Coastguard Worker unsigned num_tiles;
239*d83cc019SAndroid Build Coastguard Worker };
240*d83cc019SAndroid Build Coastguard Worker
241*d83cc019SAndroid Build Coastguard Worker unsigned igt_buf_width(const struct igt_buf *buf);
242*d83cc019SAndroid Build Coastguard Worker unsigned igt_buf_height(const struct igt_buf *buf);
243*d83cc019SAndroid Build Coastguard Worker
244*d83cc019SAndroid Build Coastguard Worker void igt_blitter_fast_copy(struct intel_batchbuffer *batch,
245*d83cc019SAndroid Build Coastguard Worker const struct igt_buf *src, unsigned src_delta,
246*d83cc019SAndroid Build Coastguard Worker unsigned src_x, unsigned src_y,
247*d83cc019SAndroid Build Coastguard Worker unsigned width, unsigned height,
248*d83cc019SAndroid Build Coastguard Worker int bpp,
249*d83cc019SAndroid Build Coastguard Worker const struct igt_buf *dst, unsigned dst_delta,
250*d83cc019SAndroid Build Coastguard Worker unsigned dst_x, unsigned dst_y);
251*d83cc019SAndroid Build Coastguard Worker
252*d83cc019SAndroid Build Coastguard Worker void igt_blitter_fast_copy__raw(int fd,
253*d83cc019SAndroid Build Coastguard Worker /* src */
254*d83cc019SAndroid Build Coastguard Worker uint32_t src_handle,
255*d83cc019SAndroid Build Coastguard Worker unsigned int src_delta,
256*d83cc019SAndroid Build Coastguard Worker unsigned int src_stride,
257*d83cc019SAndroid Build Coastguard Worker unsigned int src_tiling,
258*d83cc019SAndroid Build Coastguard Worker unsigned int src_x, unsigned src_y,
259*d83cc019SAndroid Build Coastguard Worker
260*d83cc019SAndroid Build Coastguard Worker /* size */
261*d83cc019SAndroid Build Coastguard Worker unsigned int width, unsigned int height,
262*d83cc019SAndroid Build Coastguard Worker
263*d83cc019SAndroid Build Coastguard Worker /* bpp */
264*d83cc019SAndroid Build Coastguard Worker int bpp,
265*d83cc019SAndroid Build Coastguard Worker
266*d83cc019SAndroid Build Coastguard Worker /* dst */
267*d83cc019SAndroid Build Coastguard Worker uint32_t dst_handle,
268*d83cc019SAndroid Build Coastguard Worker unsigned int dst_delta,
269*d83cc019SAndroid Build Coastguard Worker unsigned int dst_stride,
270*d83cc019SAndroid Build Coastguard Worker unsigned int dst_tiling,
271*d83cc019SAndroid Build Coastguard Worker unsigned int dst_x, unsigned dst_y);
272*d83cc019SAndroid Build Coastguard Worker
273*d83cc019SAndroid Build Coastguard Worker /**
274*d83cc019SAndroid Build Coastguard Worker * igt_render_copyfunc_t:
275*d83cc019SAndroid Build Coastguard Worker * @batch: batchbuffer object
276*d83cc019SAndroid Build Coastguard Worker * @context: libdrm hardware context to use
277*d83cc019SAndroid Build Coastguard Worker * @src: source i-g-t buffer object
278*d83cc019SAndroid Build Coastguard Worker * @src_x: source pixel x-coordination
279*d83cc019SAndroid Build Coastguard Worker * @src_y: source pixel y-coordination
280*d83cc019SAndroid Build Coastguard Worker * @width: width of the copied rectangle
281*d83cc019SAndroid Build Coastguard Worker * @height: height of the copied rectangle
282*d83cc019SAndroid Build Coastguard Worker * @dst: destination i-g-t buffer object
283*d83cc019SAndroid Build Coastguard Worker * @dst_x: destination pixel x-coordination
284*d83cc019SAndroid Build Coastguard Worker * @dst_y: destination pixel y-coordination
285*d83cc019SAndroid Build Coastguard Worker *
286*d83cc019SAndroid Build Coastguard Worker * This is the type of the per-platform render copy functions. The
287*d83cc019SAndroid Build Coastguard Worker * platform-specific implementation can be obtained by calling
288*d83cc019SAndroid Build Coastguard Worker * igt_get_render_copyfunc().
289*d83cc019SAndroid Build Coastguard Worker *
290*d83cc019SAndroid Build Coastguard Worker * A render copy function will emit a batchbuffer to the kernel which executes
291*d83cc019SAndroid Build Coastguard Worker * the specified blit copy operation using the render engine. @context is
292*d83cc019SAndroid Build Coastguard Worker * optional and can be NULL.
293*d83cc019SAndroid Build Coastguard Worker */
294*d83cc019SAndroid Build Coastguard Worker typedef void (*igt_render_copyfunc_t)(struct intel_batchbuffer *batch,
295*d83cc019SAndroid Build Coastguard Worker drm_intel_context *context,
296*d83cc019SAndroid Build Coastguard Worker const struct igt_buf *src, unsigned src_x, unsigned src_y,
297*d83cc019SAndroid Build Coastguard Worker unsigned width, unsigned height,
298*d83cc019SAndroid Build Coastguard Worker const struct igt_buf *dst, unsigned dst_x, unsigned dst_y);
299*d83cc019SAndroid Build Coastguard Worker
300*d83cc019SAndroid Build Coastguard Worker igt_render_copyfunc_t igt_get_render_copyfunc(int devid);
301*d83cc019SAndroid Build Coastguard Worker
302*d83cc019SAndroid Build Coastguard Worker /**
303*d83cc019SAndroid Build Coastguard Worker * igt_fillfunc_t:
304*d83cc019SAndroid Build Coastguard Worker * @batch: batchbuffer object
305*d83cc019SAndroid Build Coastguard Worker * @dst: destination i-g-t buffer object
306*d83cc019SAndroid Build Coastguard Worker * @x: destination pixel x-coordination
307*d83cc019SAndroid Build Coastguard Worker * @y: destination pixel y-coordination
308*d83cc019SAndroid Build Coastguard Worker * @width: width of the filled rectangle
309*d83cc019SAndroid Build Coastguard Worker * @height: height of the filled rectangle
310*d83cc019SAndroid Build Coastguard Worker * @color: fill color to use
311*d83cc019SAndroid Build Coastguard Worker *
312*d83cc019SAndroid Build Coastguard Worker * This is the type of the per-platform fill functions using media
313*d83cc019SAndroid Build Coastguard Worker * or gpgpu pipeline. The platform-specific implementation can be obtained
314*d83cc019SAndroid Build Coastguard Worker * by calling igt_get_media_fillfunc() or igt_get_gpgpu_fillfunc().
315*d83cc019SAndroid Build Coastguard Worker *
316*d83cc019SAndroid Build Coastguard Worker * A fill function will emit a batchbuffer to the kernel which executes
317*d83cc019SAndroid Build Coastguard Worker * the specified blit fill operation using the media/gpgpu engine.
318*d83cc019SAndroid Build Coastguard Worker */
319*d83cc019SAndroid Build Coastguard Worker typedef void (*igt_fillfunc_t)(struct intel_batchbuffer *batch,
320*d83cc019SAndroid Build Coastguard Worker const struct igt_buf *dst,
321*d83cc019SAndroid Build Coastguard Worker unsigned x, unsigned y,
322*d83cc019SAndroid Build Coastguard Worker unsigned width, unsigned height,
323*d83cc019SAndroid Build Coastguard Worker uint8_t color);
324*d83cc019SAndroid Build Coastguard Worker
325*d83cc019SAndroid Build Coastguard Worker igt_fillfunc_t igt_get_media_fillfunc(int devid);
326*d83cc019SAndroid Build Coastguard Worker igt_fillfunc_t igt_get_gpgpu_fillfunc(int devid);
327*d83cc019SAndroid Build Coastguard Worker
328*d83cc019SAndroid Build Coastguard Worker typedef void (*igt_vme_func_t)(struct intel_batchbuffer *batch,
329*d83cc019SAndroid Build Coastguard Worker const struct igt_buf *src,
330*d83cc019SAndroid Build Coastguard Worker unsigned int width, unsigned int height,
331*d83cc019SAndroid Build Coastguard Worker const struct igt_buf *dst);
332*d83cc019SAndroid Build Coastguard Worker
333*d83cc019SAndroid Build Coastguard Worker igt_vme_func_t igt_get_media_vme_func(int devid);
334*d83cc019SAndroid Build Coastguard Worker
335*d83cc019SAndroid Build Coastguard Worker /**
336*d83cc019SAndroid Build Coastguard Worker * igt_media_spinfunc_t:
337*d83cc019SAndroid Build Coastguard Worker * @batch: batchbuffer object
338*d83cc019SAndroid Build Coastguard Worker * @dst: destination i-g-t buffer object
339*d83cc019SAndroid Build Coastguard Worker * @spins: number of loops to execute
340*d83cc019SAndroid Build Coastguard Worker *
341*d83cc019SAndroid Build Coastguard Worker * This is the type of the per-platform media spin functions. The
342*d83cc019SAndroid Build Coastguard Worker * platform-specific implementation can be obtained by calling
343*d83cc019SAndroid Build Coastguard Worker * igt_get_media_spinfunc().
344*d83cc019SAndroid Build Coastguard Worker *
345*d83cc019SAndroid Build Coastguard Worker * The media spin function emits a batchbuffer for the render engine with
346*d83cc019SAndroid Build Coastguard Worker * the media pipeline selected. The workload consists of a single thread
347*d83cc019SAndroid Build Coastguard Worker * which spins in a tight loop the requested number of times. Each spin
348*d83cc019SAndroid Build Coastguard Worker * increments a counter whose final 32-bit value is written to the
349*d83cc019SAndroid Build Coastguard Worker * destination buffer on completion. This utility provides a simple way
350*d83cc019SAndroid Build Coastguard Worker * to keep the render engine busy for a set time for various tests.
351*d83cc019SAndroid Build Coastguard Worker */
352*d83cc019SAndroid Build Coastguard Worker typedef void (*igt_media_spinfunc_t)(struct intel_batchbuffer *batch,
353*d83cc019SAndroid Build Coastguard Worker const struct igt_buf *dst, uint32_t spins);
354*d83cc019SAndroid Build Coastguard Worker
355*d83cc019SAndroid Build Coastguard Worker igt_media_spinfunc_t igt_get_media_spinfunc(int devid);
356*d83cc019SAndroid Build Coastguard Worker
357*d83cc019SAndroid Build Coastguard Worker #endif
358