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 struct ilo_state_sample_pattern
*pattern
,
454 uint8_t sample_count
)
456 const uint8_t cmd_len
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7)) ? 4 : 3;
457 const uint32_t *packed
= (const uint32_t *)
458 ilo_state_sample_pattern_get_packed_offsets(pattern
,
459 builder
->dev
, sample_count
);
462 ILO_DEV_ASSERT(builder
->dev
, 6, 7.5);
464 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
466 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_MULTISAMPLE
) | (cmd_len
- 2);
467 /* see raster_set_gen8_3DSTATE_MULTISAMPLE() */
468 dw
[1] = rs
->sample
[0];
470 /* see sample_pattern_set_gen8_3DSTATE_SAMPLE_PATTERN() */
471 dw
[2] = (sample_count
>= 4) ? packed
[0] : 0;
472 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7))
473 dw
[3] = (sample_count
>= 8) ? packed
[1] : 0;
477 gen8_3DSTATE_MULTISAMPLE(struct ilo_builder
*builder
,
478 const struct ilo_state_raster
*rs
)
480 const uint8_t cmd_len
= 2;
483 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
485 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
487 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_MULTISAMPLE
) | (cmd_len
- 2);
488 /* see raster_set_gen8_3DSTATE_MULTISAMPLE() */
489 dw
[1] = rs
->sample
[0];
493 gen8_3DSTATE_SAMPLE_PATTERN(struct ilo_builder
*builder
,
494 const struct ilo_state_sample_pattern
*pattern
)
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);
508 /* see sample_pattern_set_gen8_3DSTATE_SAMPLE_PATTERN() */
509 dw
[5] = ((const uint32_t *) pattern
->pattern_8x
)[1];
510 dw
[6] = ((const uint32_t *) pattern
->pattern_8x
)[0];
511 dw
[7] = ((const uint32_t *) pattern
->pattern_4x
)[0];
512 dw
[8] = pattern
->pattern_1x
[0] << 16 |
513 ((const uint16_t *) pattern
->pattern_2x
)[0];
517 gen6_3DSTATE_SAMPLE_MASK(struct ilo_builder
*builder
,
518 const struct ilo_state_raster
*rs
)
520 const uint8_t cmd_len
= 2;
523 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
525 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
527 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_SAMPLE_MASK
) | (cmd_len
- 2);
528 /* see raster_set_gen6_3DSTATE_SAMPLE_MASK() */
529 dw
[1] = rs
->sample
[1];
533 gen6_3DSTATE_DRAWING_RECTANGLE(struct ilo_builder
*builder
,
534 unsigned x
, unsigned y
,
535 unsigned width
, unsigned height
)
537 const uint8_t cmd_len
= 4;
538 unsigned xmax
= x
+ width
- 1;
539 unsigned ymax
= y
+ height
- 1;
543 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
545 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7)) {
550 * From the Sandy Bridge PRM, volume 2 part 1, page 230:
552 * "[DevSNB] Errata: This field (Clipped Drawing Rectangle Y Min)
553 * must be an even number"
560 if (x
> rect_limit
) x
= rect_limit
;
561 if (y
> rect_limit
) y
= rect_limit
;
562 if (xmax
> rect_limit
) xmax
= rect_limit
;
563 if (ymax
> rect_limit
) ymax
= rect_limit
;
565 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
567 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_DRAWING_RECTANGLE
) | (cmd_len
- 2);
569 dw
[2] = ymax
<< 16 | xmax
;
571 * There is no need to set the origin. It is intended to support front
578 gen6_3DSTATE_POLY_STIPPLE_OFFSET(struct ilo_builder
*builder
,
579 int x_offset
, int y_offset
)
581 const uint8_t cmd_len
= 2;
584 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
586 assert(x_offset
>= 0 && x_offset
<= 31);
587 assert(y_offset
>= 0 && y_offset
<= 31);
589 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
591 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_POLY_STIPPLE_OFFSET
) | (cmd_len
- 2);
592 dw
[1] = x_offset
<< 8 | y_offset
;
596 gen6_3DSTATE_POLY_STIPPLE_PATTERN(struct ilo_builder
*builder
,
597 const struct pipe_poly_stipple
*pattern
)
599 const uint8_t cmd_len
= 33;
603 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
605 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
607 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_POLY_STIPPLE_PATTERN
) | (cmd_len
- 2);
610 STATIC_ASSERT(Elements(pattern
->stipple
) == 32);
611 for (i
= 0; i
< 32; i
++)
612 dw
[i
] = pattern
->stipple
[i
];
616 gen6_3DSTATE_LINE_STIPPLE(struct ilo_builder
*builder
,
617 unsigned pattern
, unsigned factor
)
619 const uint8_t cmd_len
= 3;
623 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
625 assert((pattern
& 0xffff) == pattern
);
626 assert(factor
>= 1 && factor
<= 256);
628 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
630 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_LINE_STIPPLE
) | (cmd_len
- 2);
633 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7)) {
635 inverse
= 65536 / factor
;
637 dw
[2] = inverse
<< GEN7_LINE_STIPPLE_DW2_INVERSE_REPEAT_COUNT__SHIFT
|
642 inverse
= 8192 / factor
;
644 dw
[2] = inverse
<< GEN6_LINE_STIPPLE_DW2_INVERSE_REPEAT_COUNT__SHIFT
|
650 gen6_3DSTATE_AA_LINE_PARAMETERS(struct ilo_builder
*builder
,
651 const struct ilo_state_raster
*rs
)
653 const uint8_t cmd_len
= 3;
656 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
658 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
660 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_AA_LINE_PARAMETERS
) | (cmd_len
- 2);
662 dw
[1] = 0 << GEN6_AA_LINE_DW1_BIAS__SHIFT
|
663 0 << GEN6_AA_LINE_DW1_SLOPE__SHIFT
;
664 dw
[2] = 0 << GEN6_AA_LINE_DW2_CAP_BIAS__SHIFT
|
665 0 << GEN6_AA_LINE_DW2_CAP_SLOPE__SHIFT
;
669 gen6_3DSTATE_DEPTH_BUFFER(struct ilo_builder
*builder
,
670 const struct ilo_state_zs
*zs
)
672 const uint32_t cmd
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7)) ?
673 GEN7_RENDER_CMD(3D
, 3DSTATE_DEPTH_BUFFER
) :
674 GEN6_RENDER_CMD(3D
, 3DSTATE_DEPTH_BUFFER
);
675 const uint8_t cmd_len
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) ? 8 : 7;
679 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
681 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
683 dw
[0] = cmd
| (cmd_len
- 2);
686 * see zs_set_gen6_3DSTATE_DEPTH_BUFFER() and
687 * zs_set_gen7_3DSTATE_DEPTH_BUFFER()
689 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) {
690 dw
[1] = zs
->depth
[0];
693 dw
[4] = zs
->depth
[2];
694 dw
[5] = zs
->depth
[3];
696 dw
[7] = zs
->depth
[4];
698 dw
[5] |= builder
->mocs
<< GEN8_DEPTH_DW5_MOCS__SHIFT
;
701 ilo_builder_batch_reloc64(builder
, pos
+ 2, zs
->depth_bo
,
702 zs
->depth
[1], (zs
->z_readonly
) ? 0 : INTEL_RELOC_WRITE
);
705 dw
[1] = zs
->depth
[0];
707 dw
[3] = zs
->depth
[2];
708 dw
[4] = zs
->depth
[3];
710 dw
[6] = zs
->depth
[4];
712 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7))
713 dw
[4] |= builder
->mocs
<< GEN7_DEPTH_DW4_MOCS__SHIFT
;
715 dw
[6] |= builder
->mocs
<< GEN6_DEPTH_DW6_MOCS__SHIFT
;
718 ilo_builder_batch_reloc(builder
, pos
+ 2, zs
->depth_bo
,
719 zs
->depth
[1], (zs
->z_readonly
) ? 0 : INTEL_RELOC_WRITE
);
725 gen6_3DSTATE_STENCIL_BUFFER(struct ilo_builder
*builder
,
726 const struct ilo_state_zs
*zs
)
728 const uint32_t cmd
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7)) ?
729 GEN7_RENDER_CMD(3D
, 3DSTATE_STENCIL_BUFFER
) :
730 GEN6_RENDER_CMD(3D
, 3DSTATE_STENCIL_BUFFER
);
731 const uint8_t cmd_len
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) ? 5 : 3;
735 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
737 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
739 dw
[0] = cmd
| (cmd_len
- 2);
741 /* see zs_set_gen6_3DSTATE_STENCIL_BUFFER() */
742 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) {
743 dw
[1] = zs
->stencil
[0];
746 dw
[4] = zs
->stencil
[2];
748 dw
[1] |= builder
->mocs
<< GEN8_STENCIL_DW1_MOCS__SHIFT
;
750 if (zs
->stencil_bo
) {
751 ilo_builder_batch_reloc64(builder
, pos
+ 2, zs
->stencil_bo
,
752 zs
->stencil
[1], (zs
->s_readonly
) ? 0 : INTEL_RELOC_WRITE
);
755 dw
[1] = zs
->stencil
[0];
758 dw
[1] |= builder
->mocs
<< GEN6_STENCIL_DW1_MOCS__SHIFT
;
760 if (zs
->stencil_bo
) {
761 ilo_builder_batch_reloc(builder
, pos
+ 2, zs
->stencil_bo
,
762 zs
->stencil
[1], (zs
->s_readonly
) ? 0 : INTEL_RELOC_WRITE
);
768 gen6_3DSTATE_HIER_DEPTH_BUFFER(struct ilo_builder
*builder
,
769 const struct ilo_state_zs
*zs
)
771 const uint32_t cmd
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7)) ?
772 GEN7_RENDER_CMD(3D
, 3DSTATE_HIER_DEPTH_BUFFER
) :
773 GEN6_RENDER_CMD(3D
, 3DSTATE_HIER_DEPTH_BUFFER
);
774 const uint8_t cmd_len
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) ? 5 : 3;
778 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
780 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
782 dw
[0] = cmd
| (cmd_len
- 2);
784 /* see zs_set_gen6_3DSTATE_HIER_DEPTH_BUFFER() */
785 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) {
791 dw
[1] |= builder
->mocs
<< GEN8_HIZ_DW1_MOCS__SHIFT
;
794 ilo_builder_batch_reloc64(builder
, pos
+ 2, zs
->hiz_bo
,
795 zs
->hiz
[1], (zs
->z_readonly
) ? 0 : INTEL_RELOC_WRITE
);
801 dw
[1] |= builder
->mocs
<< GEN6_HIZ_DW1_MOCS__SHIFT
;
804 ilo_builder_batch_reloc(builder
, pos
+ 2, zs
->hiz_bo
,
805 zs
->hiz
[1], (zs
->z_readonly
) ? 0 : INTEL_RELOC_WRITE
);
811 gen6_3DSTATE_CLEAR_PARAMS(struct ilo_builder
*builder
,
814 const uint8_t cmd_len
= 2;
817 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
819 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
821 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_CLEAR_PARAMS
) |
822 GEN6_CLEAR_PARAMS_DW0_VALID
|
828 gen7_3DSTATE_CLEAR_PARAMS(struct ilo_builder
*builder
,
831 const uint8_t cmd_len
= 3;
834 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
836 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
838 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_CLEAR_PARAMS
) | (cmd_len
- 2);
840 dw
[2] = GEN7_CLEAR_PARAMS_DW2_VALID
;
844 gen6_3DSTATE_VIEWPORT_STATE_POINTERS(struct ilo_builder
*builder
,
845 uint32_t clip_viewport
,
846 uint32_t sf_viewport
,
847 uint32_t cc_viewport
)
849 const uint8_t cmd_len
= 4;
852 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
854 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
856 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_VIEWPORT_STATE_POINTERS
) |
857 GEN6_VP_PTR_DW0_CLIP_CHANGED
|
858 GEN6_VP_PTR_DW0_SF_CHANGED
|
859 GEN6_VP_PTR_DW0_CC_CHANGED
|
861 dw
[1] = clip_viewport
;
867 gen6_3DSTATE_SCISSOR_STATE_POINTERS(struct ilo_builder
*builder
,
868 uint32_t scissor_rect
)
870 const uint8_t cmd_len
= 2;
873 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
875 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
877 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_SCISSOR_STATE_POINTERS
) |
879 dw
[1] = scissor_rect
;
883 gen6_3DSTATE_CC_STATE_POINTERS(struct ilo_builder
*builder
,
884 uint32_t blend_state
,
885 uint32_t depth_stencil_state
,
886 uint32_t color_calc_state
)
888 const uint8_t cmd_len
= 4;
891 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
893 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
895 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_CC_STATE_POINTERS
) | (cmd_len
- 2);
896 dw
[1] = blend_state
| GEN6_CC_PTR_DW1_BLEND_CHANGED
;
897 dw
[2] = depth_stencil_state
| GEN6_CC_PTR_DW2_ZS_CHANGED
;
898 dw
[3] = color_calc_state
| GEN6_CC_PTR_DW3_CC_CHANGED
;
902 gen7_3DSTATE_VIEWPORT_STATE_POINTERS_SF_CLIP(struct ilo_builder
*builder
,
903 uint32_t sf_clip_viewport
)
905 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
907 gen7_3dstate_pointer(builder
,
908 GEN7_RENDER_OPCODE_3DSTATE_VIEWPORT_STATE_POINTERS_SF_CLIP
,
913 gen7_3DSTATE_VIEWPORT_STATE_POINTERS_CC(struct ilo_builder
*builder
,
914 uint32_t cc_viewport
)
916 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
918 gen7_3dstate_pointer(builder
,
919 GEN7_RENDER_OPCODE_3DSTATE_VIEWPORT_STATE_POINTERS_CC
,
924 gen7_3DSTATE_CC_STATE_POINTERS(struct ilo_builder
*builder
,
925 uint32_t color_calc_state
)
927 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
929 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8))
930 color_calc_state
|= 1;
932 gen7_3dstate_pointer(builder
,
933 GEN6_RENDER_OPCODE_3DSTATE_CC_STATE_POINTERS
, color_calc_state
);
937 gen7_3DSTATE_DEPTH_STENCIL_STATE_POINTERS(struct ilo_builder
*builder
,
938 uint32_t depth_stencil_state
)
940 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
942 gen7_3dstate_pointer(builder
,
943 GEN7_RENDER_OPCODE_3DSTATE_DEPTH_STENCIL_STATE_POINTERS
,
944 depth_stencil_state
);
948 gen7_3DSTATE_BLEND_STATE_POINTERS(struct ilo_builder
*builder
,
949 uint32_t blend_state
)
951 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
953 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8))
956 gen7_3dstate_pointer(builder
,
957 GEN7_RENDER_OPCODE_3DSTATE_BLEND_STATE_POINTERS
,
961 static inline uint32_t
962 gen6_CLIP_VIEWPORT(struct ilo_builder
*builder
,
963 const struct ilo_state_viewport
*vp
)
965 const int state_align
= 32;
966 const int state_len
= 4 * vp
->count
;
967 uint32_t state_offset
, *dw
;
970 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
972 state_offset
= ilo_builder_dynamic_pointer(builder
,
973 ILO_BUILDER_ITEM_CLIP_VIEWPORT
, state_align
, state_len
, &dw
);
975 for (i
= 0; i
< vp
->count
; i
++) {
976 /* see viewport_matrix_set_gen7_SF_CLIP_VIEWPORT() */
977 dw
[0] = vp
->sf_clip
[i
][8];
978 dw
[1] = vp
->sf_clip
[i
][9];
979 dw
[2] = vp
->sf_clip
[i
][10];
980 dw
[3] = vp
->sf_clip
[i
][11];
988 static inline uint32_t
989 gen6_SF_VIEWPORT(struct ilo_builder
*builder
,
990 const struct ilo_state_viewport
*vp
)
992 const int state_align
= 32;
993 const int state_len
= 8 * vp
->count
;
994 uint32_t state_offset
, *dw
;
997 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
999 state_offset
= ilo_builder_dynamic_pointer(builder
,
1000 ILO_BUILDER_ITEM_SF_VIEWPORT
, state_align
, state_len
, &dw
);
1002 for (i
= 0; i
< vp
->count
; i
++) {
1003 /* see viewport_matrix_set_gen7_SF_CLIP_VIEWPORT() */
1004 memcpy(dw
, vp
->sf_clip
[i
], sizeof(*dw
) * 8);
1009 return state_offset
;
1012 static inline uint32_t
1013 gen7_SF_CLIP_VIEWPORT(struct ilo_builder
*builder
,
1014 const struct ilo_state_viewport
*vp
)
1016 const int state_align
= 64;
1017 const int state_len
= 16 * vp
->count
;
1019 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
1021 /* see viewport_matrix_set_gen7_SF_CLIP_VIEWPORT() */
1022 return ilo_builder_dynamic_write(builder
, ILO_BUILDER_ITEM_SF_VIEWPORT
,
1023 state_align
, state_len
, (const uint32_t *) vp
->sf_clip
);
1026 static inline uint32_t
1027 gen6_CC_VIEWPORT(struct ilo_builder
*builder
,
1028 const struct ilo_state_viewport
*vp
)
1030 const int state_align
= 32;
1031 const int state_len
= 2 * vp
->count
;
1033 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
1035 /* see viewport_matrix_set_gen6_CC_VIEWPORT() */
1036 return ilo_builder_dynamic_write(builder
, ILO_BUILDER_ITEM_CC_VIEWPORT
,
1037 state_align
, state_len
, (const uint32_t *) vp
->cc
);
1040 static inline uint32_t
1041 gen6_SCISSOR_RECT(struct ilo_builder
*builder
,
1042 const struct ilo_state_viewport
*vp
)
1044 const int state_align
= 32;
1045 const int state_len
= 2 * vp
->count
;
1047 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
1049 /* see viewport_scissor_set_gen6_SCISSOR_RECT() */
1050 return ilo_builder_dynamic_write(builder
, ILO_BUILDER_ITEM_SCISSOR_RECT
,
1051 state_align
, state_len
, (const uint32_t *) vp
->scissor
);
1054 static inline uint32_t
1055 gen6_COLOR_CALC_STATE(struct ilo_builder
*builder
,
1056 const struct ilo_state_cc
*cc
)
1058 const int state_align
= 64;
1059 const int state_len
= 6;
1061 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
1063 /* see cc_params_set_gen6_COLOR_CALC_STATE() */
1064 return ilo_builder_dynamic_write(builder
, ILO_BUILDER_ITEM_COLOR_CALC
,
1065 state_align
, state_len
, cc
->cc
);
1068 static inline uint32_t
1069 gen6_DEPTH_STENCIL_STATE(struct ilo_builder
*builder
,
1070 const struct ilo_state_cc
*cc
)
1072 const int state_align
= 64;
1073 const int state_len
= 3;
1075 ILO_DEV_ASSERT(builder
->dev
, 6, 7.5);
1077 /* see cc_set_gen6_DEPTH_STENCIL_STATE() */
1078 return ilo_builder_dynamic_write(builder
, ILO_BUILDER_ITEM_DEPTH_STENCIL
,
1079 state_align
, state_len
, cc
->ds
);
1082 static inline uint32_t
1083 gen6_BLEND_STATE(struct ilo_builder
*builder
,
1084 const struct ilo_state_cc
*cc
)
1086 const int state_align
= 64;
1087 const int state_len
= 2 * cc
->blend_state_count
;
1089 ILO_DEV_ASSERT(builder
->dev
, 6, 7.5);
1094 /* see cc_set_gen6_BLEND_STATE() */
1095 return ilo_builder_dynamic_write(builder
, ILO_BUILDER_ITEM_BLEND
,
1096 state_align
, state_len
, cc
->blend
);
1099 static inline uint32_t
1100 gen8_BLEND_STATE(struct ilo_builder
*builder
,
1101 const struct ilo_state_cc
*cc
)
1103 const int state_align
= 64;
1104 const int state_len
= 1 + 2 * cc
->blend_state_count
;
1106 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
1108 /* see cc_set_gen8_BLEND_STATE() */
1109 return ilo_builder_dynamic_write(builder
, ILO_BUILDER_ITEM_BLEND
,
1110 state_align
, state_len
, &cc
->blend
[1]);
1113 #endif /* ILO_BUILDER_3D_BOTTOM_H */