blob: 5f922f79bfe5a13032dc5b04f657c7413b97b4a9 [file] [log] [blame]
Mika Kuoppalad60d4c82014-04-10 15:15:13 +03001#include "intel_batchbuffer.h"
2#include <lib/gen6_render.h>
3#include <lib/intel_reg.h>
4#include <string.h>
5
6static const uint32_t ps_kernel_nomask_affine[][4] = {
7 { 0x0060005a, 0x204077be, 0x000000c0, 0x008d0040 },
8 { 0x0060005a, 0x206077be, 0x000000c0, 0x008d0080 },
9 { 0x0060005a, 0x208077be, 0x000000d0, 0x008d0040 },
10 { 0x0060005a, 0x20a077be, 0x000000d0, 0x008d0080 },
11 { 0x00000201, 0x20080061, 0x00000000, 0x00000000 },
12 { 0x00600001, 0x20200022, 0x008d0000, 0x00000000 },
13 { 0x02800031, 0x21c01cc9, 0x00000020, 0x0a8a0001 },
14 { 0x00600001, 0x204003be, 0x008d01c0, 0x00000000 },
15 { 0x00600001, 0x206003be, 0x008d01e0, 0x00000000 },
16 { 0x00600001, 0x208003be, 0x008d0200, 0x00000000 },
17 { 0x00600001, 0x20a003be, 0x008d0220, 0x00000000 },
18 { 0x00600001, 0x20c003be, 0x008d0240, 0x00000000 },
19 { 0x00600001, 0x20e003be, 0x008d0260, 0x00000000 },
20 { 0x00600001, 0x210003be, 0x008d0280, 0x00000000 },
21 { 0x00600001, 0x212003be, 0x008d02a0, 0x00000000 },
22 { 0x05800031, 0x24001cc8, 0x00000040, 0x90019000 },
23 { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 },
24 { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 },
25 { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 },
26 { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 },
27 { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 },
28 { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 },
29 { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 },
30 { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 },
31};
32
33static uint32_t
34gen6_bind_buf_null(struct intel_batchbuffer *batch)
35{
Mika Kuoppala4a604de2014-08-01 21:19:56 +030036 struct gen6_surface_state ss;
37 memset(&ss, 0, sizeof(ss));
Mika Kuoppalad60d4c82014-04-10 15:15:13 +030038
Mika Kuoppala4a604de2014-08-01 21:19:56 +030039 return OUT_STATE_STRUCT(ss, 32);
Mika Kuoppalad60d4c82014-04-10 15:15:13 +030040}
41
42static uint32_t
43gen6_bind_surfaces(struct intel_batchbuffer *batch)
44{
Mika Kuoppala4a604de2014-08-01 21:19:56 +030045 unsigned offset;
Mika Kuoppalad60d4c82014-04-10 15:15:13 +030046
Mika Kuoppala4a604de2014-08-01 21:19:56 +030047 offset = intel_batch_state_alloc(batch, 32, 32, "bind surfaces");
Mika Kuoppalad60d4c82014-04-10 15:15:13 +030048
Mika Kuoppala4a604de2014-08-01 21:19:56 +030049 bb_area_emit_offset(batch->state, offset, gen6_bind_buf_null(batch), STATE_OFFSET, "bind 1");
50 bb_area_emit_offset(batch->state, offset + 4, gen6_bind_buf_null(batch), STATE_OFFSET, "bind 2");
Mika Kuoppalad60d4c82014-04-10 15:15:13 +030051
Mika Kuoppala4a604de2014-08-01 21:19:56 +030052 return offset;
Mika Kuoppalad60d4c82014-04-10 15:15:13 +030053}
54
55static void
56gen6_emit_sip(struct intel_batchbuffer *batch)
57{
58 OUT_BATCH(GEN6_STATE_SIP | 0);
59 OUT_BATCH(0);
60}
61
62static void
63gen6_emit_urb(struct intel_batchbuffer *batch)
64{
65 OUT_BATCH(GEN6_3DSTATE_URB | (3 - 2));
66 OUT_BATCH((1 - 1) << GEN6_3DSTATE_URB_VS_SIZE_SHIFT |
67 24 << GEN6_3DSTATE_URB_VS_ENTRIES_SHIFT); /* at least 24 on GEN6 */
68 OUT_BATCH(0 << GEN6_3DSTATE_URB_GS_SIZE_SHIFT |
69 0 << GEN6_3DSTATE_URB_GS_ENTRIES_SHIFT); /* no GS thread */
70}
71
72static void
73gen6_emit_state_base_address(struct intel_batchbuffer *batch)
74{
75 OUT_BATCH(GEN6_STATE_BASE_ADDRESS | (10 - 2));
76 OUT_BATCH(0); /* general */
77 OUT_RELOC(batch,
78 I915_GEM_DOMAIN_INSTRUCTION, 0,
79 BASE_ADDRESS_MODIFY);
80 OUT_RELOC(batch, /* instruction */
81 I915_GEM_DOMAIN_INSTRUCTION, 0,
82 BASE_ADDRESS_MODIFY);
83 OUT_BATCH(0); /* indirect */
84 OUT_RELOC(batch,
85 I915_GEM_DOMAIN_INSTRUCTION, 0,
86 BASE_ADDRESS_MODIFY);
87
88 /* upper bounds, disable */
89 OUT_BATCH(0);
90 OUT_BATCH(BASE_ADDRESS_MODIFY);
91 OUT_BATCH(0);
92 OUT_BATCH(BASE_ADDRESS_MODIFY);
93}
94
95static void
96gen6_emit_viewports(struct intel_batchbuffer *batch, uint32_t cc_vp)
97{
98 OUT_BATCH(GEN6_3DSTATE_VIEWPORT_STATE_POINTERS |
99 GEN6_3DSTATE_VIEWPORT_STATE_MODIFY_CC |
100 (4 - 2));
101 OUT_BATCH(0);
102 OUT_BATCH(0);
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300103 OUT_BATCH_STATE_OFFSET(cc_vp);
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300104}
105
106static void
107gen6_emit_vs(struct intel_batchbuffer *batch)
108{
109 /* disable VS constant buffer */
110 OUT_BATCH(GEN6_3DSTATE_CONSTANT_VS | (5 - 2));
111 OUT_BATCH(0);
112 OUT_BATCH(0);
113 OUT_BATCH(0);
114 OUT_BATCH(0);
115
116 OUT_BATCH(GEN6_3DSTATE_VS | (6 - 2));
117 OUT_BATCH(0); /* no VS kernel */
118 OUT_BATCH(0);
119 OUT_BATCH(0);
120 OUT_BATCH(0);
121 OUT_BATCH(0); /* pass-through */
122}
123
124static void
125gen6_emit_gs(struct intel_batchbuffer *batch)
126{
127 /* disable GS constant buffer */
128 OUT_BATCH(GEN6_3DSTATE_CONSTANT_GS | (5 - 2));
129 OUT_BATCH(0);
130 OUT_BATCH(0);
131 OUT_BATCH(0);
132 OUT_BATCH(0);
133
134 OUT_BATCH(GEN6_3DSTATE_GS | (7 - 2));
135 OUT_BATCH(0); /* no GS kernel */
136 OUT_BATCH(0);
137 OUT_BATCH(0);
138 OUT_BATCH(0);
139 OUT_BATCH(0);
140 OUT_BATCH(0); /* pass-through */
141}
142
143static void
144gen6_emit_clip(struct intel_batchbuffer *batch)
145{
146 OUT_BATCH(GEN6_3DSTATE_CLIP | (4 - 2));
147 OUT_BATCH(0);
148 OUT_BATCH(0); /* pass-through */
149 OUT_BATCH(0);
150}
151
152static void
153gen6_emit_wm_constants(struct intel_batchbuffer *batch)
154{
155 /* disable WM constant buffer */
156 OUT_BATCH(GEN6_3DSTATE_CONSTANT_PS | (5 - 2));
157 OUT_BATCH(0);
158 OUT_BATCH(0);
159 OUT_BATCH(0);
160 OUT_BATCH(0);
161}
162
163static void
164gen6_emit_null_depth_buffer(struct intel_batchbuffer *batch)
165{
166 OUT_BATCH(GEN6_3DSTATE_DEPTH_BUFFER | (7 - 2));
167 OUT_BATCH(GEN6_SURFACE_NULL << GEN6_3DSTATE_DEPTH_BUFFER_TYPE_SHIFT |
168 GEN6_DEPTHFORMAT_D32_FLOAT << GEN6_3DSTATE_DEPTH_BUFFER_FORMAT_SHIFT);
169 OUT_BATCH(0);
170 OUT_BATCH(0);
171 OUT_BATCH(0);
172 OUT_BATCH(0);
173 OUT_BATCH(0);
174
175 OUT_BATCH(GEN6_3DSTATE_CLEAR_PARAMS | (2 - 2));
176 OUT_BATCH(0);
177}
178
179static void
180gen6_emit_invariant(struct intel_batchbuffer *batch)
181{
182 OUT_BATCH(GEN6_PIPELINE_SELECT | PIPELINE_SELECT_3D);
183
184 OUT_BATCH(GEN6_3DSTATE_MULTISAMPLE | (3 - 2));
185 OUT_BATCH(GEN6_3DSTATE_MULTISAMPLE_PIXEL_LOCATION_CENTER |
186 GEN6_3DSTATE_MULTISAMPLE_NUMSAMPLES_1); /* 1 sample/pixel */
187 OUT_BATCH(0);
188
189 OUT_BATCH(GEN6_3DSTATE_SAMPLE_MASK | (2 - 2));
190 OUT_BATCH(1);
191}
192
193static void
194gen6_emit_cc(struct intel_batchbuffer *batch, uint32_t blend)
195{
196 OUT_BATCH(GEN6_3DSTATE_CC_STATE_POINTERS | (4 - 2));
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300197 OUT_BATCH_STATE_OFFSET(blend | 1);
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300198 OUT_BATCH(1024 | 1);
199 OUT_BATCH(1024 | 1);
200}
201
202static void
203gen6_emit_sampler(struct intel_batchbuffer *batch, uint32_t state)
204{
205 OUT_BATCH(GEN6_3DSTATE_SAMPLER_STATE_POINTERS |
206 GEN6_3DSTATE_SAMPLER_STATE_MODIFY_PS |
207 (4 - 2));
208 OUT_BATCH(0); /* VS */
209 OUT_BATCH(0); /* GS */
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300210 OUT_BATCH_STATE_OFFSET(state);
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300211}
212
213static void
214gen6_emit_sf(struct intel_batchbuffer *batch)
215{
216 OUT_BATCH(GEN6_3DSTATE_SF | (20 - 2));
217 OUT_BATCH(1 << GEN6_3DSTATE_SF_NUM_OUTPUTS_SHIFT |
218 1 << GEN6_3DSTATE_SF_URB_ENTRY_READ_LENGTH_SHIFT |
219 1 << GEN6_3DSTATE_SF_URB_ENTRY_READ_OFFSET_SHIFT);
220 OUT_BATCH(0);
221 OUT_BATCH(GEN6_3DSTATE_SF_CULL_NONE);
222 OUT_BATCH(2 << GEN6_3DSTATE_SF_TRIFAN_PROVOKE_SHIFT); /* DW4 */
223 OUT_BATCH(0);
224 OUT_BATCH(0);
225 OUT_BATCH(0);
226 OUT_BATCH(0);
227 OUT_BATCH(0); /* DW9 */
228 OUT_BATCH(0);
229 OUT_BATCH(0);
230 OUT_BATCH(0);
231 OUT_BATCH(0);
232 OUT_BATCH(0); /* DW14 */
233 OUT_BATCH(0);
234 OUT_BATCH(0);
235 OUT_BATCH(0);
236 OUT_BATCH(0);
237 OUT_BATCH(0); /* DW19 */
238}
239
240static void
241gen6_emit_wm(struct intel_batchbuffer *batch, int kernel)
242{
243 OUT_BATCH(GEN6_3DSTATE_WM | (9 - 2));
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300244 OUT_BATCH_STATE_OFFSET(kernel);
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300245 OUT_BATCH(1 << GEN6_3DSTATE_WM_SAMPLER_COUNT_SHIFT |
246 2 << GEN6_3DSTATE_WM_BINDING_TABLE_ENTRY_COUNT_SHIFT);
247 OUT_BATCH(0);
248 OUT_BATCH(6 << GEN6_3DSTATE_WM_DISPATCH_START_GRF_0_SHIFT); /* DW4 */
249 OUT_BATCH((40 - 1) << GEN6_3DSTATE_WM_MAX_THREADS_SHIFT |
250 GEN6_3DSTATE_WM_DISPATCH_ENABLE |
251 GEN6_3DSTATE_WM_16_DISPATCH_ENABLE);
252 OUT_BATCH(1 << GEN6_3DSTATE_WM_NUM_SF_OUTPUTS_SHIFT |
253 GEN6_3DSTATE_WM_PERSPECTIVE_PIXEL_BARYCENTRIC);
254 OUT_BATCH(0);
255 OUT_BATCH(0);
256}
257
258static void
259gen6_emit_binding_table(struct intel_batchbuffer *batch, uint32_t wm_table)
260{
261 OUT_BATCH(GEN6_3DSTATE_BINDING_TABLE_POINTERS |
262 GEN6_3DSTATE_BINDING_TABLE_MODIFY_PS |
263 (4 - 2));
264 OUT_BATCH(0); /* vs */
265 OUT_BATCH(0); /* gs */
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300266 OUT_BATCH_STATE_OFFSET(wm_table);
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300267}
268
269static void
270gen6_emit_drawing_rectangle(struct intel_batchbuffer *batch)
271{
272 OUT_BATCH(GEN6_3DSTATE_DRAWING_RECTANGLE | (4 - 2));
273 OUT_BATCH(0xffffffff);
274 OUT_BATCH(0 | 0);
275 OUT_BATCH(0);
276}
277
278static void
279gen6_emit_vertex_elements(struct intel_batchbuffer *batch)
280{
281 /* The VUE layout
282 * dword 0-3: pad (0.0, 0.0, 0.0. 0.0)
283 * dword 4-7: position (x, y, 1.0, 1.0),
284 * dword 8-11: texture coordinate 0 (u0, v0, 0, 0)
285 *
286 * dword 4-11 are fetched from vertex buffer
287 */
288 OUT_BATCH(GEN6_3DSTATE_VERTEX_ELEMENTS | (2 * 3 + 1 - 2));
289
290 OUT_BATCH(0 << VE0_VERTEX_BUFFER_INDEX_SHIFT | VE0_VALID |
291 GEN6_SURFACEFORMAT_R32G32B32A32_FLOAT << VE0_FORMAT_SHIFT |
292 0 << VE0_OFFSET_SHIFT);
293 OUT_BATCH(GEN6_VFCOMPONENT_STORE_0 << VE1_VFCOMPONENT_0_SHIFT |
294 GEN6_VFCOMPONENT_STORE_0 << VE1_VFCOMPONENT_1_SHIFT |
295 GEN6_VFCOMPONENT_STORE_0 << VE1_VFCOMPONENT_2_SHIFT |
296 GEN6_VFCOMPONENT_STORE_0 << VE1_VFCOMPONENT_3_SHIFT);
297
298 /* x,y */
299 OUT_BATCH(0 << VE0_VERTEX_BUFFER_INDEX_SHIFT | VE0_VALID |
300 GEN6_SURFACEFORMAT_R16G16_SSCALED << VE0_FORMAT_SHIFT |
301 0 << VE0_OFFSET_SHIFT); /* offsets vb in bytes */
302 OUT_BATCH(GEN6_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT |
303 GEN6_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT |
304 GEN6_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_2_SHIFT |
305 GEN6_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT);
306
307 /* u0, v0 */
308 OUT_BATCH(0 << VE0_VERTEX_BUFFER_INDEX_SHIFT | VE0_VALID |
309 GEN6_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT |
310 4 << VE0_OFFSET_SHIFT); /* offset vb in bytes */
311 OUT_BATCH(GEN6_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT |
312 GEN6_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT |
313 GEN6_VFCOMPONENT_STORE_0 << VE1_VFCOMPONENT_2_SHIFT |
314 GEN6_VFCOMPONENT_STORE_0 << VE1_VFCOMPONENT_3_SHIFT);
315}
316
317static uint32_t
318gen6_create_cc_viewport(struct intel_batchbuffer *batch)
319{
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300320 struct gen6_cc_viewport vp;
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300321
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300322 memset(&vp, 0, sizeof(vp));
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300323
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300324 vp.min_depth = -1.e35;
325 vp.max_depth = 1.e35;
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300326
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300327 return OUT_STATE_STRUCT(vp, 32);
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300328}
329
330static uint32_t
331gen6_create_cc_blend(struct intel_batchbuffer *batch)
332{
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300333 struct gen6_blend_state blend;
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300334
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300335 memset(&blend, 0, sizeof(blend));
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300336
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300337 blend.blend0.dest_blend_factor = GEN6_BLENDFACTOR_ZERO;
338 blend.blend0.source_blend_factor = GEN6_BLENDFACTOR_ONE;
339 blend.blend0.blend_func = GEN6_BLENDFUNCTION_ADD;
340 blend.blend0.blend_enable = 1;
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300341
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300342 blend.blend1.post_blend_clamp_enable = 1;
343 blend.blend1.pre_blend_clamp_enable = 1;
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300344
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300345 return OUT_STATE_STRUCT(blend, 64);
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300346}
347
348static uint32_t
349gen6_create_kernel(struct intel_batchbuffer *batch)
350{
351 return intel_batch_state_copy(batch, ps_kernel_nomask_affine,
352 sizeof(ps_kernel_nomask_affine),
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300353 64, "ps_kernel");
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300354}
355
356static uint32_t
357gen6_create_sampler(struct intel_batchbuffer *batch,
358 sampler_filter_t filter,
359 sampler_extend_t extend)
360{
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300361 struct gen6_sampler_state ss;
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300362
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300363 memset(&ss, 0, sizeof(ss));
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300364
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300365 ss.ss0.lod_preclamp = 1; /* GL mode */
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300366
367 /* We use the legacy mode to get the semantics specified by
368 * the Render extension. */
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300369 ss.ss0.border_color_mode = GEN6_BORDER_COLOR_MODE_LEGACY;
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300370
371 switch (filter) {
372 default:
373 case SAMPLER_FILTER_NEAREST:
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300374 ss.ss0.min_filter = GEN6_MAPFILTER_NEAREST;
375 ss.ss0.mag_filter = GEN6_MAPFILTER_NEAREST;
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300376 break;
377 case SAMPLER_FILTER_BILINEAR:
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300378 ss.ss0.min_filter = GEN6_MAPFILTER_LINEAR;
379 ss.ss0.mag_filter = GEN6_MAPFILTER_LINEAR;
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300380 break;
381 }
382
383 switch (extend) {
384 default:
385 case SAMPLER_EXTEND_NONE:
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300386 ss.ss1.r_wrap_mode = GEN6_TEXCOORDMODE_CLAMP_BORDER;
387 ss.ss1.s_wrap_mode = GEN6_TEXCOORDMODE_CLAMP_BORDER;
388 ss.ss1.t_wrap_mode = GEN6_TEXCOORDMODE_CLAMP_BORDER;
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300389 break;
390 case SAMPLER_EXTEND_REPEAT:
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300391 ss.ss1.r_wrap_mode = GEN6_TEXCOORDMODE_WRAP;
392 ss.ss1.s_wrap_mode = GEN6_TEXCOORDMODE_WRAP;
393 ss.ss1.t_wrap_mode = GEN6_TEXCOORDMODE_WRAP;
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300394 break;
395 case SAMPLER_EXTEND_PAD:
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300396 ss.ss1.r_wrap_mode = GEN6_TEXCOORDMODE_CLAMP;
397 ss.ss1.s_wrap_mode = GEN6_TEXCOORDMODE_CLAMP;
398 ss.ss1.t_wrap_mode = GEN6_TEXCOORDMODE_CLAMP;
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300399 break;
400 case SAMPLER_EXTEND_REFLECT:
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300401 ss.ss1.r_wrap_mode = GEN6_TEXCOORDMODE_MIRROR;
402 ss.ss1.s_wrap_mode = GEN6_TEXCOORDMODE_MIRROR;
403 ss.ss1.t_wrap_mode = GEN6_TEXCOORDMODE_MIRROR;
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300404 break;
405 }
406
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300407 return OUT_STATE_STRUCT(ss, 32);
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300408}
409
410static uint32_t
411gen6_create_vertex_buffer(struct intel_batchbuffer *batch)
412{
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300413 uint16_t v[2];
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300414
415 v[0] = 0;
416 v[1] = 0;
417
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300418 return intel_batch_state_copy(batch, v, sizeof(v), 8, "vertex buffer");
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300419}
420
421static void gen6_emit_vertex_buffer(struct intel_batchbuffer *batch)
422{
423 uint32_t offset;
424
425 offset = gen6_create_vertex_buffer(batch);
426
427 OUT_BATCH(GEN6_3DSTATE_VERTEX_BUFFERS | 3);
428 OUT_BATCH(VB0_VERTEXDATA |
429 0 << VB0_BUFFER_INDEX_SHIFT |
430 VB0_NULL_VERTEX_BUFFER |
431 0 << VB0_BUFFER_PITCH_SHIFT);
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300432 OUT_RELOC_STATE(batch, I915_GEM_DOMAIN_VERTEX, 0, offset);
433 OUT_RELOC_STATE(batch, I915_GEM_DOMAIN_VERTEX, 0, offset);
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300434 OUT_BATCH(0);
435}
436
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300437void gen6_setup_null_render_state(struct intel_batchbuffer *batch)
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300438{
439 uint32_t wm_state, wm_kernel, wm_table;
Mika Kuoppala4a604de2014-08-01 21:19:56 +0300440 uint32_t cc_vp, cc_blend;
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300441
442 wm_table = gen6_bind_surfaces(batch);
443 wm_kernel = gen6_create_kernel(batch);
444 wm_state = gen6_create_sampler(batch,
445 SAMPLER_FILTER_NEAREST,
446 SAMPLER_EXTEND_NONE);
447
448 cc_vp = gen6_create_cc_viewport(batch);
449 cc_blend = gen6_create_cc_blend(batch);
450
451 gen6_emit_invariant(batch);
452 gen6_emit_state_base_address(batch);
453
454 gen6_emit_sip(batch);
455 gen6_emit_urb(batch);
456
457 gen6_emit_viewports(batch, cc_vp);
458 gen6_emit_vs(batch);
459 gen6_emit_gs(batch);
460 gen6_emit_clip(batch);
461 gen6_emit_wm_constants(batch);
462 gen6_emit_null_depth_buffer(batch);
463
464 gen6_emit_drawing_rectangle(batch);
465 gen6_emit_cc(batch, cc_blend);
466 gen6_emit_sampler(batch, wm_state);
467 gen6_emit_sf(batch);
468 gen6_emit_wm(batch, wm_kernel);
469 gen6_emit_vertex_elements(batch);
470 gen6_emit_binding_table(batch, wm_table);
471
472 gen6_emit_vertex_buffer(batch);
473
474 OUT_BATCH(MI_BATCH_BUFFER_END);
Mika Kuoppalad60d4c82014-04-10 15:15:13 +0300475}