1*d83cc019SAndroid Build Coastguard Worker #include <assert.h>
2*d83cc019SAndroid Build Coastguard Worker #include <stdlib.h>
3*d83cc019SAndroid Build Coastguard Worker #include <sys/ioctl.h>
4*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
5*d83cc019SAndroid Build Coastguard Worker #include <string.h>
6*d83cc019SAndroid Build Coastguard Worker #include <assert.h>
7*d83cc019SAndroid Build Coastguard Worker #include <fcntl.h>
8*d83cc019SAndroid Build Coastguard Worker #include <inttypes.h>
9*d83cc019SAndroid Build Coastguard Worker #include <errno.h>
10*d83cc019SAndroid Build Coastguard Worker #include <sys/stat.h>
11*d83cc019SAndroid Build Coastguard Worker #include <sys/time.h>
12*d83cc019SAndroid Build Coastguard Worker #include "drm.h"
13*d83cc019SAndroid Build Coastguard Worker #include "i915_drm.h"
14*d83cc019SAndroid Build Coastguard Worker #include "drmtest.h"
15*d83cc019SAndroid Build Coastguard Worker #include "intel_bufmgr.h"
16*d83cc019SAndroid Build Coastguard Worker #include "intel_batchbuffer.h"
17*d83cc019SAndroid Build Coastguard Worker #include "intel_io.h"
18*d83cc019SAndroid Build Coastguard Worker #include "rendercopy.h"
19*d83cc019SAndroid Build Coastguard Worker #include "gen6_render.h"
20*d83cc019SAndroid Build Coastguard Worker #include "intel_reg.h"
21*d83cc019SAndroid Build Coastguard Worker
22*d83cc019SAndroid Build Coastguard Worker #define VERTEX_SIZE (3*4)
23*d83cc019SAndroid Build Coastguard Worker
24*d83cc019SAndroid Build Coastguard Worker static const uint32_t ps_kernel_nomask_affine[][4] = {
25*d83cc019SAndroid Build Coastguard Worker { 0x0060005a, 0x204077be, 0x000000c0, 0x008d0040 },
26*d83cc019SAndroid Build Coastguard Worker { 0x0060005a, 0x206077be, 0x000000c0, 0x008d0080 },
27*d83cc019SAndroid Build Coastguard Worker { 0x0060005a, 0x208077be, 0x000000d0, 0x008d0040 },
28*d83cc019SAndroid Build Coastguard Worker { 0x0060005a, 0x20a077be, 0x000000d0, 0x008d0080 },
29*d83cc019SAndroid Build Coastguard Worker { 0x00000201, 0x20080061, 0x00000000, 0x00000000 },
30*d83cc019SAndroid Build Coastguard Worker { 0x00600001, 0x20200022, 0x008d0000, 0x00000000 },
31*d83cc019SAndroid Build Coastguard Worker { 0x02800031, 0x21c01cc9, 0x00000020, 0x0a8a0001 },
32*d83cc019SAndroid Build Coastguard Worker { 0x00600001, 0x204003be, 0x008d01c0, 0x00000000 },
33*d83cc019SAndroid Build Coastguard Worker { 0x00600001, 0x206003be, 0x008d01e0, 0x00000000 },
34*d83cc019SAndroid Build Coastguard Worker { 0x00600001, 0x208003be, 0x008d0200, 0x00000000 },
35*d83cc019SAndroid Build Coastguard Worker { 0x00600001, 0x20a003be, 0x008d0220, 0x00000000 },
36*d83cc019SAndroid Build Coastguard Worker { 0x00600001, 0x20c003be, 0x008d0240, 0x00000000 },
37*d83cc019SAndroid Build Coastguard Worker { 0x00600001, 0x20e003be, 0x008d0260, 0x00000000 },
38*d83cc019SAndroid Build Coastguard Worker { 0x00600001, 0x210003be, 0x008d0280, 0x00000000 },
39*d83cc019SAndroid Build Coastguard Worker { 0x00600001, 0x212003be, 0x008d02a0, 0x00000000 },
40*d83cc019SAndroid Build Coastguard Worker { 0x05800031, 0x24001cc8, 0x00000040, 0x90019000 },
41*d83cc019SAndroid Build Coastguard Worker { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 },
42*d83cc019SAndroid Build Coastguard Worker { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 },
43*d83cc019SAndroid Build Coastguard Worker { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 },
44*d83cc019SAndroid Build Coastguard Worker { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 },
45*d83cc019SAndroid Build Coastguard Worker { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 },
46*d83cc019SAndroid Build Coastguard Worker { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 },
47*d83cc019SAndroid Build Coastguard Worker { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 },
48*d83cc019SAndroid Build Coastguard Worker { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 },
49*d83cc019SAndroid Build Coastguard Worker };
50*d83cc019SAndroid Build Coastguard Worker
51*d83cc019SAndroid Build Coastguard Worker static uint32_t
batch_round_upto(struct intel_batchbuffer * batch,uint32_t divisor)52*d83cc019SAndroid Build Coastguard Worker batch_round_upto(struct intel_batchbuffer *batch, uint32_t divisor)
53*d83cc019SAndroid Build Coastguard Worker {
54*d83cc019SAndroid Build Coastguard Worker uint32_t offset = batch->ptr - batch->buffer;
55*d83cc019SAndroid Build Coastguard Worker
56*d83cc019SAndroid Build Coastguard Worker offset = (offset + divisor-1) / divisor * divisor;
57*d83cc019SAndroid Build Coastguard Worker batch->ptr = batch->buffer + offset;
58*d83cc019SAndroid Build Coastguard Worker return offset;
59*d83cc019SAndroid Build Coastguard Worker }
60*d83cc019SAndroid Build Coastguard Worker
61*d83cc019SAndroid Build Coastguard Worker static void
gen6_render_flush(struct intel_batchbuffer * batch,drm_intel_context * context,uint32_t batch_end)62*d83cc019SAndroid Build Coastguard Worker gen6_render_flush(struct intel_batchbuffer *batch,
63*d83cc019SAndroid Build Coastguard Worker drm_intel_context *context, uint32_t batch_end)
64*d83cc019SAndroid Build Coastguard Worker {
65*d83cc019SAndroid Build Coastguard Worker int ret;
66*d83cc019SAndroid Build Coastguard Worker
67*d83cc019SAndroid Build Coastguard Worker ret = drm_intel_bo_subdata(batch->bo, 0, 4096, batch->buffer);
68*d83cc019SAndroid Build Coastguard Worker if (ret == 0)
69*d83cc019SAndroid Build Coastguard Worker ret = drm_intel_gem_bo_context_exec(batch->bo, context,
70*d83cc019SAndroid Build Coastguard Worker batch_end, 0);
71*d83cc019SAndroid Build Coastguard Worker igt_assert(ret == 0);
72*d83cc019SAndroid Build Coastguard Worker }
73*d83cc019SAndroid Build Coastguard Worker
74*d83cc019SAndroid Build Coastguard Worker static uint32_t
gen6_bind_buf(struct intel_batchbuffer * batch,const struct igt_buf * buf,int is_dst)75*d83cc019SAndroid Build Coastguard Worker gen6_bind_buf(struct intel_batchbuffer *batch, const struct igt_buf *buf,
76*d83cc019SAndroid Build Coastguard Worker int is_dst)
77*d83cc019SAndroid Build Coastguard Worker {
78*d83cc019SAndroid Build Coastguard Worker struct gen6_surface_state *ss;
79*d83cc019SAndroid Build Coastguard Worker uint32_t write_domain, read_domain;
80*d83cc019SAndroid Build Coastguard Worker int ret;
81*d83cc019SAndroid Build Coastguard Worker
82*d83cc019SAndroid Build Coastguard Worker igt_assert_lte(buf->stride, 128*1024);
83*d83cc019SAndroid Build Coastguard Worker igt_assert_lte(igt_buf_width(buf), 8192);
84*d83cc019SAndroid Build Coastguard Worker igt_assert_lte(igt_buf_height(buf), 8192);
85*d83cc019SAndroid Build Coastguard Worker
86*d83cc019SAndroid Build Coastguard Worker if (is_dst) {
87*d83cc019SAndroid Build Coastguard Worker write_domain = read_domain = I915_GEM_DOMAIN_RENDER;
88*d83cc019SAndroid Build Coastguard Worker } else {
89*d83cc019SAndroid Build Coastguard Worker write_domain = 0;
90*d83cc019SAndroid Build Coastguard Worker read_domain = I915_GEM_DOMAIN_SAMPLER;
91*d83cc019SAndroid Build Coastguard Worker }
92*d83cc019SAndroid Build Coastguard Worker
93*d83cc019SAndroid Build Coastguard Worker ss = intel_batchbuffer_subdata_alloc(batch, sizeof(*ss), 32);
94*d83cc019SAndroid Build Coastguard Worker ss->ss0.surface_type = SURFACE_2D;
95*d83cc019SAndroid Build Coastguard Worker
96*d83cc019SAndroid Build Coastguard Worker switch (buf->bpp) {
97*d83cc019SAndroid Build Coastguard Worker case 8: ss->ss0.surface_format = SURFACEFORMAT_R8_UNORM; break;
98*d83cc019SAndroid Build Coastguard Worker case 16: ss->ss0.surface_format = SURFACEFORMAT_R8G8_UNORM; break;
99*d83cc019SAndroid Build Coastguard Worker case 32: ss->ss0.surface_format = SURFACEFORMAT_B8G8R8A8_UNORM; break;
100*d83cc019SAndroid Build Coastguard Worker case 64: ss->ss0.surface_format = SURFACEFORMAT_R16G16B16A16_FLOAT; break;
101*d83cc019SAndroid Build Coastguard Worker default: igt_assert(0);
102*d83cc019SAndroid Build Coastguard Worker }
103*d83cc019SAndroid Build Coastguard Worker
104*d83cc019SAndroid Build Coastguard Worker ss->ss0.data_return_format = SURFACERETURNFORMAT_FLOAT32;
105*d83cc019SAndroid Build Coastguard Worker ss->ss0.color_blend = 1;
106*d83cc019SAndroid Build Coastguard Worker ss->ss1.base_addr = buf->bo->offset;
107*d83cc019SAndroid Build Coastguard Worker
108*d83cc019SAndroid Build Coastguard Worker ret = drm_intel_bo_emit_reloc(batch->bo,
109*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_subdata_offset(batch, &ss->ss1),
110*d83cc019SAndroid Build Coastguard Worker buf->bo, 0,
111*d83cc019SAndroid Build Coastguard Worker read_domain, write_domain);
112*d83cc019SAndroid Build Coastguard Worker igt_assert(ret == 0);
113*d83cc019SAndroid Build Coastguard Worker
114*d83cc019SAndroid Build Coastguard Worker ss->ss2.height = igt_buf_height(buf) - 1;
115*d83cc019SAndroid Build Coastguard Worker ss->ss2.width = igt_buf_width(buf) - 1;
116*d83cc019SAndroid Build Coastguard Worker ss->ss3.pitch = buf->stride - 1;
117*d83cc019SAndroid Build Coastguard Worker ss->ss3.tiled_surface = buf->tiling != I915_TILING_NONE;
118*d83cc019SAndroid Build Coastguard Worker ss->ss3.tile_walk = buf->tiling == I915_TILING_Y;
119*d83cc019SAndroid Build Coastguard Worker
120*d83cc019SAndroid Build Coastguard Worker ss->ss5.memory_object_control = GEN6_MOCS_PTE;
121*d83cc019SAndroid Build Coastguard Worker
122*d83cc019SAndroid Build Coastguard Worker return intel_batchbuffer_subdata_offset(batch, ss);
123*d83cc019SAndroid Build Coastguard Worker }
124*d83cc019SAndroid Build Coastguard Worker
125*d83cc019SAndroid Build Coastguard Worker static uint32_t
gen6_bind_surfaces(struct intel_batchbuffer * batch,const struct igt_buf * src,const struct igt_buf * dst)126*d83cc019SAndroid Build Coastguard Worker gen6_bind_surfaces(struct intel_batchbuffer *batch,
127*d83cc019SAndroid Build Coastguard Worker const struct igt_buf *src,
128*d83cc019SAndroid Build Coastguard Worker const struct igt_buf *dst)
129*d83cc019SAndroid Build Coastguard Worker {
130*d83cc019SAndroid Build Coastguard Worker uint32_t *binding_table;
131*d83cc019SAndroid Build Coastguard Worker
132*d83cc019SAndroid Build Coastguard Worker binding_table = intel_batchbuffer_subdata_alloc(batch, 32, 32);
133*d83cc019SAndroid Build Coastguard Worker
134*d83cc019SAndroid Build Coastguard Worker binding_table[0] = gen6_bind_buf(batch, dst, 1);
135*d83cc019SAndroid Build Coastguard Worker binding_table[1] = gen6_bind_buf(batch, src, 0);
136*d83cc019SAndroid Build Coastguard Worker
137*d83cc019SAndroid Build Coastguard Worker return intel_batchbuffer_subdata_offset(batch, binding_table);
138*d83cc019SAndroid Build Coastguard Worker }
139*d83cc019SAndroid Build Coastguard Worker
140*d83cc019SAndroid Build Coastguard Worker static void
gen6_emit_sip(struct intel_batchbuffer * batch)141*d83cc019SAndroid Build Coastguard Worker gen6_emit_sip(struct intel_batchbuffer *batch)
142*d83cc019SAndroid Build Coastguard Worker {
143*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN4_STATE_SIP | 0);
144*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
145*d83cc019SAndroid Build Coastguard Worker }
146*d83cc019SAndroid Build Coastguard Worker
147*d83cc019SAndroid Build Coastguard Worker static void
gen6_emit_urb(struct intel_batchbuffer * batch)148*d83cc019SAndroid Build Coastguard Worker gen6_emit_urb(struct intel_batchbuffer *batch)
149*d83cc019SAndroid Build Coastguard Worker {
150*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN6_3DSTATE_URB | (3 - 2));
151*d83cc019SAndroid Build Coastguard Worker OUT_BATCH((1 - 1) << GEN6_3DSTATE_URB_VS_SIZE_SHIFT |
152*d83cc019SAndroid Build Coastguard Worker 24 << GEN6_3DSTATE_URB_VS_ENTRIES_SHIFT); /* at least 24 on GEN6 */
153*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0 << GEN6_3DSTATE_URB_GS_SIZE_SHIFT |
154*d83cc019SAndroid Build Coastguard Worker 0 << GEN6_3DSTATE_URB_GS_ENTRIES_SHIFT); /* no GS thread */
155*d83cc019SAndroid Build Coastguard Worker }
156*d83cc019SAndroid Build Coastguard Worker
157*d83cc019SAndroid Build Coastguard Worker static void
gen6_emit_state_base_address(struct intel_batchbuffer * batch)158*d83cc019SAndroid Build Coastguard Worker gen6_emit_state_base_address(struct intel_batchbuffer *batch)
159*d83cc019SAndroid Build Coastguard Worker {
160*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN4_STATE_BASE_ADDRESS | (10 - 2));
161*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0); /* general */
162*d83cc019SAndroid Build Coastguard Worker OUT_RELOC(batch->bo, /* surface */
163*d83cc019SAndroid Build Coastguard Worker I915_GEM_DOMAIN_INSTRUCTION, 0,
164*d83cc019SAndroid Build Coastguard Worker BASE_ADDRESS_MODIFY);
165*d83cc019SAndroid Build Coastguard Worker OUT_RELOC(batch->bo, /* instruction */
166*d83cc019SAndroid Build Coastguard Worker I915_GEM_DOMAIN_INSTRUCTION, 0,
167*d83cc019SAndroid Build Coastguard Worker BASE_ADDRESS_MODIFY);
168*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0); /* indirect */
169*d83cc019SAndroid Build Coastguard Worker OUT_RELOC(batch->bo, /* dynamic */
170*d83cc019SAndroid Build Coastguard Worker I915_GEM_DOMAIN_INSTRUCTION, 0,
171*d83cc019SAndroid Build Coastguard Worker BASE_ADDRESS_MODIFY);
172*d83cc019SAndroid Build Coastguard Worker
173*d83cc019SAndroid Build Coastguard Worker /* upper bounds, disable */
174*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
175*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(BASE_ADDRESS_MODIFY);
176*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
177*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(BASE_ADDRESS_MODIFY);
178*d83cc019SAndroid Build Coastguard Worker }
179*d83cc019SAndroid Build Coastguard Worker
180*d83cc019SAndroid Build Coastguard Worker static void
gen6_emit_viewports(struct intel_batchbuffer * batch,uint32_t cc_vp)181*d83cc019SAndroid Build Coastguard Worker gen6_emit_viewports(struct intel_batchbuffer *batch, uint32_t cc_vp)
182*d83cc019SAndroid Build Coastguard Worker {
183*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN6_3DSTATE_VIEWPORT_STATE_POINTERS |
184*d83cc019SAndroid Build Coastguard Worker GEN6_3DSTATE_VIEWPORT_STATE_MODIFY_CC |
185*d83cc019SAndroid Build Coastguard Worker (4 - 2));
186*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
187*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
188*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(cc_vp);
189*d83cc019SAndroid Build Coastguard Worker }
190*d83cc019SAndroid Build Coastguard Worker
191*d83cc019SAndroid Build Coastguard Worker static void
gen6_emit_vs(struct intel_batchbuffer * batch)192*d83cc019SAndroid Build Coastguard Worker gen6_emit_vs(struct intel_batchbuffer *batch)
193*d83cc019SAndroid Build Coastguard Worker {
194*d83cc019SAndroid Build Coastguard Worker /* disable VS constant buffer */
195*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN6_3DSTATE_CONSTANT_VS | (5 - 2));
196*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
197*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
198*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
199*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
200*d83cc019SAndroid Build Coastguard Worker
201*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN6_3DSTATE_VS | (6 - 2));
202*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0); /* no VS kernel */
203*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
204*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
205*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
206*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0); /* pass-through */
207*d83cc019SAndroid Build Coastguard Worker }
208*d83cc019SAndroid Build Coastguard Worker
209*d83cc019SAndroid Build Coastguard Worker static void
gen6_emit_gs(struct intel_batchbuffer * batch)210*d83cc019SAndroid Build Coastguard Worker gen6_emit_gs(struct intel_batchbuffer *batch)
211*d83cc019SAndroid Build Coastguard Worker {
212*d83cc019SAndroid Build Coastguard Worker /* disable GS constant buffer */
213*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN6_3DSTATE_CONSTANT_GS | (5 - 2));
214*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
215*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
216*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
217*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
218*d83cc019SAndroid Build Coastguard Worker
219*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN6_3DSTATE_GS | (7 - 2));
220*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0); /* no GS kernel */
221*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
222*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
223*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
224*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
225*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0); /* pass-through */
226*d83cc019SAndroid Build Coastguard Worker }
227*d83cc019SAndroid Build Coastguard Worker
228*d83cc019SAndroid Build Coastguard Worker static void
gen6_emit_clip(struct intel_batchbuffer * batch)229*d83cc019SAndroid Build Coastguard Worker gen6_emit_clip(struct intel_batchbuffer *batch)
230*d83cc019SAndroid Build Coastguard Worker {
231*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN6_3DSTATE_CLIP | (4 - 2));
232*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
233*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0); /* pass-through */
234*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
235*d83cc019SAndroid Build Coastguard Worker }
236*d83cc019SAndroid Build Coastguard Worker
237*d83cc019SAndroid Build Coastguard Worker static void
gen6_emit_wm_constants(struct intel_batchbuffer * batch)238*d83cc019SAndroid Build Coastguard Worker gen6_emit_wm_constants(struct intel_batchbuffer *batch)
239*d83cc019SAndroid Build Coastguard Worker {
240*d83cc019SAndroid Build Coastguard Worker /* disable WM constant buffer */
241*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN6_3DSTATE_CONSTANT_PS | (5 - 2));
242*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
243*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
244*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
245*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
246*d83cc019SAndroid Build Coastguard Worker }
247*d83cc019SAndroid Build Coastguard Worker
248*d83cc019SAndroid Build Coastguard Worker static void
gen6_emit_null_depth_buffer(struct intel_batchbuffer * batch)249*d83cc019SAndroid Build Coastguard Worker gen6_emit_null_depth_buffer(struct intel_batchbuffer *batch)
250*d83cc019SAndroid Build Coastguard Worker {
251*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN4_3DSTATE_DEPTH_BUFFER | (7 - 2));
252*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(SURFACE_NULL << GEN4_3DSTATE_DEPTH_BUFFER_TYPE_SHIFT |
253*d83cc019SAndroid Build Coastguard Worker GEN4_DEPTHFORMAT_D32_FLOAT << GEN4_3DSTATE_DEPTH_BUFFER_FORMAT_SHIFT);
254*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
255*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
256*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
257*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
258*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
259*d83cc019SAndroid Build Coastguard Worker
260*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN4_3DSTATE_CLEAR_PARAMS | (2 - 2));
261*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
262*d83cc019SAndroid Build Coastguard Worker }
263*d83cc019SAndroid Build Coastguard Worker
264*d83cc019SAndroid Build Coastguard Worker static void
gen6_emit_invariant(struct intel_batchbuffer * batch)265*d83cc019SAndroid Build Coastguard Worker gen6_emit_invariant(struct intel_batchbuffer *batch)
266*d83cc019SAndroid Build Coastguard Worker {
267*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(G4X_PIPELINE_SELECT | PIPELINE_SELECT_3D);
268*d83cc019SAndroid Build Coastguard Worker
269*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN6_3DSTATE_MULTISAMPLE | (3 - 2));
270*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN6_3DSTATE_MULTISAMPLE_PIXEL_LOCATION_CENTER |
271*d83cc019SAndroid Build Coastguard Worker GEN6_3DSTATE_MULTISAMPLE_NUMSAMPLES_1); /* 1 sample/pixel */
272*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
273*d83cc019SAndroid Build Coastguard Worker
274*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN6_3DSTATE_SAMPLE_MASK | (2 - 2));
275*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(1);
276*d83cc019SAndroid Build Coastguard Worker }
277*d83cc019SAndroid Build Coastguard Worker
278*d83cc019SAndroid Build Coastguard Worker static void
gen6_emit_cc(struct intel_batchbuffer * batch,uint32_t blend)279*d83cc019SAndroid Build Coastguard Worker gen6_emit_cc(struct intel_batchbuffer *batch, uint32_t blend)
280*d83cc019SAndroid Build Coastguard Worker {
281*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN6_3DSTATE_CC_STATE_POINTERS | (4 - 2));
282*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(blend | 1);
283*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(1024 | 1);
284*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(1024 | 1);
285*d83cc019SAndroid Build Coastguard Worker }
286*d83cc019SAndroid Build Coastguard Worker
287*d83cc019SAndroid Build Coastguard Worker static void
gen6_emit_sampler(struct intel_batchbuffer * batch,uint32_t state)288*d83cc019SAndroid Build Coastguard Worker gen6_emit_sampler(struct intel_batchbuffer *batch, uint32_t state)
289*d83cc019SAndroid Build Coastguard Worker {
290*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN6_3DSTATE_SAMPLER_STATE_POINTERS |
291*d83cc019SAndroid Build Coastguard Worker GEN6_3DSTATE_SAMPLER_STATE_MODIFY_PS |
292*d83cc019SAndroid Build Coastguard Worker (4 - 2));
293*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0); /* VS */
294*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0); /* GS */
295*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(state);
296*d83cc019SAndroid Build Coastguard Worker }
297*d83cc019SAndroid Build Coastguard Worker
298*d83cc019SAndroid Build Coastguard Worker static void
gen6_emit_sf(struct intel_batchbuffer * batch)299*d83cc019SAndroid Build Coastguard Worker gen6_emit_sf(struct intel_batchbuffer *batch)
300*d83cc019SAndroid Build Coastguard Worker {
301*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN6_3DSTATE_SF | (20 - 2));
302*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(1 << GEN6_3DSTATE_SF_NUM_OUTPUTS_SHIFT |
303*d83cc019SAndroid Build Coastguard Worker 1 << GEN6_3DSTATE_SF_URB_ENTRY_READ_LENGTH_SHIFT |
304*d83cc019SAndroid Build Coastguard Worker 1 << GEN6_3DSTATE_SF_URB_ENTRY_READ_OFFSET_SHIFT);
305*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
306*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN6_3DSTATE_SF_CULL_NONE);
307*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(2 << GEN6_3DSTATE_SF_TRIFAN_PROVOKE_SHIFT); /* DW4 */
308*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
309*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
310*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
311*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
312*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0); /* DW9 */
313*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
314*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
315*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
316*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
317*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0); /* DW14 */
318*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
319*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
320*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
321*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
322*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0); /* DW19 */
323*d83cc019SAndroid Build Coastguard Worker }
324*d83cc019SAndroid Build Coastguard Worker
325*d83cc019SAndroid Build Coastguard Worker static void
gen6_emit_wm(struct intel_batchbuffer * batch,int kernel)326*d83cc019SAndroid Build Coastguard Worker gen6_emit_wm(struct intel_batchbuffer *batch, int kernel)
327*d83cc019SAndroid Build Coastguard Worker {
328*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN6_3DSTATE_WM | (9 - 2));
329*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(kernel);
330*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(1 << GEN6_3DSTATE_WM_SAMPLER_COUNT_SHIFT |
331*d83cc019SAndroid Build Coastguard Worker 2 << GEN6_3DSTATE_WM_BINDING_TABLE_ENTRY_COUNT_SHIFT);
332*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
333*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(6 << GEN6_3DSTATE_WM_DISPATCH_START_GRF_0_SHIFT); /* DW4 */
334*d83cc019SAndroid Build Coastguard Worker OUT_BATCH((40 - 1) << GEN6_3DSTATE_WM_MAX_THREADS_SHIFT |
335*d83cc019SAndroid Build Coastguard Worker GEN6_3DSTATE_WM_DISPATCH_ENABLE |
336*d83cc019SAndroid Build Coastguard Worker GEN6_3DSTATE_WM_16_DISPATCH_ENABLE);
337*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(1 << GEN6_3DSTATE_WM_NUM_SF_OUTPUTS_SHIFT |
338*d83cc019SAndroid Build Coastguard Worker GEN6_3DSTATE_WM_PERSPECTIVE_PIXEL_BARYCENTRIC);
339*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
340*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
341*d83cc019SAndroid Build Coastguard Worker }
342*d83cc019SAndroid Build Coastguard Worker
343*d83cc019SAndroid Build Coastguard Worker static void
gen6_emit_binding_table(struct intel_batchbuffer * batch,uint32_t wm_table)344*d83cc019SAndroid Build Coastguard Worker gen6_emit_binding_table(struct intel_batchbuffer *batch, uint32_t wm_table)
345*d83cc019SAndroid Build Coastguard Worker {
346*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN4_3DSTATE_BINDING_TABLE_POINTERS |
347*d83cc019SAndroid Build Coastguard Worker GEN6_3DSTATE_BINDING_TABLE_MODIFY_PS |
348*d83cc019SAndroid Build Coastguard Worker (4 - 2));
349*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0); /* vs */
350*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0); /* gs */
351*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(wm_table);
352*d83cc019SAndroid Build Coastguard Worker }
353*d83cc019SAndroid Build Coastguard Worker
354*d83cc019SAndroid Build Coastguard Worker static void
gen6_emit_drawing_rectangle(struct intel_batchbuffer * batch,const struct igt_buf * dst)355*d83cc019SAndroid Build Coastguard Worker gen6_emit_drawing_rectangle(struct intel_batchbuffer *batch, const struct igt_buf *dst)
356*d83cc019SAndroid Build Coastguard Worker {
357*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN4_3DSTATE_DRAWING_RECTANGLE | (4 - 2));
358*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
359*d83cc019SAndroid Build Coastguard Worker OUT_BATCH((igt_buf_height(dst) - 1) << 16 | (igt_buf_width(dst) - 1));
360*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
361*d83cc019SAndroid Build Coastguard Worker }
362*d83cc019SAndroid Build Coastguard Worker
363*d83cc019SAndroid Build Coastguard Worker static void
gen6_emit_vertex_elements(struct intel_batchbuffer * batch)364*d83cc019SAndroid Build Coastguard Worker gen6_emit_vertex_elements(struct intel_batchbuffer *batch)
365*d83cc019SAndroid Build Coastguard Worker {
366*d83cc019SAndroid Build Coastguard Worker /* The VUE layout
367*d83cc019SAndroid Build Coastguard Worker * dword 0-3: pad (0.0, 0.0, 0.0. 0.0)
368*d83cc019SAndroid Build Coastguard Worker * dword 4-7: position (x, y, 1.0, 1.0),
369*d83cc019SAndroid Build Coastguard Worker * dword 8-11: texture coordinate 0 (u0, v0, 0, 0)
370*d83cc019SAndroid Build Coastguard Worker *
371*d83cc019SAndroid Build Coastguard Worker * dword 4-11 are fetched from vertex buffer
372*d83cc019SAndroid Build Coastguard Worker */
373*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN4_3DSTATE_VERTEX_ELEMENTS | (2 * 3 + 1 - 2));
374*d83cc019SAndroid Build Coastguard Worker
375*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0 << GEN6_VE0_VERTEX_BUFFER_INDEX_SHIFT | GEN6_VE0_VALID |
376*d83cc019SAndroid Build Coastguard Worker SURFACEFORMAT_R32G32B32A32_FLOAT << VE0_FORMAT_SHIFT |
377*d83cc019SAndroid Build Coastguard Worker 0 << VE0_OFFSET_SHIFT);
378*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN4_VFCOMPONENT_STORE_0 << VE1_VFCOMPONENT_0_SHIFT |
379*d83cc019SAndroid Build Coastguard Worker GEN4_VFCOMPONENT_STORE_0 << VE1_VFCOMPONENT_1_SHIFT |
380*d83cc019SAndroid Build Coastguard Worker GEN4_VFCOMPONENT_STORE_0 << VE1_VFCOMPONENT_2_SHIFT |
381*d83cc019SAndroid Build Coastguard Worker GEN4_VFCOMPONENT_STORE_0 << VE1_VFCOMPONENT_3_SHIFT);
382*d83cc019SAndroid Build Coastguard Worker
383*d83cc019SAndroid Build Coastguard Worker /* x,y */
384*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0 << GEN6_VE0_VERTEX_BUFFER_INDEX_SHIFT | GEN6_VE0_VALID |
385*d83cc019SAndroid Build Coastguard Worker SURFACEFORMAT_R16G16_SSCALED << VE0_FORMAT_SHIFT |
386*d83cc019SAndroid Build Coastguard Worker 0 << VE0_OFFSET_SHIFT); /* offsets vb in bytes */
387*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN4_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT |
388*d83cc019SAndroid Build Coastguard Worker GEN4_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT |
389*d83cc019SAndroid Build Coastguard Worker GEN4_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_2_SHIFT |
390*d83cc019SAndroid Build Coastguard Worker GEN4_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT);
391*d83cc019SAndroid Build Coastguard Worker
392*d83cc019SAndroid Build Coastguard Worker /* u0, v0 */
393*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0 << GEN6_VE0_VERTEX_BUFFER_INDEX_SHIFT | GEN6_VE0_VALID |
394*d83cc019SAndroid Build Coastguard Worker SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT |
395*d83cc019SAndroid Build Coastguard Worker 4 << VE0_OFFSET_SHIFT); /* offset vb in bytes */
396*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN4_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT |
397*d83cc019SAndroid Build Coastguard Worker GEN4_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT |
398*d83cc019SAndroid Build Coastguard Worker GEN4_VFCOMPONENT_STORE_0 << VE1_VFCOMPONENT_2_SHIFT |
399*d83cc019SAndroid Build Coastguard Worker GEN4_VFCOMPONENT_STORE_0 << VE1_VFCOMPONENT_3_SHIFT);
400*d83cc019SAndroid Build Coastguard Worker }
401*d83cc019SAndroid Build Coastguard Worker
402*d83cc019SAndroid Build Coastguard Worker static uint32_t
gen6_create_cc_viewport(struct intel_batchbuffer * batch)403*d83cc019SAndroid Build Coastguard Worker gen6_create_cc_viewport(struct intel_batchbuffer *batch)
404*d83cc019SAndroid Build Coastguard Worker {
405*d83cc019SAndroid Build Coastguard Worker struct gen4_cc_viewport *vp;
406*d83cc019SAndroid Build Coastguard Worker
407*d83cc019SAndroid Build Coastguard Worker vp = intel_batchbuffer_subdata_alloc(batch, sizeof(*vp), 32);
408*d83cc019SAndroid Build Coastguard Worker
409*d83cc019SAndroid Build Coastguard Worker vp->min_depth = -1.e35;
410*d83cc019SAndroid Build Coastguard Worker vp->max_depth = 1.e35;
411*d83cc019SAndroid Build Coastguard Worker
412*d83cc019SAndroid Build Coastguard Worker return intel_batchbuffer_subdata_offset(batch, vp);
413*d83cc019SAndroid Build Coastguard Worker }
414*d83cc019SAndroid Build Coastguard Worker
415*d83cc019SAndroid Build Coastguard Worker static uint32_t
gen6_create_cc_blend(struct intel_batchbuffer * batch)416*d83cc019SAndroid Build Coastguard Worker gen6_create_cc_blend(struct intel_batchbuffer *batch)
417*d83cc019SAndroid Build Coastguard Worker {
418*d83cc019SAndroid Build Coastguard Worker struct gen6_blend_state *blend;
419*d83cc019SAndroid Build Coastguard Worker
420*d83cc019SAndroid Build Coastguard Worker blend = intel_batchbuffer_subdata_alloc(batch, sizeof(*blend), 64);
421*d83cc019SAndroid Build Coastguard Worker
422*d83cc019SAndroid Build Coastguard Worker blend->blend0.dest_blend_factor = GEN6_BLENDFACTOR_ZERO;
423*d83cc019SAndroid Build Coastguard Worker blend->blend0.source_blend_factor = GEN6_BLENDFACTOR_ONE;
424*d83cc019SAndroid Build Coastguard Worker blend->blend0.blend_func = GEN6_BLENDFUNCTION_ADD;
425*d83cc019SAndroid Build Coastguard Worker blend->blend0.blend_enable = 1;
426*d83cc019SAndroid Build Coastguard Worker
427*d83cc019SAndroid Build Coastguard Worker blend->blend1.post_blend_clamp_enable = 1;
428*d83cc019SAndroid Build Coastguard Worker blend->blend1.pre_blend_clamp_enable = 1;
429*d83cc019SAndroid Build Coastguard Worker
430*d83cc019SAndroid Build Coastguard Worker return intel_batchbuffer_subdata_offset(batch, blend);
431*d83cc019SAndroid Build Coastguard Worker }
432*d83cc019SAndroid Build Coastguard Worker
433*d83cc019SAndroid Build Coastguard Worker static uint32_t
gen6_create_kernel(struct intel_batchbuffer * batch)434*d83cc019SAndroid Build Coastguard Worker gen6_create_kernel(struct intel_batchbuffer *batch)
435*d83cc019SAndroid Build Coastguard Worker {
436*d83cc019SAndroid Build Coastguard Worker return intel_batchbuffer_copy_data(batch, ps_kernel_nomask_affine,
437*d83cc019SAndroid Build Coastguard Worker sizeof(ps_kernel_nomask_affine),
438*d83cc019SAndroid Build Coastguard Worker 64);
439*d83cc019SAndroid Build Coastguard Worker }
440*d83cc019SAndroid Build Coastguard Worker
441*d83cc019SAndroid Build Coastguard Worker static uint32_t
gen6_create_sampler(struct intel_batchbuffer * batch,sampler_filter_t filter,sampler_extend_t extend)442*d83cc019SAndroid Build Coastguard Worker gen6_create_sampler(struct intel_batchbuffer *batch,
443*d83cc019SAndroid Build Coastguard Worker sampler_filter_t filter,
444*d83cc019SAndroid Build Coastguard Worker sampler_extend_t extend)
445*d83cc019SAndroid Build Coastguard Worker {
446*d83cc019SAndroid Build Coastguard Worker struct gen6_sampler_state *ss;
447*d83cc019SAndroid Build Coastguard Worker
448*d83cc019SAndroid Build Coastguard Worker ss = intel_batchbuffer_subdata_alloc(batch, sizeof(*ss), 32);
449*d83cc019SAndroid Build Coastguard Worker ss->ss0.lod_preclamp = 1; /* GL mode */
450*d83cc019SAndroid Build Coastguard Worker
451*d83cc019SAndroid Build Coastguard Worker /* We use the legacy mode to get the semantics specified by
452*d83cc019SAndroid Build Coastguard Worker * the Render extension. */
453*d83cc019SAndroid Build Coastguard Worker ss->ss0.border_color_mode = GEN4_BORDER_COLOR_MODE_LEGACY;
454*d83cc019SAndroid Build Coastguard Worker
455*d83cc019SAndroid Build Coastguard Worker switch (filter) {
456*d83cc019SAndroid Build Coastguard Worker default:
457*d83cc019SAndroid Build Coastguard Worker case SAMPLER_FILTER_NEAREST:
458*d83cc019SAndroid Build Coastguard Worker ss->ss0.min_filter = GEN4_MAPFILTER_NEAREST;
459*d83cc019SAndroid Build Coastguard Worker ss->ss0.mag_filter = GEN4_MAPFILTER_NEAREST;
460*d83cc019SAndroid Build Coastguard Worker break;
461*d83cc019SAndroid Build Coastguard Worker case SAMPLER_FILTER_BILINEAR:
462*d83cc019SAndroid Build Coastguard Worker ss->ss0.min_filter = GEN4_MAPFILTER_LINEAR;
463*d83cc019SAndroid Build Coastguard Worker ss->ss0.mag_filter = GEN4_MAPFILTER_LINEAR;
464*d83cc019SAndroid Build Coastguard Worker break;
465*d83cc019SAndroid Build Coastguard Worker }
466*d83cc019SAndroid Build Coastguard Worker
467*d83cc019SAndroid Build Coastguard Worker switch (extend) {
468*d83cc019SAndroid Build Coastguard Worker default:
469*d83cc019SAndroid Build Coastguard Worker case SAMPLER_EXTEND_NONE:
470*d83cc019SAndroid Build Coastguard Worker ss->ss1.r_wrap_mode = GEN4_TEXCOORDMODE_CLAMP_BORDER;
471*d83cc019SAndroid Build Coastguard Worker ss->ss1.s_wrap_mode = GEN4_TEXCOORDMODE_CLAMP_BORDER;
472*d83cc019SAndroid Build Coastguard Worker ss->ss1.t_wrap_mode = GEN4_TEXCOORDMODE_CLAMP_BORDER;
473*d83cc019SAndroid Build Coastguard Worker break;
474*d83cc019SAndroid Build Coastguard Worker case SAMPLER_EXTEND_REPEAT:
475*d83cc019SAndroid Build Coastguard Worker ss->ss1.r_wrap_mode = GEN4_TEXCOORDMODE_WRAP;
476*d83cc019SAndroid Build Coastguard Worker ss->ss1.s_wrap_mode = GEN4_TEXCOORDMODE_WRAP;
477*d83cc019SAndroid Build Coastguard Worker ss->ss1.t_wrap_mode = GEN4_TEXCOORDMODE_WRAP;
478*d83cc019SAndroid Build Coastguard Worker break;
479*d83cc019SAndroid Build Coastguard Worker case SAMPLER_EXTEND_PAD:
480*d83cc019SAndroid Build Coastguard Worker ss->ss1.r_wrap_mode = GEN4_TEXCOORDMODE_CLAMP;
481*d83cc019SAndroid Build Coastguard Worker ss->ss1.s_wrap_mode = GEN4_TEXCOORDMODE_CLAMP;
482*d83cc019SAndroid Build Coastguard Worker ss->ss1.t_wrap_mode = GEN4_TEXCOORDMODE_CLAMP;
483*d83cc019SAndroid Build Coastguard Worker break;
484*d83cc019SAndroid Build Coastguard Worker case SAMPLER_EXTEND_REFLECT:
485*d83cc019SAndroid Build Coastguard Worker ss->ss1.r_wrap_mode = GEN4_TEXCOORDMODE_MIRROR;
486*d83cc019SAndroid Build Coastguard Worker ss->ss1.s_wrap_mode = GEN4_TEXCOORDMODE_MIRROR;
487*d83cc019SAndroid Build Coastguard Worker ss->ss1.t_wrap_mode = GEN4_TEXCOORDMODE_MIRROR;
488*d83cc019SAndroid Build Coastguard Worker break;
489*d83cc019SAndroid Build Coastguard Worker }
490*d83cc019SAndroid Build Coastguard Worker
491*d83cc019SAndroid Build Coastguard Worker return intel_batchbuffer_subdata_offset(batch, ss);
492*d83cc019SAndroid Build Coastguard Worker }
493*d83cc019SAndroid Build Coastguard Worker
gen6_emit_vertex_buffer(struct intel_batchbuffer * batch)494*d83cc019SAndroid Build Coastguard Worker static void gen6_emit_vertex_buffer(struct intel_batchbuffer *batch)
495*d83cc019SAndroid Build Coastguard Worker {
496*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN4_3DSTATE_VERTEX_BUFFERS | 3);
497*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN6_VB0_VERTEXDATA |
498*d83cc019SAndroid Build Coastguard Worker 0 << GEN6_VB0_BUFFER_INDEX_SHIFT |
499*d83cc019SAndroid Build Coastguard Worker VERTEX_SIZE << VB0_BUFFER_PITCH_SHIFT);
500*d83cc019SAndroid Build Coastguard Worker OUT_RELOC(batch->bo, I915_GEM_DOMAIN_VERTEX, 0, 0);
501*d83cc019SAndroid Build Coastguard Worker OUT_RELOC(batch->bo, I915_GEM_DOMAIN_VERTEX, 0, batch->bo->size-1);
502*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
503*d83cc019SAndroid Build Coastguard Worker }
504*d83cc019SAndroid Build Coastguard Worker
gen6_emit_primitive(struct intel_batchbuffer * batch)505*d83cc019SAndroid Build Coastguard Worker static uint32_t gen6_emit_primitive(struct intel_batchbuffer *batch)
506*d83cc019SAndroid Build Coastguard Worker {
507*d83cc019SAndroid Build Coastguard Worker uint32_t offset;
508*d83cc019SAndroid Build Coastguard Worker
509*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN4_3DPRIMITIVE |
510*d83cc019SAndroid Build Coastguard Worker GEN4_3DPRIMITIVE_VERTEX_SEQUENTIAL |
511*d83cc019SAndroid Build Coastguard Worker _3DPRIM_RECTLIST << GEN4_3DPRIMITIVE_TOPOLOGY_SHIFT |
512*d83cc019SAndroid Build Coastguard Worker 0 << 9 |
513*d83cc019SAndroid Build Coastguard Worker 4);
514*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(3); /* vertex count */
515*d83cc019SAndroid Build Coastguard Worker offset = batch->ptr - batch->buffer;
516*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0); /* vertex_index */
517*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(1); /* single instance */
518*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0); /* start instance location */
519*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0); /* index buffer offset, ignored */
520*d83cc019SAndroid Build Coastguard Worker
521*d83cc019SAndroid Build Coastguard Worker return offset;
522*d83cc019SAndroid Build Coastguard Worker }
523*d83cc019SAndroid Build Coastguard Worker
gen6_render_copyfunc(struct intel_batchbuffer * batch,drm_intel_context * context,const struct igt_buf * src,unsigned src_x,unsigned src_y,unsigned width,unsigned height,const struct igt_buf * dst,unsigned dst_x,unsigned dst_y)524*d83cc019SAndroid Build Coastguard Worker void gen6_render_copyfunc(struct intel_batchbuffer *batch,
525*d83cc019SAndroid Build Coastguard Worker drm_intel_context *context,
526*d83cc019SAndroid Build Coastguard Worker const struct igt_buf *src, unsigned src_x, unsigned src_y,
527*d83cc019SAndroid Build Coastguard Worker unsigned width, unsigned height,
528*d83cc019SAndroid Build Coastguard Worker const struct igt_buf *dst, unsigned dst_x, unsigned dst_y)
529*d83cc019SAndroid Build Coastguard Worker {
530*d83cc019SAndroid Build Coastguard Worker uint32_t wm_state, wm_kernel, wm_table;
531*d83cc019SAndroid Build Coastguard Worker uint32_t cc_vp, cc_blend, offset;
532*d83cc019SAndroid Build Coastguard Worker uint32_t batch_end;
533*d83cc019SAndroid Build Coastguard Worker
534*d83cc019SAndroid Build Coastguard Worker igt_assert(src->bpp == dst->bpp);
535*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_flush_with_context(batch, context);
536*d83cc019SAndroid Build Coastguard Worker
537*d83cc019SAndroid Build Coastguard Worker batch->ptr = batch->buffer + 1024;
538*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_subdata_alloc(batch, 64, 64);
539*d83cc019SAndroid Build Coastguard Worker wm_table = gen6_bind_surfaces(batch, src, dst);
540*d83cc019SAndroid Build Coastguard Worker wm_kernel = gen6_create_kernel(batch);
541*d83cc019SAndroid Build Coastguard Worker wm_state = gen6_create_sampler(batch,
542*d83cc019SAndroid Build Coastguard Worker SAMPLER_FILTER_NEAREST,
543*d83cc019SAndroid Build Coastguard Worker SAMPLER_EXTEND_NONE);
544*d83cc019SAndroid Build Coastguard Worker
545*d83cc019SAndroid Build Coastguard Worker cc_vp = gen6_create_cc_viewport(batch);
546*d83cc019SAndroid Build Coastguard Worker cc_blend = gen6_create_cc_blend(batch);
547*d83cc019SAndroid Build Coastguard Worker
548*d83cc019SAndroid Build Coastguard Worker batch->ptr = batch->buffer;
549*d83cc019SAndroid Build Coastguard Worker
550*d83cc019SAndroid Build Coastguard Worker gen6_emit_invariant(batch);
551*d83cc019SAndroid Build Coastguard Worker gen6_emit_state_base_address(batch);
552*d83cc019SAndroid Build Coastguard Worker
553*d83cc019SAndroid Build Coastguard Worker gen6_emit_sip(batch);
554*d83cc019SAndroid Build Coastguard Worker gen6_emit_urb(batch);
555*d83cc019SAndroid Build Coastguard Worker
556*d83cc019SAndroid Build Coastguard Worker gen6_emit_viewports(batch, cc_vp);
557*d83cc019SAndroid Build Coastguard Worker gen6_emit_vs(batch);
558*d83cc019SAndroid Build Coastguard Worker gen6_emit_gs(batch);
559*d83cc019SAndroid Build Coastguard Worker gen6_emit_clip(batch);
560*d83cc019SAndroid Build Coastguard Worker gen6_emit_wm_constants(batch);
561*d83cc019SAndroid Build Coastguard Worker gen6_emit_null_depth_buffer(batch);
562*d83cc019SAndroid Build Coastguard Worker
563*d83cc019SAndroid Build Coastguard Worker gen6_emit_drawing_rectangle(batch, dst);
564*d83cc019SAndroid Build Coastguard Worker gen6_emit_cc(batch, cc_blend);
565*d83cc019SAndroid Build Coastguard Worker gen6_emit_sampler(batch, wm_state);
566*d83cc019SAndroid Build Coastguard Worker gen6_emit_sf(batch);
567*d83cc019SAndroid Build Coastguard Worker gen6_emit_wm(batch, wm_kernel);
568*d83cc019SAndroid Build Coastguard Worker gen6_emit_vertex_elements(batch);
569*d83cc019SAndroid Build Coastguard Worker gen6_emit_binding_table(batch, wm_table);
570*d83cc019SAndroid Build Coastguard Worker
571*d83cc019SAndroid Build Coastguard Worker gen6_emit_vertex_buffer(batch);
572*d83cc019SAndroid Build Coastguard Worker offset = gen6_emit_primitive(batch);
573*d83cc019SAndroid Build Coastguard Worker
574*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(MI_BATCH_BUFFER_END);
575*d83cc019SAndroid Build Coastguard Worker batch_end = intel_batchbuffer_align(batch, 8);
576*d83cc019SAndroid Build Coastguard Worker
577*d83cc019SAndroid Build Coastguard Worker *(uint32_t*)(batch->buffer + offset) =
578*d83cc019SAndroid Build Coastguard Worker batch_round_upto(batch, VERTEX_SIZE)/VERTEX_SIZE;
579*d83cc019SAndroid Build Coastguard Worker
580*d83cc019SAndroid Build Coastguard Worker emit_vertex_2s(batch, dst_x + width, dst_y + height);
581*d83cc019SAndroid Build Coastguard Worker emit_vertex_normalized(batch, src_x + width, igt_buf_width(src));
582*d83cc019SAndroid Build Coastguard Worker emit_vertex_normalized(batch, src_y + height, igt_buf_height(src));
583*d83cc019SAndroid Build Coastguard Worker
584*d83cc019SAndroid Build Coastguard Worker emit_vertex_2s(batch, dst_x, dst_y + height);
585*d83cc019SAndroid Build Coastguard Worker emit_vertex_normalized(batch, src_x, igt_buf_width(src));
586*d83cc019SAndroid Build Coastguard Worker emit_vertex_normalized(batch, src_y + height, igt_buf_height(src));
587*d83cc019SAndroid Build Coastguard Worker
588*d83cc019SAndroid Build Coastguard Worker emit_vertex_2s(batch, dst_x, dst_y);
589*d83cc019SAndroid Build Coastguard Worker emit_vertex_normalized(batch, src_x, igt_buf_width(src));
590*d83cc019SAndroid Build Coastguard Worker emit_vertex_normalized(batch, src_y, igt_buf_height(src));
591*d83cc019SAndroid Build Coastguard Worker
592*d83cc019SAndroid Build Coastguard Worker gen6_render_flush(batch, context, batch_end);
593*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_reset(batch);
594*d83cc019SAndroid Build Coastguard Worker }
595