2 * Mesa 3-D graphics library
4 * Copyright (C) 2014 LunarG, Inc.
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:
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
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.
25 * Chia-I Wu <olv@lunarg.com>
28 #ifndef ILO_BUILDER_3D_BOTTOM_H
29 #define ILO_BUILDER_3D_BOTTOM_H
31 #include "genhw/genhw.h"
32 #include "intel_winsys.h"
36 #include "ilo_format.h"
37 #include "ilo_state_cc.h"
38 #include "ilo_state_raster.h"
39 #include "ilo_state_sbe.h"
40 #include "ilo_state_shader.h"
41 #include "ilo_state_viewport.h"
42 #include "ilo_builder.h"
43 #include "ilo_builder_3d_top.h"
46 gen6_3DSTATE_CLIP(struct ilo_builder
*builder
,
47 const struct ilo_state_raster
*rs
)
49 const uint8_t cmd_len
= 4;
52 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
54 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
56 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_CLIP
) | (cmd_len
- 2);
57 /* see raster_set_gen6_3DSTATE_CLIP() */
64 gen6_3DSTATE_SF(struct ilo_builder
*builder
,
65 const struct ilo_state_raster
*rs
,
66 const struct ilo_state_sbe
*sbe
)
68 const uint8_t cmd_len
= 20;
71 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
73 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
75 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_SF
) | (cmd_len
- 2);
76 /* see sbe_set_gen8_3DSTATE_SBE() */
79 /* see raster_set_gen7_3DSTATE_SF() */
83 dw
[5] = rs
->raster
[1];
84 dw
[6] = rs
->raster
[2];
85 dw
[7] = rs
->raster
[3];
87 /* see sbe_set_gen8_3DSTATE_SBE_SWIZ() */
88 memcpy(&dw
[8], sbe
->swiz
, sizeof(*dw
) * 8);
92 /* WrapShortest enables */
98 gen7_3DSTATE_SF(struct ilo_builder
*builder
,
99 const struct ilo_state_raster
*rs
)
101 const uint8_t cmd_len
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) ? 4 : 7;
104 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
106 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
108 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_SF
) | (cmd_len
- 2);
110 /* see raster_set_gen7_3DSTATE_SF() or raster_set_gen8_3DSTATE_SF() */
114 if (ilo_dev_gen(builder
->dev
) < ILO_GEN(8)) {
115 dw
[4] = rs
->raster
[1];
116 dw
[5] = rs
->raster
[2];
117 dw
[6] = rs
->raster
[3];
122 gen7_3DSTATE_SBE(struct ilo_builder
*builder
,
123 const struct ilo_state_sbe
*sbe
)
125 const uint8_t cmd_len
= 14;
128 ILO_DEV_ASSERT(builder
->dev
, 7, 7.5);
130 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
132 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_SBE
) | (cmd_len
- 2);
133 /* see sbe_set_gen8_3DSTATE_SBE() and sbe_set_gen8_3DSTATE_SBE_SWIZ() */
135 memcpy(&dw
[2], sbe
->swiz
, sizeof(*dw
) * 8);
136 dw
[10] = sbe
->sbe
[1];
137 dw
[11] = sbe
->sbe
[2];
139 /* WrapShortest enables */
145 gen8_3DSTATE_SBE(struct ilo_builder
*builder
,
146 const struct ilo_state_sbe
*sbe
)
148 const uint8_t cmd_len
= 4;
151 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
153 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
155 /* see sbe_set_gen8_3DSTATE_SBE() */
156 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_SBE
) | (cmd_len
- 2);
163 gen8_3DSTATE_SBE_SWIZ(struct ilo_builder
*builder
,
164 const struct ilo_state_sbe
*sbe
)
166 const uint8_t cmd_len
= 11;
169 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
171 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
173 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_SBE_SWIZ
) | (cmd_len
- 2);
174 /* see sbe_set_gen8_3DSTATE_SBE_SWIZ() */
175 memcpy(&dw
[1], sbe
->swiz
, sizeof(*dw
) * 8);
176 /* WrapShortest enables */
182 gen8_3DSTATE_RASTER(struct ilo_builder
*builder
,
183 const struct ilo_state_raster
*rs
)
185 const uint8_t cmd_len
= 5;
188 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
190 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
192 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_RASTER
) | (cmd_len
- 2);
193 /* see raster_set_gen8_3DSTATE_RASTER() */
194 dw
[1] = rs
->raster
[0];
195 dw
[2] = rs
->raster
[1];
196 dw
[3] = rs
->raster
[2];
197 dw
[4] = rs
->raster
[3];
201 gen6_3DSTATE_WM(struct ilo_builder
*builder
,
202 const struct ilo_state_raster
*rs
,
203 const struct ilo_state_ps
*ps
,
204 uint32_t kernel_offset
)
206 const uint8_t cmd_len
= 9;
209 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
211 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
213 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_WM
) | (cmd_len
- 2);
214 dw
[1] = kernel_offset
;
215 /* see raster_set_gen6_3dstate_wm() and ps_set_gen6_3dstate_wm() */
218 dw
[4] = rs
->wm
[0] | ps
->ps
[2];
219 dw
[5] = rs
->wm
[1] | ps
->ps
[3];
220 dw
[6] = rs
->wm
[2] | ps
->ps
[4];
221 dw
[7] = 0; /* kernel 1 */
222 dw
[8] = 0; /* kernel 2 */
226 gen7_3DSTATE_WM(struct ilo_builder
*builder
,
227 const struct ilo_state_raster
*rs
,
228 const struct ilo_state_ps
*ps
)
230 const uint8_t cmd_len
= 3;
233 ILO_DEV_ASSERT(builder
->dev
, 7, 7.5);
235 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
237 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_WM
) | (cmd_len
- 2);
238 /* see raster_set_gen8_3DSTATE_WM() and ps_set_gen7_3dstate_wm() */
239 dw
[1] = rs
->wm
[0] | ps
->ps
[0];
244 gen8_3DSTATE_WM(struct ilo_builder
*builder
,
245 const struct ilo_state_raster
*rs
)
247 const uint8_t cmd_len
= 2;
250 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
252 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
254 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_WM
) | (cmd_len
- 2);
255 /* see raster_set_gen8_3DSTATE_WM() */
260 gen8_3DSTATE_WM_DEPTH_STENCIL(struct ilo_builder
*builder
,
261 const struct ilo_state_cc
*cc
)
263 const uint8_t cmd_len
= 3;
266 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
268 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
270 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_WM_DEPTH_STENCIL
) | (cmd_len
- 2);
271 /* see cc_set_gen8_3DSTATE_WM_DEPTH_STENCIL() */
277 gen8_3DSTATE_WM_HZ_OP(struct ilo_builder
*builder
,
278 const struct ilo_state_raster
*rs
,
279 uint16_t width
, uint16_t height
)
281 const uint8_t cmd_len
= 5;
284 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
286 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
288 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_WM_HZ_OP
) | (cmd_len
- 2);
289 /* see raster_set_gen8_3dstate_wm_hz_op() */
293 dw
[3] = height
<< 16 | width
;
298 gen8_disable_3DSTATE_WM_HZ_OP(struct ilo_builder
*builder
)
300 const uint8_t cmd_len
= 5;
303 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
305 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
307 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_WM_HZ_OP
) | (cmd_len
- 2);
315 gen8_3DSTATE_WM_CHROMAKEY(struct ilo_builder
*builder
)
317 const uint8_t cmd_len
= 2;
320 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
322 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
324 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_WM_CHROMAKEY
) | (cmd_len
- 2);
329 gen7_3DSTATE_PS(struct ilo_builder
*builder
,
330 const struct ilo_state_ps
*ps
,
331 uint32_t kernel_offset
)
333 const uint8_t cmd_len
= 8;
336 ILO_DEV_ASSERT(builder
->dev
, 7, 7.5);
338 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
340 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_PS
) | (cmd_len
- 2);
341 dw
[1] = kernel_offset
;
342 /* see ps_set_gen7_3DSTATE_PS() */
347 dw
[6] = 0; /* kernel 1 */
348 dw
[7] = 0; /* kernel 2 */
352 gen8_3DSTATE_PS(struct ilo_builder
*builder
,
353 const struct ilo_state_ps
*ps
,
354 uint32_t kernel_offset
)
356 const uint8_t cmd_len
= 12;
359 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
361 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
363 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_PS
) | (cmd_len
- 2);
364 dw
[1] = kernel_offset
;
366 /* see ps_set_gen8_3DSTATE_PS() */
372 dw
[8] = 0; /* kernel 1 */
374 dw
[10] = 0; /* kernel 2 */
379 gen8_3DSTATE_PS_EXTRA(struct ilo_builder
*builder
,
380 const struct ilo_state_ps
*ps
)
382 const uint8_t cmd_len
= 2;
385 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
387 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
389 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_PS_EXTRA
) | (cmd_len
- 2);
390 /* see ps_set_gen8_3DSTATE_PS_EXTRA() */
395 gen8_3DSTATE_PS_BLEND(struct ilo_builder
*builder
,
396 const struct ilo_state_cc
*cc
)
398 const uint8_t cmd_len
= 2;
401 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
403 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
405 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_PS_BLEND
) | (cmd_len
- 2);
406 /* see cc_set_gen8_3DSTATE_PS_BLEND() */
407 dw
[1] = cc
->blend
[0];
411 gen6_3DSTATE_CONSTANT_PS(struct ilo_builder
*builder
,
412 const uint32_t *bufs
, const int *sizes
,
415 gen6_3dstate_constant(builder
, GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_PS
,
416 bufs
, sizes
, num_bufs
);
420 gen7_3DSTATE_CONSTANT_PS(struct ilo_builder
*builder
,
421 const uint32_t *bufs
, const int *sizes
,
424 gen7_3dstate_constant(builder
, GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_PS
,
425 bufs
, sizes
, num_bufs
);
429 gen7_3DSTATE_BINDING_TABLE_POINTERS_PS(struct ilo_builder
*builder
,
430 uint32_t binding_table
)
432 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
434 gen7_3dstate_pointer(builder
,
435 GEN7_RENDER_OPCODE_3DSTATE_BINDING_TABLE_POINTERS_PS
,
440 gen7_3DSTATE_SAMPLER_STATE_POINTERS_PS(struct ilo_builder
*builder
,
441 uint32_t sampler_state
)
443 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
445 gen7_3dstate_pointer(builder
,
446 GEN7_RENDER_OPCODE_3DSTATE_SAMPLER_STATE_POINTERS_PS
,
451 gen6_3DSTATE_MULTISAMPLE(struct ilo_builder
*builder
,
452 const struct ilo_state_raster
*rs
,
453 const uint32_t *pattern
, int pattern_len
)
455 const uint8_t cmd_len
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7)) ? 4 : 3;
458 ILO_DEV_ASSERT(builder
->dev
, 6, 7.5);
460 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
462 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_MULTISAMPLE
) | (cmd_len
- 2);
463 /* see raster_set_gen8_3DSTATE_MULTISAMPLE() */
464 dw
[1] = rs
->sample
[0];
466 assert(pattern_len
== 1 || pattern_len
== 2);
468 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7))
469 dw
[3] = (pattern_len
== 2) ? pattern
[1] : 0;
473 gen8_3DSTATE_MULTISAMPLE(struct ilo_builder
*builder
,
474 const struct ilo_state_raster
*rs
)
476 const uint8_t cmd_len
= 2;
479 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
481 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
483 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_MULTISAMPLE
) | (cmd_len
- 2);
484 /* see raster_set_gen8_3DSTATE_MULTISAMPLE() */
485 dw
[1] = rs
->sample
[0];
489 gen8_3DSTATE_SAMPLE_PATTERN(struct ilo_builder
*builder
,
490 const uint32_t *pattern_1x
,
491 const uint32_t *pattern_2x
,
492 const uint32_t *pattern_4x
,
493 const uint32_t *pattern_8x
,
494 const uint32_t *pattern_16x
)
496 const uint8_t cmd_len
= 9;
499 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
501 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
503 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_SAMPLE_PATTERN
) | (cmd_len
- 2);
504 dw
[1] = pattern_16x
[3];
505 dw
[2] = pattern_16x
[2];
506 dw
[3] = pattern_16x
[1];
507 dw
[4] = pattern_16x
[0];
508 dw
[5] = pattern_8x
[1];
509 dw
[6] = pattern_8x
[0];
510 dw
[7] = pattern_4x
[0];
511 dw
[8] = pattern_1x
[0] << 16 |
516 gen6_3DSTATE_SAMPLE_MASK(struct ilo_builder
*builder
,
517 const struct ilo_state_raster
*rs
)
519 const uint8_t cmd_len
= 2;
522 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
524 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
526 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_SAMPLE_MASK
) | (cmd_len
- 2);
527 /* see raster_set_gen6_3DSTATE_SAMPLE_MASK() */
528 dw
[1] = rs
->sample
[1];
532 gen6_3DSTATE_DRAWING_RECTANGLE(struct ilo_builder
*builder
,
533 unsigned x
, unsigned y
,
534 unsigned width
, unsigned height
)
536 const uint8_t cmd_len
= 4;
537 unsigned xmax
= x
+ width
- 1;
538 unsigned ymax
= y
+ height
- 1;
542 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
544 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7)) {
549 * From the Sandy Bridge PRM, volume 2 part 1, page 230:
551 * "[DevSNB] Errata: This field (Clipped Drawing Rectangle Y Min)
552 * must be an even number"
559 if (x
> rect_limit
) x
= rect_limit
;
560 if (y
> rect_limit
) y
= rect_limit
;
561 if (xmax
> rect_limit
) xmax
= rect_limit
;
562 if (ymax
> rect_limit
) ymax
= rect_limit
;
564 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
566 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_DRAWING_RECTANGLE
) | (cmd_len
- 2);
568 dw
[2] = ymax
<< 16 | xmax
;
570 * There is no need to set the origin. It is intended to support front
577 gen6_3DSTATE_POLY_STIPPLE_OFFSET(struct ilo_builder
*builder
,
578 int x_offset
, int y_offset
)
580 const uint8_t cmd_len
= 2;
583 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
585 assert(x_offset
>= 0 && x_offset
<= 31);
586 assert(y_offset
>= 0 && y_offset
<= 31);
588 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
590 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_POLY_STIPPLE_OFFSET
) | (cmd_len
- 2);
591 dw
[1] = x_offset
<< 8 | y_offset
;
595 gen6_3DSTATE_POLY_STIPPLE_PATTERN(struct ilo_builder
*builder
,
596 const struct pipe_poly_stipple
*pattern
)
598 const uint8_t cmd_len
= 33;
602 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
604 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
606 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_POLY_STIPPLE_PATTERN
) | (cmd_len
- 2);
609 STATIC_ASSERT(Elements(pattern
->stipple
) == 32);
610 for (i
= 0; i
< 32; i
++)
611 dw
[i
] = pattern
->stipple
[i
];
615 gen6_3DSTATE_LINE_STIPPLE(struct ilo_builder
*builder
,
616 unsigned pattern
, unsigned factor
)
618 const uint8_t cmd_len
= 3;
622 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
624 assert((pattern
& 0xffff) == pattern
);
625 assert(factor
>= 1 && factor
<= 256);
627 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
629 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_LINE_STIPPLE
) | (cmd_len
- 2);
632 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7)) {
634 inverse
= 65536 / factor
;
636 dw
[2] = inverse
<< GEN7_LINE_STIPPLE_DW2_INVERSE_REPEAT_COUNT__SHIFT
|
641 inverse
= 8192 / factor
;
643 dw
[2] = inverse
<< GEN6_LINE_STIPPLE_DW2_INVERSE_REPEAT_COUNT__SHIFT
|
649 gen6_3DSTATE_AA_LINE_PARAMETERS(struct ilo_builder
*builder
,
650 const struct ilo_state_raster
*rs
)
652 const uint8_t cmd_len
= 3;
655 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
657 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
659 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_AA_LINE_PARAMETERS
) | (cmd_len
- 2);
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
;
668 gen6_3DSTATE_DEPTH_BUFFER(struct ilo_builder
*builder
,
669 const struct ilo_state_zs
*zs
)
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;
678 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
680 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
682 dw
[0] = cmd
| (cmd_len
- 2);
685 * see zs_set_gen6_3DSTATE_DEPTH_BUFFER() and
686 * zs_set_gen7_3DSTATE_DEPTH_BUFFER()
688 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) {
689 dw
[1] = zs
->depth
[0];
692 dw
[4] = zs
->depth
[2];
693 dw
[5] = zs
->depth
[3];
695 dw
[7] = zs
->depth
[4];
697 dw
[5] |= builder
->mocs
<< GEN8_DEPTH_DW5_MOCS__SHIFT
;
700 ilo_builder_batch_reloc64(builder
, pos
+ 2, zs
->depth_bo
,
701 zs
->depth
[1], (zs
->z_readonly
) ? 0 : INTEL_RELOC_WRITE
);
704 dw
[1] = zs
->depth
[0];
706 dw
[3] = zs
->depth
[2];
707 dw
[4] = zs
->depth
[3];
709 dw
[6] = zs
->depth
[4];
711 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7))
712 dw
[4] |= builder
->mocs
<< GEN7_DEPTH_DW4_MOCS__SHIFT
;
714 dw
[6] |= builder
->mocs
<< GEN6_DEPTH_DW6_MOCS__SHIFT
;
717 ilo_builder_batch_reloc(builder
, pos
+ 2, zs
->depth_bo
,
718 zs
->depth
[1], (zs
->z_readonly
) ? 0 : INTEL_RELOC_WRITE
);
724 gen6_3DSTATE_STENCIL_BUFFER(struct ilo_builder
*builder
,
725 const struct ilo_state_zs
*zs
)
727 const uint32_t cmd
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7)) ?
728 GEN7_RENDER_CMD(3D
, 3DSTATE_STENCIL_BUFFER
) :
729 GEN6_RENDER_CMD(3D
, 3DSTATE_STENCIL_BUFFER
);
730 const uint8_t cmd_len
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) ? 5 : 3;
734 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
736 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
738 dw
[0] = cmd
| (cmd_len
- 2);
740 /* see zs_set_gen6_3DSTATE_STENCIL_BUFFER() */
741 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) {
742 dw
[1] = zs
->stencil
[0];
745 dw
[4] = zs
->stencil
[2];
747 dw
[1] |= builder
->mocs
<< GEN8_STENCIL_DW1_MOCS__SHIFT
;
749 if (zs
->stencil_bo
) {
750 ilo_builder_batch_reloc64(builder
, pos
+ 2, zs
->stencil_bo
,
751 zs
->stencil
[1], (zs
->s_readonly
) ? 0 : INTEL_RELOC_WRITE
);
754 dw
[1] = zs
->stencil
[0];
757 dw
[1] |= builder
->mocs
<< GEN6_STENCIL_DW1_MOCS__SHIFT
;
759 if (zs
->stencil_bo
) {
760 ilo_builder_batch_reloc(builder
, pos
+ 2, zs
->stencil_bo
,
761 zs
->stencil
[1], (zs
->s_readonly
) ? 0 : INTEL_RELOC_WRITE
);
767 gen6_3DSTATE_HIER_DEPTH_BUFFER(struct ilo_builder
*builder
,
768 const struct ilo_state_zs
*zs
)
770 const uint32_t cmd
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7)) ?
771 GEN7_RENDER_CMD(3D
, 3DSTATE_HIER_DEPTH_BUFFER
) :
772 GEN6_RENDER_CMD(3D
, 3DSTATE_HIER_DEPTH_BUFFER
);
773 const uint8_t cmd_len
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) ? 5 : 3;
777 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
779 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
781 dw
[0] = cmd
| (cmd_len
- 2);
783 /* see zs_set_gen6_3DSTATE_HIER_DEPTH_BUFFER() */
784 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) {
790 dw
[1] |= builder
->mocs
<< GEN8_HIZ_DW1_MOCS__SHIFT
;
793 ilo_builder_batch_reloc64(builder
, pos
+ 2, zs
->hiz_bo
,
794 zs
->hiz
[1], (zs
->z_readonly
) ? 0 : INTEL_RELOC_WRITE
);
800 dw
[1] |= builder
->mocs
<< GEN6_HIZ_DW1_MOCS__SHIFT
;
803 ilo_builder_batch_reloc(builder
, pos
+ 2, zs
->hiz_bo
,
804 zs
->hiz
[1], (zs
->z_readonly
) ? 0 : INTEL_RELOC_WRITE
);
810 gen6_3DSTATE_CLEAR_PARAMS(struct ilo_builder
*builder
,
813 const uint8_t cmd_len
= 2;
816 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
818 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
820 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_CLEAR_PARAMS
) |
821 GEN6_CLEAR_PARAMS_DW0_VALID
|
827 gen7_3DSTATE_CLEAR_PARAMS(struct ilo_builder
*builder
,
830 const uint8_t cmd_len
= 3;
833 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
835 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
837 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_CLEAR_PARAMS
) | (cmd_len
- 2);
839 dw
[2] = GEN7_CLEAR_PARAMS_DW2_VALID
;
843 gen6_3DSTATE_VIEWPORT_STATE_POINTERS(struct ilo_builder
*builder
,
844 uint32_t clip_viewport
,
845 uint32_t sf_viewport
,
846 uint32_t cc_viewport
)
848 const uint8_t cmd_len
= 4;
851 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
853 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
855 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_VIEWPORT_STATE_POINTERS
) |
856 GEN6_VP_PTR_DW0_CLIP_CHANGED
|
857 GEN6_VP_PTR_DW0_SF_CHANGED
|
858 GEN6_VP_PTR_DW0_CC_CHANGED
|
860 dw
[1] = clip_viewport
;
866 gen6_3DSTATE_SCISSOR_STATE_POINTERS(struct ilo_builder
*builder
,
867 uint32_t scissor_rect
)
869 const uint8_t cmd_len
= 2;
872 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
874 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
876 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_SCISSOR_STATE_POINTERS
) |
878 dw
[1] = scissor_rect
;
882 gen6_3DSTATE_CC_STATE_POINTERS(struct ilo_builder
*builder
,
883 uint32_t blend_state
,
884 uint32_t depth_stencil_state
,
885 uint32_t color_calc_state
)
887 const uint8_t cmd_len
= 4;
890 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
892 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
894 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_CC_STATE_POINTERS
) | (cmd_len
- 2);
895 dw
[1] = blend_state
| GEN6_CC_PTR_DW1_BLEND_CHANGED
;
896 dw
[2] = depth_stencil_state
| GEN6_CC_PTR_DW2_ZS_CHANGED
;
897 dw
[3] = color_calc_state
| GEN6_CC_PTR_DW3_CC_CHANGED
;
901 gen7_3DSTATE_VIEWPORT_STATE_POINTERS_SF_CLIP(struct ilo_builder
*builder
,
902 uint32_t sf_clip_viewport
)
904 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
906 gen7_3dstate_pointer(builder
,
907 GEN7_RENDER_OPCODE_3DSTATE_VIEWPORT_STATE_POINTERS_SF_CLIP
,
912 gen7_3DSTATE_VIEWPORT_STATE_POINTERS_CC(struct ilo_builder
*builder
,
913 uint32_t cc_viewport
)
915 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
917 gen7_3dstate_pointer(builder
,
918 GEN7_RENDER_OPCODE_3DSTATE_VIEWPORT_STATE_POINTERS_CC
,
923 gen7_3DSTATE_CC_STATE_POINTERS(struct ilo_builder
*builder
,
924 uint32_t color_calc_state
)
926 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
928 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8))
929 color_calc_state
|= 1;
931 gen7_3dstate_pointer(builder
,
932 GEN6_RENDER_OPCODE_3DSTATE_CC_STATE_POINTERS
, color_calc_state
);
936 gen7_3DSTATE_DEPTH_STENCIL_STATE_POINTERS(struct ilo_builder
*builder
,
937 uint32_t depth_stencil_state
)
939 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
941 gen7_3dstate_pointer(builder
,
942 GEN7_RENDER_OPCODE_3DSTATE_DEPTH_STENCIL_STATE_POINTERS
,
943 depth_stencil_state
);
947 gen7_3DSTATE_BLEND_STATE_POINTERS(struct ilo_builder
*builder
,
948 uint32_t blend_state
)
950 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
952 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8))
955 gen7_3dstate_pointer(builder
,
956 GEN7_RENDER_OPCODE_3DSTATE_BLEND_STATE_POINTERS
,
960 static inline uint32_t
961 gen6_CLIP_VIEWPORT(struct ilo_builder
*builder
,
962 const struct ilo_state_viewport
*vp
)
964 const int state_align
= 32;
965 const int state_len
= 4 * vp
->count
;
966 uint32_t state_offset
, *dw
;
969 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
971 state_offset
= ilo_builder_dynamic_pointer(builder
,
972 ILO_BUILDER_ITEM_CLIP_VIEWPORT
, state_align
, state_len
, &dw
);
974 for (i
= 0; i
< vp
->count
; i
++) {
975 /* see viewport_matrix_set_gen7_SF_CLIP_VIEWPORT() */
976 dw
[0] = vp
->sf_clip
[i
][8];
977 dw
[1] = vp
->sf_clip
[i
][9];
978 dw
[2] = vp
->sf_clip
[i
][10];
979 dw
[3] = vp
->sf_clip
[i
][11];
987 static inline uint32_t
988 gen6_SF_VIEWPORT(struct ilo_builder
*builder
,
989 const struct ilo_state_viewport
*vp
)
991 const int state_align
= 32;
992 const int state_len
= 8 * vp
->count
;
993 uint32_t state_offset
, *dw
;
996 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
998 state_offset
= ilo_builder_dynamic_pointer(builder
,
999 ILO_BUILDER_ITEM_SF_VIEWPORT
, state_align
, state_len
, &dw
);
1001 for (i
= 0; i
< vp
->count
; i
++) {
1002 /* see viewport_matrix_set_gen7_SF_CLIP_VIEWPORT() */
1003 memcpy(dw
, vp
->sf_clip
[i
], sizeof(*dw
) * 8);
1008 return state_offset
;
1011 static inline uint32_t
1012 gen7_SF_CLIP_VIEWPORT(struct ilo_builder
*builder
,
1013 const struct ilo_state_viewport
*vp
)
1015 const int state_align
= 64;
1016 const int state_len
= 16 * vp
->count
;
1018 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
1020 /* see viewport_matrix_set_gen7_SF_CLIP_VIEWPORT() */
1021 return ilo_builder_dynamic_write(builder
, ILO_BUILDER_ITEM_SF_VIEWPORT
,
1022 state_align
, state_len
, (const uint32_t *) vp
->sf_clip
);
1025 static inline uint32_t
1026 gen6_CC_VIEWPORT(struct ilo_builder
*builder
,
1027 const struct ilo_state_viewport
*vp
)
1029 const int state_align
= 32;
1030 const int state_len
= 2 * vp
->count
;
1032 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
1034 /* see viewport_matrix_set_gen6_CC_VIEWPORT() */
1035 return ilo_builder_dynamic_write(builder
, ILO_BUILDER_ITEM_CC_VIEWPORT
,
1036 state_align
, state_len
, (const uint32_t *) vp
->cc
);
1039 static inline uint32_t
1040 gen6_SCISSOR_RECT(struct ilo_builder
*builder
,
1041 const struct ilo_state_viewport
*vp
)
1043 const int state_align
= 32;
1044 const int state_len
= 2 * vp
->count
;
1046 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
1048 /* see viewport_scissor_set_gen6_SCISSOR_RECT() */
1049 return ilo_builder_dynamic_write(builder
, ILO_BUILDER_ITEM_SCISSOR_RECT
,
1050 state_align
, state_len
, (const uint32_t *) vp
->scissor
);
1053 static inline uint32_t
1054 gen6_COLOR_CALC_STATE(struct ilo_builder
*builder
,
1055 const struct ilo_state_cc
*cc
)
1057 const int state_align
= 64;
1058 const int state_len
= 6;
1060 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
1062 /* see cc_params_set_gen6_COLOR_CALC_STATE() */
1063 return ilo_builder_dynamic_write(builder
, ILO_BUILDER_ITEM_COLOR_CALC
,
1064 state_align
, state_len
, cc
->cc
);
1067 static inline uint32_t
1068 gen6_DEPTH_STENCIL_STATE(struct ilo_builder
*builder
,
1069 const struct ilo_state_cc
*cc
)
1071 const int state_align
= 64;
1072 const int state_len
= 3;
1074 ILO_DEV_ASSERT(builder
->dev
, 6, 7.5);
1076 /* see cc_set_gen6_DEPTH_STENCIL_STATE() */
1077 return ilo_builder_dynamic_write(builder
, ILO_BUILDER_ITEM_DEPTH_STENCIL
,
1078 state_align
, state_len
, cc
->ds
);
1081 static inline uint32_t
1082 gen6_BLEND_STATE(struct ilo_builder
*builder
,
1083 const struct ilo_state_cc
*cc
)
1085 const int state_align
= 64;
1086 const int state_len
= 2 * cc
->blend_state_count
;
1088 ILO_DEV_ASSERT(builder
->dev
, 6, 7.5);
1093 /* see cc_set_gen6_BLEND_STATE() */
1094 return ilo_builder_dynamic_write(builder
, ILO_BUILDER_ITEM_BLEND
,
1095 state_align
, state_len
, cc
->blend
);
1098 static inline uint32_t
1099 gen8_BLEND_STATE(struct ilo_builder
*builder
,
1100 const struct ilo_state_cc
*cc
)
1102 const int state_align
= 64;
1103 const int state_len
= 1 + 2 * cc
->blend_state_count
;
1105 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
1107 /* see cc_set_gen8_BLEND_STATE() */
1108 return ilo_builder_dynamic_write(builder
, ILO_BUILDER_ITEM_BLEND
,
1109 state_align
, state_len
, &cc
->blend
[1]);
1112 #endif /* ILO_BUILDER_3D_BOTTOM_H */