• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Mesa 3-D graphics library
3  *
4  * Copyright (C) 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 ILO_BUILDER_3D_BOTTOM_H
29 #define ILO_BUILDER_3D_BOTTOM_H
30 
31 #include "genhw/genhw.h"
32 #include "intel_winsys.h"
33 
34 #include "ilo_core.h"
35 #include "ilo_dev.h"
36 #include "ilo_state_cc.h"
37 #include "ilo_state_raster.h"
38 #include "ilo_state_sbe.h"
39 #include "ilo_state_shader.h"
40 #include "ilo_state_viewport.h"
41 #include "ilo_state_zs.h"
42 #include "ilo_vma.h"
43 #include "ilo_builder.h"
44 #include "ilo_builder_3d_top.h"
45 
46 static inline void
gen6_3DSTATE_CLIP(struct ilo_builder * builder,const struct ilo_state_raster * rs)47 gen6_3DSTATE_CLIP(struct ilo_builder *builder,
48                   const struct ilo_state_raster *rs)
49 {
50    const uint8_t cmd_len = 4;
51    uint32_t *dw;
52 
53    ILO_DEV_ASSERT(builder->dev, 6, 8);
54 
55    ilo_builder_batch_pointer(builder, cmd_len, &dw);
56 
57    dw[0] = GEN6_RENDER_CMD(3D, 3DSTATE_CLIP) | (cmd_len - 2);
58    /* see raster_set_gen6_3DSTATE_CLIP() */
59    dw[1] = rs->clip[0];
60    dw[2] = rs->clip[1];
61    dw[3] = rs->clip[2];
62 }
63 
64 static inline void
gen6_3DSTATE_SF(struct ilo_builder * builder,const struct ilo_state_raster * rs,const struct ilo_state_sbe * sbe)65 gen6_3DSTATE_SF(struct ilo_builder *builder,
66                 const struct ilo_state_raster *rs,
67                 const struct ilo_state_sbe *sbe)
68 {
69    const uint8_t cmd_len = 20;
70    uint32_t *dw;
71 
72    ILO_DEV_ASSERT(builder->dev, 6, 6);
73 
74    ilo_builder_batch_pointer(builder, cmd_len, &dw);
75 
76    dw[0] = GEN6_RENDER_CMD(3D, 3DSTATE_SF) | (cmd_len - 2);
77    /* see sbe_set_gen8_3DSTATE_SBE() */
78    dw[1] = sbe->sbe[0];
79 
80    /* see raster_set_gen7_3DSTATE_SF() */
81    dw[2] = rs->sf[0];
82    dw[3] = rs->sf[1];
83    dw[4] = rs->sf[2];
84    dw[5] = rs->raster[1];
85    dw[6] = rs->raster[2];
86    dw[7] = rs->raster[3];
87 
88    /* see sbe_set_gen8_3DSTATE_SBE_SWIZ() */
89    memcpy(&dw[8], sbe->swiz, sizeof(*dw) * 8);
90 
91    dw[16] = sbe->sbe[1];
92    dw[17] = sbe->sbe[2];
93    /* WrapShortest enables */
94    dw[18] = 0;
95    dw[19] = 0;
96 }
97 
98 static inline void
gen7_3DSTATE_SF(struct ilo_builder * builder,const struct ilo_state_raster * rs)99 gen7_3DSTATE_SF(struct ilo_builder *builder,
100                 const struct ilo_state_raster *rs)
101 {
102    const uint8_t cmd_len = (ilo_dev_gen(builder->dev) >= ILO_GEN(8)) ? 4 : 7;
103    uint32_t *dw;
104 
105    ILO_DEV_ASSERT(builder->dev, 7, 8);
106 
107    ilo_builder_batch_pointer(builder, cmd_len, &dw);
108 
109    dw[0] = GEN6_RENDER_CMD(3D, 3DSTATE_SF) | (cmd_len - 2);
110 
111    /* see raster_set_gen7_3DSTATE_SF() or raster_set_gen8_3DSTATE_SF() */
112    dw[1] = rs->sf[0];
113    dw[2] = rs->sf[1];
114    dw[3] = rs->sf[2];
115    if (ilo_dev_gen(builder->dev) < ILO_GEN(8)) {
116       dw[4] = rs->raster[1];
117       dw[5] = rs->raster[2];
118       dw[6] = rs->raster[3];
119    }
120 }
121 
122 static inline void
gen7_3DSTATE_SBE(struct ilo_builder * builder,const struct ilo_state_sbe * sbe)123 gen7_3DSTATE_SBE(struct ilo_builder *builder,
124                  const struct ilo_state_sbe *sbe)
125 {
126    const uint8_t cmd_len = 14;
127    uint32_t *dw;
128 
129    ILO_DEV_ASSERT(builder->dev, 7, 7.5);
130 
131    ilo_builder_batch_pointer(builder, cmd_len, &dw);
132 
133    dw[0] = GEN7_RENDER_CMD(3D, 3DSTATE_SBE) | (cmd_len - 2);
134    /* see sbe_set_gen8_3DSTATE_SBE() and sbe_set_gen8_3DSTATE_SBE_SWIZ() */
135    dw[1] = sbe->sbe[0];
136    memcpy(&dw[2], sbe->swiz, sizeof(*dw) * 8);
137    dw[10] = sbe->sbe[1];
138    dw[11] = sbe->sbe[2];
139 
140    /* WrapShortest enables */
141    dw[12] = 0;
142    dw[13] = 0;
143 }
144 
145 static inline void
gen8_3DSTATE_SBE(struct ilo_builder * builder,const struct ilo_state_sbe * sbe)146 gen8_3DSTATE_SBE(struct ilo_builder *builder,
147                  const struct ilo_state_sbe *sbe)
148 {
149    const uint8_t cmd_len = 4;
150    uint32_t *dw;
151 
152    ILO_DEV_ASSERT(builder->dev, 8, 8);
153 
154    ilo_builder_batch_pointer(builder, cmd_len, &dw);
155 
156    /* see sbe_set_gen8_3DSTATE_SBE() */
157    dw[0] = GEN7_RENDER_CMD(3D, 3DSTATE_SBE) | (cmd_len - 2);
158    dw[1] = sbe->sbe[0];
159    dw[2] = sbe->sbe[1];
160    dw[3] = sbe->sbe[2];
161 }
162 
163 static inline void
gen8_3DSTATE_SBE_SWIZ(struct ilo_builder * builder,const struct ilo_state_sbe * sbe)164 gen8_3DSTATE_SBE_SWIZ(struct ilo_builder *builder,
165                       const struct ilo_state_sbe *sbe)
166 {
167    const uint8_t cmd_len = 11;
168    uint32_t *dw;
169 
170    ILO_DEV_ASSERT(builder->dev, 8, 8);
171 
172    ilo_builder_batch_pointer(builder, cmd_len, &dw);
173 
174    dw[0] = GEN8_RENDER_CMD(3D, 3DSTATE_SBE_SWIZ) | (cmd_len - 2);
175    /* see sbe_set_gen8_3DSTATE_SBE_SWIZ() */
176    memcpy(&dw[1], sbe->swiz, sizeof(*dw) * 8);
177    /* WrapShortest enables */
178    dw[9] = 0;
179    dw[10] = 0;
180 }
181 
182 static inline void
gen8_3DSTATE_RASTER(struct ilo_builder * builder,const struct ilo_state_raster * rs)183 gen8_3DSTATE_RASTER(struct ilo_builder *builder,
184                     const struct ilo_state_raster *rs)
185 {
186    const uint8_t cmd_len = 5;
187    uint32_t *dw;
188 
189    ILO_DEV_ASSERT(builder->dev, 8, 8);
190 
191    ilo_builder_batch_pointer(builder, cmd_len, &dw);
192 
193    dw[0] = GEN8_RENDER_CMD(3D, 3DSTATE_RASTER) | (cmd_len - 2);
194    /* see raster_set_gen8_3DSTATE_RASTER() */
195    dw[1] = rs->raster[0];
196    dw[2] = rs->raster[1];
197    dw[3] = rs->raster[2];
198    dw[4] = rs->raster[3];
199 }
200 
201 static inline void
gen6_3DSTATE_WM(struct ilo_builder * builder,const struct ilo_state_raster * rs,const struct ilo_state_ps * ps,uint32_t kernel_offset,struct intel_bo * scratch_bo)202 gen6_3DSTATE_WM(struct ilo_builder *builder,
203                 const struct ilo_state_raster *rs,
204                 const struct ilo_state_ps *ps,
205                 uint32_t kernel_offset,
206                 struct intel_bo *scratch_bo)
207 {
208    const uint8_t cmd_len = 9;
209    uint32_t *dw;
210    unsigned pos;
211 
212    ILO_DEV_ASSERT(builder->dev, 6, 6);
213 
214    pos = ilo_builder_batch_pointer(builder, cmd_len, &dw);
215 
216    dw[0] = GEN6_RENDER_CMD(3D, 3DSTATE_WM) | (cmd_len - 2);
217    dw[1] = kernel_offset;
218    /* see raster_set_gen6_3dstate_wm() and ps_set_gen6_3dstate_wm() */
219    dw[2] = ps->ps[0];
220    dw[3] = ps->ps[1];
221    dw[4] = rs->wm[0] | ps->ps[2];
222    dw[5] = rs->wm[1] | ps->ps[3];
223    dw[6] = rs->wm[2] | ps->ps[4];
224    dw[7] = 0; /* kernel 1 */
225    dw[8] = 0; /* kernel 2 */
226 
227    if (ilo_state_ps_get_scratch_size(ps)) {
228       ilo_builder_batch_reloc(builder, pos + 2, scratch_bo,
229             ps->ps[0], 0);
230    }
231 }
232 
233 static inline void
gen7_3DSTATE_WM(struct ilo_builder * builder,const struct ilo_state_raster * rs,const struct ilo_state_ps * ps)234 gen7_3DSTATE_WM(struct ilo_builder *builder,
235                 const struct ilo_state_raster *rs,
236                 const struct ilo_state_ps *ps)
237 {
238    const uint8_t cmd_len = 3;
239    uint32_t *dw;
240 
241    ILO_DEV_ASSERT(builder->dev, 7, 7.5);
242 
243    ilo_builder_batch_pointer(builder, cmd_len, &dw);
244 
245    dw[0] = GEN6_RENDER_CMD(3D, 3DSTATE_WM) | (cmd_len - 2);
246    /* see raster_set_gen8_3DSTATE_WM() and ps_set_gen7_3dstate_wm() */
247    dw[1] = rs->wm[0] | ps->ps[0];
248    dw[2] = ps->ps[1];
249 }
250 
251 static inline void
gen8_3DSTATE_WM(struct ilo_builder * builder,const struct ilo_state_raster * rs)252 gen8_3DSTATE_WM(struct ilo_builder *builder,
253                 const struct ilo_state_raster *rs)
254 {
255    const uint8_t cmd_len = 2;
256    uint32_t *dw;
257 
258    ILO_DEV_ASSERT(builder->dev, 8, 8);
259 
260    ilo_builder_batch_pointer(builder, cmd_len, &dw);
261 
262    dw[0] = GEN6_RENDER_CMD(3D, 3DSTATE_WM) | (cmd_len - 2);
263    /* see raster_set_gen8_3DSTATE_WM() */
264    dw[1] = rs->wm[0];
265 }
266 
267 static inline void
gen8_3DSTATE_WM_DEPTH_STENCIL(struct ilo_builder * builder,const struct ilo_state_cc * cc)268 gen8_3DSTATE_WM_DEPTH_STENCIL(struct ilo_builder *builder,
269                               const struct ilo_state_cc *cc)
270 {
271    const uint8_t cmd_len = 3;
272    uint32_t *dw;
273 
274    ILO_DEV_ASSERT(builder->dev, 8, 8);
275 
276    ilo_builder_batch_pointer(builder, cmd_len, &dw);
277 
278    dw[0] = GEN8_RENDER_CMD(3D, 3DSTATE_WM_DEPTH_STENCIL) | (cmd_len - 2);
279    /* see cc_set_gen8_3DSTATE_WM_DEPTH_STENCIL() */
280    dw[1] = cc->ds[0];
281    dw[2] = cc->ds[1];
282 }
283 
284 static inline void
gen8_3DSTATE_WM_HZ_OP(struct ilo_builder * builder,const struct ilo_state_raster * rs,uint16_t width,uint16_t height)285 gen8_3DSTATE_WM_HZ_OP(struct ilo_builder *builder,
286                       const struct ilo_state_raster *rs,
287                       uint16_t width, uint16_t height)
288 {
289    const uint8_t cmd_len = 5;
290    uint32_t *dw;
291 
292    ILO_DEV_ASSERT(builder->dev, 8, 8);
293 
294    ilo_builder_batch_pointer(builder, cmd_len, &dw);
295 
296    dw[0] = GEN8_RENDER_CMD(3D, 3DSTATE_WM_HZ_OP) | (cmd_len - 2);
297    /* see raster_set_gen8_3dstate_wm_hz_op() */
298    dw[1] = rs->wm[1];
299    dw[2] = 0;
300    /* exclusive */
301    dw[3] = height << 16 | width;
302    dw[4] = rs->wm[2];
303 }
304 
305 static inline void
gen8_disable_3DSTATE_WM_HZ_OP(struct ilo_builder * builder)306 gen8_disable_3DSTATE_WM_HZ_OP(struct ilo_builder *builder)
307 {
308    const uint8_t cmd_len = 5;
309    uint32_t *dw;
310 
311    ILO_DEV_ASSERT(builder->dev, 8, 8);
312 
313    ilo_builder_batch_pointer(builder, cmd_len, &dw);
314 
315    dw[0] = GEN8_RENDER_CMD(3D, 3DSTATE_WM_HZ_OP) | (cmd_len - 2);
316    dw[1] = 0;
317    dw[2] = 0;
318    dw[3] = 0;
319    dw[4] = 0;
320 }
321 
322 static inline void
gen8_3DSTATE_WM_CHROMAKEY(struct ilo_builder * builder)323 gen8_3DSTATE_WM_CHROMAKEY(struct ilo_builder *builder)
324 {
325    const uint8_t cmd_len = 2;
326    uint32_t *dw;
327 
328    ILO_DEV_ASSERT(builder->dev, 8, 8);
329 
330    ilo_builder_batch_pointer(builder, cmd_len, &dw);
331 
332    dw[0] = GEN8_RENDER_CMD(3D, 3DSTATE_WM_CHROMAKEY) | (cmd_len - 2);
333    dw[1] = 0;
334 }
335 
336 static inline void
gen7_3DSTATE_PS(struct ilo_builder * builder,const struct ilo_state_ps * ps,uint32_t kernel_offset,struct intel_bo * scratch_bo)337 gen7_3DSTATE_PS(struct ilo_builder *builder,
338                 const struct ilo_state_ps *ps,
339                 uint32_t kernel_offset,
340                 struct intel_bo *scratch_bo)
341 {
342    const uint8_t cmd_len = 8;
343    uint32_t *dw;
344    unsigned pos;
345 
346    ILO_DEV_ASSERT(builder->dev, 7, 7.5);
347 
348    pos = ilo_builder_batch_pointer(builder, cmd_len, &dw);
349 
350    dw[0] = GEN7_RENDER_CMD(3D, 3DSTATE_PS) | (cmd_len - 2);
351    dw[1] = kernel_offset;
352    /* see ps_set_gen7_3DSTATE_PS() */
353    dw[2] = ps->ps[2];
354    dw[3] = ps->ps[3];
355    dw[4] = ps->ps[4];
356    dw[5] = ps->ps[5];
357    dw[6] = 0; /* kernel 1 */
358    dw[7] = 0; /* kernel 2 */
359 
360    if (ilo_state_ps_get_scratch_size(ps)) {
361       ilo_builder_batch_reloc(builder, pos + 3, scratch_bo,
362             ps->ps[3], 0);
363    }
364 }
365 
366 static inline void
gen8_3DSTATE_PS(struct ilo_builder * builder,const struct ilo_state_ps * ps,uint32_t kernel_offset,struct intel_bo * scratch_bo)367 gen8_3DSTATE_PS(struct ilo_builder *builder,
368                 const struct ilo_state_ps *ps,
369                 uint32_t kernel_offset,
370                 struct intel_bo *scratch_bo)
371 {
372    const uint8_t cmd_len = 12;
373    uint32_t *dw;
374    unsigned pos;
375 
376    ILO_DEV_ASSERT(builder->dev, 8, 8);
377 
378    pos = ilo_builder_batch_pointer(builder, cmd_len, &dw);
379 
380    dw[0] = GEN7_RENDER_CMD(3D, 3DSTATE_PS) | (cmd_len - 2);
381    dw[1] = kernel_offset;
382    dw[2] = 0;
383    /* see ps_set_gen8_3DSTATE_PS() */
384    dw[3] = ps->ps[0];
385    dw[4] = ps->ps[1];
386    dw[5] = 0;
387    dw[6] = ps->ps[2];
388    dw[7] = ps->ps[3];
389    dw[8] = 0; /* kernel 1 */
390    dw[9] = 0;
391    dw[10] = 0; /* kernel 2 */
392    dw[11] = 0;
393 
394    if (ilo_state_ps_get_scratch_size(ps)) {
395       ilo_builder_batch_reloc64(builder, pos + 4, scratch_bo,
396             ps->ps[1], 0);
397    }
398 }
399 
400 static inline void
gen8_3DSTATE_PS_EXTRA(struct ilo_builder * builder,const struct ilo_state_ps * ps)401 gen8_3DSTATE_PS_EXTRA(struct ilo_builder *builder,
402                       const struct ilo_state_ps *ps)
403 {
404    const uint8_t cmd_len = 2;
405    uint32_t *dw;
406 
407    ILO_DEV_ASSERT(builder->dev, 8, 8);
408 
409    ilo_builder_batch_pointer(builder, cmd_len, &dw);
410 
411    dw[0] = GEN8_RENDER_CMD(3D, 3DSTATE_PS_EXTRA) | (cmd_len - 2);
412    /* see ps_set_gen8_3DSTATE_PS_EXTRA() */
413    dw[1] = ps->ps[4];
414 }
415 
416 static inline void
gen8_3DSTATE_PS_BLEND(struct ilo_builder * builder,const struct ilo_state_cc * cc)417 gen8_3DSTATE_PS_BLEND(struct ilo_builder *builder,
418                       const struct ilo_state_cc *cc)
419 {
420    const uint8_t cmd_len = 2;
421    uint32_t *dw;
422 
423    ILO_DEV_ASSERT(builder->dev, 8, 8);
424 
425    ilo_builder_batch_pointer(builder, cmd_len, &dw);
426 
427    dw[0] = GEN8_RENDER_CMD(3D, 3DSTATE_PS_BLEND) | (cmd_len - 2);
428    /* see cc_set_gen8_3DSTATE_PS_BLEND() */
429    dw[1] = cc->blend[0];
430 }
431 
432 static inline void
gen6_3DSTATE_CONSTANT_PS(struct ilo_builder * builder,const uint32_t * bufs,const int * sizes,int num_bufs)433 gen6_3DSTATE_CONSTANT_PS(struct ilo_builder *builder,
434                          const uint32_t *bufs, const int *sizes,
435                          int num_bufs)
436 {
437    gen6_3dstate_constant(builder, GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_PS,
438          bufs, sizes, num_bufs);
439 }
440 
441 static inline void
gen7_3DSTATE_CONSTANT_PS(struct ilo_builder * builder,const uint32_t * bufs,const int * sizes,int num_bufs)442 gen7_3DSTATE_CONSTANT_PS(struct ilo_builder *builder,
443                          const uint32_t *bufs, const int *sizes,
444                          int num_bufs)
445 {
446    gen7_3dstate_constant(builder, GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_PS,
447          bufs, sizes, num_bufs);
448 }
449 
450 static inline void
gen7_3DSTATE_BINDING_TABLE_POINTERS_PS(struct ilo_builder * builder,uint32_t binding_table)451 gen7_3DSTATE_BINDING_TABLE_POINTERS_PS(struct ilo_builder *builder,
452                                        uint32_t binding_table)
453 {
454    ILO_DEV_ASSERT(builder->dev, 7, 8);
455 
456    gen7_3dstate_pointer(builder,
457          GEN7_RENDER_OPCODE_3DSTATE_BINDING_TABLE_POINTERS_PS,
458          binding_table);
459 }
460 
461 static inline void
gen7_3DSTATE_SAMPLER_STATE_POINTERS_PS(struct ilo_builder * builder,uint32_t sampler_state)462 gen7_3DSTATE_SAMPLER_STATE_POINTERS_PS(struct ilo_builder *builder,
463                                        uint32_t sampler_state)
464 {
465    ILO_DEV_ASSERT(builder->dev, 7, 8);
466 
467    gen7_3dstate_pointer(builder,
468          GEN7_RENDER_OPCODE_3DSTATE_SAMPLER_STATE_POINTERS_PS,
469          sampler_state);
470 }
471 
472 static inline void
gen6_3DSTATE_MULTISAMPLE(struct ilo_builder * builder,const struct ilo_state_raster * rs,const struct ilo_state_sample_pattern * pattern,uint8_t sample_count)473 gen6_3DSTATE_MULTISAMPLE(struct ilo_builder *builder,
474                          const struct ilo_state_raster *rs,
475                          const struct ilo_state_sample_pattern *pattern,
476                          uint8_t sample_count)
477 {
478    const uint8_t cmd_len = (ilo_dev_gen(builder->dev) >= ILO_GEN(7)) ? 4 : 3;
479    const uint32_t *packed = (const uint32_t *)
480       ilo_state_sample_pattern_get_packed_offsets(pattern,
481             builder->dev, sample_count);
482    uint32_t *dw;
483 
484    ILO_DEV_ASSERT(builder->dev, 6, 7.5);
485 
486    ilo_builder_batch_pointer(builder, cmd_len, &dw);
487 
488    dw[0] = GEN6_RENDER_CMD(3D, 3DSTATE_MULTISAMPLE) | (cmd_len - 2);
489    /* see raster_set_gen8_3DSTATE_MULTISAMPLE() */
490    dw[1] = rs->sample[0];
491 
492    /* see sample_pattern_set_gen8_3DSTATE_SAMPLE_PATTERN() */
493    dw[2] = (sample_count >= 4) ? packed[0] : 0;
494    if (ilo_dev_gen(builder->dev) >= ILO_GEN(7))
495       dw[3] = (sample_count >= 8) ? packed[1] : 0;
496 }
497 
498 static inline void
gen8_3DSTATE_MULTISAMPLE(struct ilo_builder * builder,const struct ilo_state_raster * rs)499 gen8_3DSTATE_MULTISAMPLE(struct ilo_builder *builder,
500                          const struct ilo_state_raster *rs)
501 {
502    const uint8_t cmd_len = 2;
503    uint32_t *dw;
504 
505    ILO_DEV_ASSERT(builder->dev, 8, 8);
506 
507    ilo_builder_batch_pointer(builder, cmd_len, &dw);
508 
509    dw[0] = GEN8_RENDER_CMD(3D, 3DSTATE_MULTISAMPLE) | (cmd_len - 2);
510    /* see raster_set_gen8_3DSTATE_MULTISAMPLE() */
511    dw[1] = rs->sample[0];
512 }
513 
514 static inline void
gen8_3DSTATE_SAMPLE_PATTERN(struct ilo_builder * builder,const struct ilo_state_sample_pattern * pattern)515 gen8_3DSTATE_SAMPLE_PATTERN(struct ilo_builder *builder,
516                             const struct ilo_state_sample_pattern *pattern)
517 {
518    const uint8_t cmd_len = 9;
519    uint32_t *dw;
520 
521    ILO_DEV_ASSERT(builder->dev, 8, 8);
522 
523    ilo_builder_batch_pointer(builder, cmd_len, &dw);
524 
525    dw[0] = GEN8_RENDER_CMD(3D, 3DSTATE_SAMPLE_PATTERN) | (cmd_len - 2);
526    dw[1] = 0;
527    dw[2] = 0;
528    dw[3] = 0;
529    dw[4] = 0;
530    /* see sample_pattern_set_gen8_3DSTATE_SAMPLE_PATTERN() */
531    dw[5] = ((const uint32_t *) pattern->pattern_8x)[1];
532    dw[6] = ((const uint32_t *) pattern->pattern_8x)[0];
533    dw[7] = ((const uint32_t *) pattern->pattern_4x)[0];
534    dw[8] = pattern->pattern_1x[0] << 16 |
535            ((const uint16_t *) pattern->pattern_2x)[0];
536 }
537 
538 static inline void
gen6_3DSTATE_SAMPLE_MASK(struct ilo_builder * builder,const struct ilo_state_raster * rs)539 gen6_3DSTATE_SAMPLE_MASK(struct ilo_builder *builder,
540                          const struct ilo_state_raster *rs)
541 {
542    const uint8_t cmd_len = 2;
543    uint32_t *dw;
544 
545    ILO_DEV_ASSERT(builder->dev, 6, 8);
546 
547    ilo_builder_batch_pointer(builder, cmd_len, &dw);
548 
549    dw[0] = GEN6_RENDER_CMD(3D, 3DSTATE_SAMPLE_MASK) | (cmd_len - 2);
550    /* see raster_set_gen6_3DSTATE_SAMPLE_MASK() */
551    dw[1] = rs->sample[1];
552 }
553 
554 static inline void
gen6_3DSTATE_DRAWING_RECTANGLE(struct ilo_builder * builder,unsigned x,unsigned y,unsigned width,unsigned height)555 gen6_3DSTATE_DRAWING_RECTANGLE(struct ilo_builder *builder,
556                                unsigned x, unsigned y,
557                                unsigned width, unsigned height)
558 {
559    const uint8_t cmd_len = 4;
560    unsigned xmax = x + width - 1;
561    unsigned ymax = y + height - 1;
562    unsigned rect_limit;
563    uint32_t *dw;
564 
565    ILO_DEV_ASSERT(builder->dev, 6, 8);
566 
567    if (ilo_dev_gen(builder->dev) >= ILO_GEN(7)) {
568       rect_limit = 16383;
569    }
570    else {
571       /*
572        * From the Sandy Bridge PRM, volume 2 part 1, page 230:
573        *
574        *     "[DevSNB] Errata: This field (Clipped Drawing Rectangle Y Min)
575        *      must be an even number"
576        */
577       assert(y % 2 == 0);
578 
579       rect_limit = 8191;
580    }
581 
582    if (x > rect_limit) x = rect_limit;
583    if (y > rect_limit) y = rect_limit;
584    if (xmax > rect_limit) xmax = rect_limit;
585    if (ymax > rect_limit) ymax = rect_limit;
586 
587    ilo_builder_batch_pointer(builder, cmd_len, &dw);
588 
589    dw[0] = GEN6_RENDER_CMD(3D, 3DSTATE_DRAWING_RECTANGLE) | (cmd_len - 2);
590    dw[1] = y << 16 | x;
591    dw[2] = ymax << 16 | xmax;
592    /*
593     * There is no need to set the origin.  It is intended to support front
594     * buffer rendering.
595     */
596    dw[3] = 0;
597 }
598 
599 static inline void
gen6_3DSTATE_POLY_STIPPLE_OFFSET(struct ilo_builder * builder,const struct ilo_state_poly_stipple * stipple)600 gen6_3DSTATE_POLY_STIPPLE_OFFSET(struct ilo_builder *builder,
601                                  const struct ilo_state_poly_stipple *stipple)
602 {
603    const uint8_t cmd_len = 2;
604    uint32_t *dw;
605 
606    ILO_DEV_ASSERT(builder->dev, 6, 8);
607 
608    ilo_builder_batch_pointer(builder, cmd_len, &dw);
609 
610    dw[0] = GEN6_RENDER_CMD(3D, 3DSTATE_POLY_STIPPLE_OFFSET) | (cmd_len - 2);
611    /* constant */
612    dw[1] = 0;
613 }
614 
615 static inline void
gen6_3DSTATE_POLY_STIPPLE_PATTERN(struct ilo_builder * builder,const struct ilo_state_poly_stipple * stipple)616 gen6_3DSTATE_POLY_STIPPLE_PATTERN(struct ilo_builder *builder,
617                                   const struct ilo_state_poly_stipple *stipple)
618 {
619    const uint8_t cmd_len = 33;
620    uint32_t *dw;
621 
622    ILO_DEV_ASSERT(builder->dev, 6, 8);
623 
624    ilo_builder_batch_pointer(builder, cmd_len, &dw);
625 
626    dw[0] = GEN6_RENDER_CMD(3D, 3DSTATE_POLY_STIPPLE_PATTERN) | (cmd_len - 2);
627    /* see poly_stipple_set_gen6_3DSTATE_POLY_STIPPLE_PATTERN() */
628    memcpy(&dw[1], stipple->stipple, sizeof(stipple->stipple));
629 }
630 
631 static inline void
gen6_3DSTATE_LINE_STIPPLE(struct ilo_builder * builder,const struct ilo_state_line_stipple * stipple)632 gen6_3DSTATE_LINE_STIPPLE(struct ilo_builder *builder,
633                           const struct ilo_state_line_stipple *stipple)
634 {
635    const uint8_t cmd_len = 3;
636    uint32_t *dw;
637 
638    ILO_DEV_ASSERT(builder->dev, 6, 8);
639 
640    ilo_builder_batch_pointer(builder, cmd_len, &dw);
641 
642    dw[0] = GEN6_RENDER_CMD(3D, 3DSTATE_LINE_STIPPLE) | (cmd_len - 2);
643    /* see line_stipple_set_gen6_3DSTATE_LINE_STIPPLE() */
644    dw[1] = stipple->stipple[0];
645    dw[2] = stipple->stipple[1];
646 }
647 
648 static inline void
gen6_3DSTATE_AA_LINE_PARAMETERS(struct ilo_builder * builder,const struct ilo_state_raster * rs)649 gen6_3DSTATE_AA_LINE_PARAMETERS(struct ilo_builder *builder,
650                                 const struct ilo_state_raster *rs)
651 {
652    const uint8_t cmd_len = 3;
653    uint32_t *dw;
654 
655    ILO_DEV_ASSERT(builder->dev, 6, 8);
656 
657    ilo_builder_batch_pointer(builder, cmd_len, &dw);
658 
659    dw[0] = GEN6_RENDER_CMD(3D, 3DSTATE_AA_LINE_PARAMETERS) | (cmd_len - 2);
660    /* constant */
661    dw[1] = 0 << GEN6_AA_LINE_DW1_BIAS__SHIFT |
662            0 << GEN6_AA_LINE_DW1_SLOPE__SHIFT;
663    dw[2] = 0 << GEN6_AA_LINE_DW2_CAP_BIAS__SHIFT |
664            0 << GEN6_AA_LINE_DW2_CAP_SLOPE__SHIFT;
665 }
666 
667 static inline void
gen6_3DSTATE_DEPTH_BUFFER(struct ilo_builder * builder,const struct ilo_state_zs * zs)668 gen6_3DSTATE_DEPTH_BUFFER(struct ilo_builder *builder,
669                           const struct ilo_state_zs *zs)
670 {
671    const uint32_t cmd = (ilo_dev_gen(builder->dev) >= ILO_GEN(7)) ?
672       GEN7_RENDER_CMD(3D, 3DSTATE_DEPTH_BUFFER) :
673       GEN6_RENDER_CMD(3D, 3DSTATE_DEPTH_BUFFER);
674    const uint8_t cmd_len = (ilo_dev_gen(builder->dev) >= ILO_GEN(8)) ? 8 : 7;
675    uint32_t *dw;
676    unsigned pos;
677 
678    ILO_DEV_ASSERT(builder->dev, 6, 8);
679 
680    pos = ilo_builder_batch_pointer(builder, cmd_len, &dw);
681 
682    dw[0] = cmd | (cmd_len - 2);
683 
684    /*
685     * see zs_set_gen6_3DSTATE_DEPTH_BUFFER() and
686     * zs_set_gen7_3DSTATE_DEPTH_BUFFER()
687     */
688    if (ilo_dev_gen(builder->dev) >= ILO_GEN(8)) {
689       dw[1] = zs->depth[0];
690       dw[2] = 0;
691       dw[3] = 0;
692       dw[4] = zs->depth[2];
693       dw[5] = zs->depth[3];
694       dw[6] = 0;
695       dw[7] = zs->depth[4];
696 
697       dw[5] |= builder->mocs << GEN8_DEPTH_DW5_MOCS__SHIFT;
698 
699       if (zs->z_vma) {
700          ilo_builder_batch_reloc64(builder, pos + 2, zs->z_vma->bo,
701                zs->z_vma->bo_offset + zs->depth[1],
702                (zs->z_readonly) ? 0 : INTEL_RELOC_WRITE);
703       }
704    } else {
705       dw[1] = zs->depth[0];
706       dw[2] = 0;
707       dw[3] = zs->depth[2];
708       dw[4] = zs->depth[3];
709       dw[5] = 0;
710       dw[6] = zs->depth[4];
711 
712       if (ilo_dev_gen(builder->dev) >= ILO_GEN(7))
713          dw[4] |= builder->mocs << GEN7_DEPTH_DW4_MOCS__SHIFT;
714       else
715          dw[6] |= builder->mocs << GEN6_DEPTH_DW6_MOCS__SHIFT;
716 
717       if (zs->z_vma) {
718          ilo_builder_batch_reloc(builder, pos + 2, zs->z_vma->bo,
719                zs->z_vma->bo_offset + zs->depth[1],
720                (zs->z_readonly) ? 0 : INTEL_RELOC_WRITE);
721       }
722    }
723 }
724 
725 static inline void
gen6_3DSTATE_STENCIL_BUFFER(struct ilo_builder * builder,const struct ilo_state_zs * zs)726 gen6_3DSTATE_STENCIL_BUFFER(struct ilo_builder *builder,
727                             const struct ilo_state_zs *zs)
728 {
729    const uint32_t cmd = (ilo_dev_gen(builder->dev) >= ILO_GEN(7)) ?
730       GEN7_RENDER_CMD(3D, 3DSTATE_STENCIL_BUFFER) :
731       GEN6_RENDER_CMD(3D, 3DSTATE_STENCIL_BUFFER);
732    const uint8_t cmd_len = (ilo_dev_gen(builder->dev) >= ILO_GEN(8)) ? 5 : 3;
733    uint32_t *dw;
734    unsigned pos;
735 
736    ILO_DEV_ASSERT(builder->dev, 6, 8);
737 
738    pos = ilo_builder_batch_pointer(builder, cmd_len, &dw);
739 
740    dw[0] = cmd | (cmd_len - 2);
741 
742    /* see zs_set_gen6_3DSTATE_STENCIL_BUFFER() */
743    if (ilo_dev_gen(builder->dev) >= ILO_GEN(8)) {
744       dw[1] = zs->stencil[0];
745       dw[2] = 0;
746       dw[3] = 0;
747       dw[4] = zs->stencil[2];
748 
749       dw[1] |= builder->mocs << GEN8_STENCIL_DW1_MOCS__SHIFT;
750 
751       if (zs->s_vma) {
752          ilo_builder_batch_reloc64(builder, pos + 2, zs->s_vma->bo,
753                zs->s_vma->bo_offset + zs->stencil[1],
754                (zs->s_readonly) ? 0 : INTEL_RELOC_WRITE);
755       }
756    } else {
757       dw[1] = zs->stencil[0];
758       dw[2] = 0;
759 
760       dw[1] |= builder->mocs << GEN6_STENCIL_DW1_MOCS__SHIFT;
761 
762       if (zs->s_vma) {
763          ilo_builder_batch_reloc(builder, pos + 2, zs->s_vma->bo,
764                zs->s_vma->bo_offset + zs->stencil[1],
765                (zs->s_readonly) ? 0 : INTEL_RELOC_WRITE);
766       }
767    }
768 }
769 
770 static inline void
gen6_3DSTATE_HIER_DEPTH_BUFFER(struct ilo_builder * builder,const struct ilo_state_zs * zs)771 gen6_3DSTATE_HIER_DEPTH_BUFFER(struct ilo_builder *builder,
772                                const struct ilo_state_zs *zs)
773 {
774    const uint32_t cmd = (ilo_dev_gen(builder->dev) >= ILO_GEN(7)) ?
775       GEN7_RENDER_CMD(3D, 3DSTATE_HIER_DEPTH_BUFFER) :
776       GEN6_RENDER_CMD(3D, 3DSTATE_HIER_DEPTH_BUFFER);
777    const uint8_t cmd_len = (ilo_dev_gen(builder->dev) >= ILO_GEN(8)) ? 5 : 3;
778    uint32_t *dw;
779    unsigned pos;
780 
781    ILO_DEV_ASSERT(builder->dev, 6, 8);
782 
783    pos = ilo_builder_batch_pointer(builder, cmd_len, &dw);
784 
785    dw[0] = cmd | (cmd_len - 2);
786 
787    /* see zs_set_gen6_3DSTATE_HIER_DEPTH_BUFFER() */
788    if (ilo_dev_gen(builder->dev) >= ILO_GEN(8)) {
789       dw[1] = zs->hiz[0];
790       dw[2] = 0;
791       dw[3] = 0;
792       dw[4] = zs->hiz[2];
793 
794       dw[1] |= builder->mocs << GEN8_HIZ_DW1_MOCS__SHIFT;
795 
796       if (zs->hiz_vma) {
797          ilo_builder_batch_reloc64(builder, pos + 2, zs->hiz_vma->bo,
798                zs->hiz_vma->bo_offset + zs->hiz[1],
799                (zs->z_readonly) ? 0 : INTEL_RELOC_WRITE);
800       }
801    } else {
802       dw[1] = zs->hiz[0];
803       dw[2] = 0;
804 
805       dw[1] |= builder->mocs << GEN6_HIZ_DW1_MOCS__SHIFT;
806 
807       if (zs->hiz_vma) {
808          ilo_builder_batch_reloc(builder, pos + 2, zs->hiz_vma->bo,
809                zs->hiz_vma->bo_offset + zs->hiz[1],
810                (zs->z_readonly) ? 0 : INTEL_RELOC_WRITE);
811       }
812    }
813 }
814 
815 static inline void
gen6_3DSTATE_CLEAR_PARAMS(struct ilo_builder * builder,uint32_t clear_val)816 gen6_3DSTATE_CLEAR_PARAMS(struct ilo_builder *builder,
817                           uint32_t clear_val)
818 {
819    const uint8_t cmd_len = 2;
820    uint32_t *dw;
821 
822    ILO_DEV_ASSERT(builder->dev, 6, 6);
823 
824    ilo_builder_batch_pointer(builder, cmd_len, &dw);
825 
826    dw[0] = GEN6_RENDER_CMD(3D, 3DSTATE_CLEAR_PARAMS) |
827            GEN6_CLEAR_PARAMS_DW0_VALID |
828            (cmd_len - 2);
829    dw[1] = clear_val;
830 }
831 
832 static inline void
gen7_3DSTATE_CLEAR_PARAMS(struct ilo_builder * builder,uint32_t clear_val)833 gen7_3DSTATE_CLEAR_PARAMS(struct ilo_builder *builder,
834                           uint32_t clear_val)
835 {
836    const uint8_t cmd_len = 3;
837    uint32_t *dw;
838 
839    ILO_DEV_ASSERT(builder->dev, 7, 8);
840 
841    ilo_builder_batch_pointer(builder, cmd_len, &dw);
842 
843    dw[0] = GEN7_RENDER_CMD(3D, 3DSTATE_CLEAR_PARAMS) | (cmd_len - 2);
844    dw[1] = clear_val;
845    dw[2] = GEN7_CLEAR_PARAMS_DW2_VALID;
846 }
847 
848 static inline void
gen6_3DSTATE_VIEWPORT_STATE_POINTERS(struct ilo_builder * builder,uint32_t clip_viewport,uint32_t sf_viewport,uint32_t cc_viewport)849 gen6_3DSTATE_VIEWPORT_STATE_POINTERS(struct ilo_builder *builder,
850                                      uint32_t clip_viewport,
851                                      uint32_t sf_viewport,
852                                      uint32_t cc_viewport)
853 {
854    const uint8_t cmd_len = 4;
855    uint32_t *dw;
856 
857    ILO_DEV_ASSERT(builder->dev, 6, 6);
858 
859    ilo_builder_batch_pointer(builder, cmd_len, &dw);
860 
861    dw[0] = GEN6_RENDER_CMD(3D, 3DSTATE_VIEWPORT_STATE_POINTERS) |
862            GEN6_VP_PTR_DW0_CLIP_CHANGED |
863            GEN6_VP_PTR_DW0_SF_CHANGED |
864            GEN6_VP_PTR_DW0_CC_CHANGED |
865            (cmd_len - 2);
866    dw[1] = clip_viewport;
867    dw[2] = sf_viewport;
868    dw[3] = cc_viewport;
869 }
870 
871 static inline void
gen6_3DSTATE_SCISSOR_STATE_POINTERS(struct ilo_builder * builder,uint32_t scissor_rect)872 gen6_3DSTATE_SCISSOR_STATE_POINTERS(struct ilo_builder *builder,
873                                     uint32_t scissor_rect)
874 {
875    const uint8_t cmd_len = 2;
876    uint32_t *dw;
877 
878    ILO_DEV_ASSERT(builder->dev, 6, 8);
879 
880    ilo_builder_batch_pointer(builder, cmd_len, &dw);
881 
882    dw[0] = GEN6_RENDER_CMD(3D, 3DSTATE_SCISSOR_STATE_POINTERS) |
883            (cmd_len - 2);
884    dw[1] = scissor_rect;
885 }
886 
887 static inline void
gen6_3DSTATE_CC_STATE_POINTERS(struct ilo_builder * builder,uint32_t blend_state,uint32_t depth_stencil_state,uint32_t color_calc_state)888 gen6_3DSTATE_CC_STATE_POINTERS(struct ilo_builder *builder,
889                                uint32_t blend_state,
890                                uint32_t depth_stencil_state,
891                                uint32_t color_calc_state)
892 {
893    const uint8_t cmd_len = 4;
894    uint32_t *dw;
895 
896    ILO_DEV_ASSERT(builder->dev, 6, 6);
897 
898    ilo_builder_batch_pointer(builder, cmd_len, &dw);
899 
900    dw[0] = GEN6_RENDER_CMD(3D, 3DSTATE_CC_STATE_POINTERS) | (cmd_len - 2);
901    dw[1] = blend_state | GEN6_CC_PTR_DW1_BLEND_CHANGED;
902    dw[2] = depth_stencil_state | GEN6_CC_PTR_DW2_ZS_CHANGED;
903    dw[3] = color_calc_state | GEN6_CC_PTR_DW3_CC_CHANGED;
904 }
905 
906 static inline void
gen7_3DSTATE_VIEWPORT_STATE_POINTERS_SF_CLIP(struct ilo_builder * builder,uint32_t sf_clip_viewport)907 gen7_3DSTATE_VIEWPORT_STATE_POINTERS_SF_CLIP(struct ilo_builder *builder,
908                                              uint32_t sf_clip_viewport)
909 {
910    ILO_DEV_ASSERT(builder->dev, 7, 8);
911 
912    gen7_3dstate_pointer(builder,
913          GEN7_RENDER_OPCODE_3DSTATE_VIEWPORT_STATE_POINTERS_SF_CLIP,
914          sf_clip_viewport);
915 }
916 
917 static inline void
gen7_3DSTATE_VIEWPORT_STATE_POINTERS_CC(struct ilo_builder * builder,uint32_t cc_viewport)918 gen7_3DSTATE_VIEWPORT_STATE_POINTERS_CC(struct ilo_builder *builder,
919                                         uint32_t cc_viewport)
920 {
921    ILO_DEV_ASSERT(builder->dev, 7, 8);
922 
923    gen7_3dstate_pointer(builder,
924          GEN7_RENDER_OPCODE_3DSTATE_VIEWPORT_STATE_POINTERS_CC,
925          cc_viewport);
926 }
927 
928 static inline void
gen7_3DSTATE_CC_STATE_POINTERS(struct ilo_builder * builder,uint32_t color_calc_state)929 gen7_3DSTATE_CC_STATE_POINTERS(struct ilo_builder *builder,
930                                uint32_t color_calc_state)
931 {
932    ILO_DEV_ASSERT(builder->dev, 7, 8);
933 
934    if (ilo_dev_gen(builder->dev) >= ILO_GEN(8))
935       color_calc_state |= 1;
936 
937    gen7_3dstate_pointer(builder,
938          GEN6_RENDER_OPCODE_3DSTATE_CC_STATE_POINTERS, color_calc_state);
939 }
940 
941 static inline void
gen7_3DSTATE_DEPTH_STENCIL_STATE_POINTERS(struct ilo_builder * builder,uint32_t depth_stencil_state)942 gen7_3DSTATE_DEPTH_STENCIL_STATE_POINTERS(struct ilo_builder *builder,
943                                           uint32_t depth_stencil_state)
944 {
945    ILO_DEV_ASSERT(builder->dev, 7, 8);
946 
947    gen7_3dstate_pointer(builder,
948          GEN7_RENDER_OPCODE_3DSTATE_DEPTH_STENCIL_STATE_POINTERS,
949          depth_stencil_state);
950 }
951 
952 static inline void
gen7_3DSTATE_BLEND_STATE_POINTERS(struct ilo_builder * builder,uint32_t blend_state)953 gen7_3DSTATE_BLEND_STATE_POINTERS(struct ilo_builder *builder,
954                                   uint32_t blend_state)
955 {
956    ILO_DEV_ASSERT(builder->dev, 7, 8);
957 
958    if (ilo_dev_gen(builder->dev) >= ILO_GEN(8))
959       blend_state |= 1;
960 
961    gen7_3dstate_pointer(builder,
962          GEN7_RENDER_OPCODE_3DSTATE_BLEND_STATE_POINTERS,
963          blend_state);
964 }
965 
966 static inline uint32_t
gen6_CLIP_VIEWPORT(struct ilo_builder * builder,const struct ilo_state_viewport * vp)967 gen6_CLIP_VIEWPORT(struct ilo_builder *builder,
968                    const struct ilo_state_viewport *vp)
969 {
970    const int state_align = 32;
971    const int state_len = 4 * vp->count;
972    uint32_t state_offset, *dw;
973    int i;
974 
975    ILO_DEV_ASSERT(builder->dev, 6, 6);
976 
977    state_offset = ilo_builder_dynamic_pointer(builder,
978          ILO_BUILDER_ITEM_CLIP_VIEWPORT, state_align, state_len, &dw);
979 
980    for (i = 0; i < vp->count; i++) {
981       /* see viewport_matrix_set_gen7_SF_CLIP_VIEWPORT() */
982       dw[0] = vp->sf_clip[i][8];
983       dw[1] = vp->sf_clip[i][9];
984       dw[2] = vp->sf_clip[i][10];
985       dw[3] = vp->sf_clip[i][11];
986 
987       dw += 4;
988    }
989 
990    return state_offset;
991 }
992 
993 static inline uint32_t
gen6_SF_VIEWPORT(struct ilo_builder * builder,const struct ilo_state_viewport * vp)994 gen6_SF_VIEWPORT(struct ilo_builder *builder,
995                  const struct ilo_state_viewport *vp)
996 {
997    const int state_align = 32;
998    const int state_len = 8 * vp->count;
999    uint32_t state_offset, *dw;
1000    int i;
1001 
1002    ILO_DEV_ASSERT(builder->dev, 6, 6);
1003 
1004    state_offset = ilo_builder_dynamic_pointer(builder,
1005          ILO_BUILDER_ITEM_SF_VIEWPORT, state_align, state_len, &dw);
1006 
1007    for (i = 0; i < vp->count; i++) {
1008       /* see viewport_matrix_set_gen7_SF_CLIP_VIEWPORT() */
1009       memcpy(dw, vp->sf_clip[i], sizeof(*dw) * 8);
1010 
1011       dw += 8;
1012    }
1013 
1014    return state_offset;
1015 }
1016 
1017 static inline uint32_t
gen7_SF_CLIP_VIEWPORT(struct ilo_builder * builder,const struct ilo_state_viewport * vp)1018 gen7_SF_CLIP_VIEWPORT(struct ilo_builder *builder,
1019                       const struct ilo_state_viewport *vp)
1020 {
1021    const int state_align = 64;
1022    const int state_len = 16 * vp->count;
1023 
1024    ILO_DEV_ASSERT(builder->dev, 7, 8);
1025 
1026    /* see viewport_matrix_set_gen7_SF_CLIP_VIEWPORT() */
1027    return ilo_builder_dynamic_write(builder, ILO_BUILDER_ITEM_SF_VIEWPORT,
1028          state_align, state_len, (const uint32_t *) vp->sf_clip);
1029 }
1030 
1031 static inline uint32_t
gen6_CC_VIEWPORT(struct ilo_builder * builder,const struct ilo_state_viewport * vp)1032 gen6_CC_VIEWPORT(struct ilo_builder *builder,
1033                  const struct ilo_state_viewport *vp)
1034 {
1035    const int state_align = 32;
1036    const int state_len = 2 * vp->count;
1037 
1038    ILO_DEV_ASSERT(builder->dev, 6, 8);
1039 
1040    /* see viewport_matrix_set_gen6_CC_VIEWPORT() */
1041    return ilo_builder_dynamic_write(builder, ILO_BUILDER_ITEM_CC_VIEWPORT,
1042          state_align, state_len, (const uint32_t *) vp->cc);
1043 }
1044 
1045 static inline uint32_t
gen6_SCISSOR_RECT(struct ilo_builder * builder,const struct ilo_state_viewport * vp)1046 gen6_SCISSOR_RECT(struct ilo_builder *builder,
1047                   const struct ilo_state_viewport *vp)
1048 {
1049    const int state_align = 32;
1050    const int state_len = 2 * vp->count;
1051 
1052    ILO_DEV_ASSERT(builder->dev, 6, 8);
1053 
1054    /* see viewport_scissor_set_gen6_SCISSOR_RECT() */
1055    return ilo_builder_dynamic_write(builder, ILO_BUILDER_ITEM_SCISSOR_RECT,
1056          state_align, state_len, (const uint32_t *) vp->scissor);
1057 }
1058 
1059 static inline uint32_t
gen6_COLOR_CALC_STATE(struct ilo_builder * builder,const struct ilo_state_cc * cc)1060 gen6_COLOR_CALC_STATE(struct ilo_builder *builder,
1061                       const struct ilo_state_cc *cc)
1062 {
1063    const int state_align = 64;
1064    const int state_len = 6;
1065 
1066    ILO_DEV_ASSERT(builder->dev, 6, 8);
1067 
1068    /* see cc_params_set_gen6_COLOR_CALC_STATE() */
1069    return ilo_builder_dynamic_write(builder, ILO_BUILDER_ITEM_COLOR_CALC,
1070          state_align, state_len, cc->cc);
1071 }
1072 
1073 static inline uint32_t
gen6_DEPTH_STENCIL_STATE(struct ilo_builder * builder,const struct ilo_state_cc * cc)1074 gen6_DEPTH_STENCIL_STATE(struct ilo_builder *builder,
1075                          const struct ilo_state_cc *cc)
1076 {
1077    const int state_align = 64;
1078    const int state_len = 3;
1079 
1080    ILO_DEV_ASSERT(builder->dev, 6, 7.5);
1081 
1082    /* see cc_set_gen6_DEPTH_STENCIL_STATE() */
1083    return ilo_builder_dynamic_write(builder, ILO_BUILDER_ITEM_DEPTH_STENCIL,
1084          state_align, state_len, cc->ds);
1085 }
1086 
1087 static inline uint32_t
gen6_BLEND_STATE(struct ilo_builder * builder,const struct ilo_state_cc * cc)1088 gen6_BLEND_STATE(struct ilo_builder *builder,
1089                  const struct ilo_state_cc *cc)
1090 {
1091    const int state_align = 64;
1092    const int state_len = 2 * cc->blend_state_count;
1093 
1094    ILO_DEV_ASSERT(builder->dev, 6, 7.5);
1095 
1096    if (!state_len)
1097       return 0;
1098 
1099    /* see cc_set_gen6_BLEND_STATE() */
1100    return ilo_builder_dynamic_write(builder, ILO_BUILDER_ITEM_BLEND,
1101          state_align, state_len, cc->blend);
1102 }
1103 
1104 static inline uint32_t
gen8_BLEND_STATE(struct ilo_builder * builder,const struct ilo_state_cc * cc)1105 gen8_BLEND_STATE(struct ilo_builder *builder,
1106                  const struct ilo_state_cc *cc)
1107 {
1108    const int state_align = 64;
1109    const int state_len = 1 + 2 * cc->blend_state_count;
1110 
1111    ILO_DEV_ASSERT(builder->dev, 8, 8);
1112 
1113    /* see cc_set_gen8_BLEND_STATE() */
1114    return ilo_builder_dynamic_write(builder, ILO_BUILDER_ITEM_BLEND,
1115          state_align, state_len, &cc->blend[1]);
1116 }
1117 
1118 #endif /* ILO_BUILDER_3D_BOTTOM_H */
1119