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"
34 #include "ilo_common.h"
35 #include "ilo_format.h"
36 #include "ilo_shader.h"
37 #include "ilo_builder.h"
38 #include "ilo_builder_3d_top.h"
41 gen6_3DSTATE_CLIP(struct ilo_builder
*builder
,
42 const struct ilo_rasterizer_state
*rasterizer
,
43 const struct ilo_shader_state
*fs
,
44 bool enable_guardband
,
47 const uint8_t cmd_len
= 4;
48 uint32_t dw1
, dw2
, dw3
, *dw
;
51 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
53 dw1
= rasterizer
->clip
.payload
[0];
54 dw2
= rasterizer
->clip
.payload
[1];
55 dw3
= rasterizer
->clip
.payload
[2];
57 if (enable_guardband
&& rasterizer
->clip
.can_enable_guardband
)
58 dw2
|= GEN6_CLIP_DW2_GB_TEST_ENABLE
;
60 interps
= (fs
) ? ilo_shader_get_kernel_param(fs
,
61 ILO_KERNEL_FS_BARYCENTRIC_INTERPOLATIONS
) : 0;
63 if (interps
& (GEN6_INTERP_NONPERSPECTIVE_PIXEL
|
64 GEN6_INTERP_NONPERSPECTIVE_CENTROID
|
65 GEN6_INTERP_NONPERSPECTIVE_SAMPLE
))
66 dw2
|= GEN6_CLIP_DW2_NONPERSPECTIVE_BARYCENTRIC_ENABLE
;
68 dw3
|= GEN6_CLIP_DW3_RTAINDEX_FORCED_ZERO
|
71 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
73 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_CLIP
) | (cmd_len
- 2);
80 gen6_disable_3DSTATE_CLIP(struct ilo_builder
*builder
)
82 const uint8_t cmd_len
= 4;
85 ILO_DEV_ASSERT(builder
->dev
, 6, 7.5);
87 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
89 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_CLIP
) | (cmd_len
- 2);
96 gen7_internal_3dstate_sf(struct ilo_builder
*builder
,
97 uint8_t cmd_len
, uint32_t *dw
,
98 const struct ilo_rasterizer_sf
*sf
,
101 ILO_DEV_ASSERT(builder
->dev
, 6, 7.5);
103 assert(cmd_len
== 7);
105 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_SF
) | (cmd_len
- 2);
109 dw
[2] = (num_samples
> 1) ? GEN7_SF_DW2_MSRASTMODE_ON_PATTERN
: 0;
118 /* see rasterizer_init_sf_gen6() */
119 STATIC_ASSERT(Elements(sf
->payload
) >= 3);
120 dw
[1] = sf
->payload
[0];
121 dw
[2] = sf
->payload
[1];
122 dw
[3] = sf
->payload
[2];
125 dw
[2] |= sf
->dw_msaa
;
127 dw
[4] = sf
->dw_depth_offset_const
;
128 dw
[5] = sf
->dw_depth_offset_scale
;
129 dw
[6] = sf
->dw_depth_offset_clamp
;
133 gen8_internal_3dstate_sbe(struct ilo_builder
*builder
,
134 uint8_t cmd_len
, uint32_t *dw
,
135 const struct ilo_shader_state
*fs
,
136 int sprite_coord_mode
)
138 const struct ilo_kernel_routing
*routing
;
139 int vue_offset
, vue_len
, out_count
;
141 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
143 assert(cmd_len
== 4);
145 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_SBE
) | (cmd_len
- 2);
148 dw
[1] = 1 << GEN7_SBE_DW1_URB_READ_LEN__SHIFT
;
154 routing
= ilo_shader_get_kernel_routing(fs
);
156 vue_offset
= routing
->source_skip
;
157 assert(vue_offset
% 2 == 0);
160 vue_len
= (routing
->source_len
+ 1) / 2;
164 out_count
= ilo_shader_get_kernel_param(fs
, ILO_KERNEL_INPUT_COUNT
);
165 assert(out_count
<= 32);
167 dw
[1] = out_count
<< GEN7_SBE_DW1_ATTR_COUNT__SHIFT
|
168 vue_len
<< GEN7_SBE_DW1_URB_READ_LEN__SHIFT
;
170 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) {
171 dw
[1] |= GEN8_SBE_DW1_USE_URB_READ_LEN
|
172 GEN8_SBE_DW1_USE_URB_READ_OFFSET
|
173 vue_offset
<< GEN8_SBE_DW1_URB_READ_OFFSET__SHIFT
;
175 dw
[1] |= vue_offset
<< GEN7_SBE_DW1_URB_READ_OFFSET__SHIFT
;
178 if (routing
->swizzle_enable
)
179 dw
[1] |= GEN7_SBE_DW1_ATTR_SWIZZLE_ENABLE
;
181 switch (sprite_coord_mode
) {
182 case PIPE_SPRITE_COORD_UPPER_LEFT
:
183 dw
[1] |= GEN7_SBE_DW1_POINT_SPRITE_TEXCOORD_UPPERLEFT
;
185 case PIPE_SPRITE_COORD_LOWER_LEFT
:
186 dw
[1] |= GEN7_SBE_DW1_POINT_SPRITE_TEXCOORD_LOWERLEFT
;
191 * From the Ivy Bridge PRM, volume 2 part 1, page 268:
193 * "This field (Point Sprite Texture Coordinate Enable) must be
194 * programmed to 0 when non-point primitives are rendered."
196 * TODO We do not check that yet.
198 dw
[2] = routing
->point_sprite_enable
;
200 dw
[3] = routing
->const_interp_enable
;
204 gen8_internal_3dstate_sbe_swiz(struct ilo_builder
*builder
,
205 uint8_t cmd_len
, uint32_t *dw
,
206 const struct ilo_shader_state
*fs
)
208 const struct ilo_kernel_routing
*routing
;
210 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
212 assert(cmd_len
== 11);
214 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_SBE_SWIZ
) | (cmd_len
- 2);
217 memset(&dw
[1], 0, sizeof(*dw
) * (cmd_len
- 1));
221 routing
= ilo_shader_get_kernel_routing(fs
);
223 STATIC_ASSERT(sizeof(routing
->swizzles
) >= sizeof(*dw
) * 8);
224 memcpy(&dw
[1], routing
->swizzles
, sizeof(*dw
) * 8);
226 /* WrapShortest enables */
232 gen6_3DSTATE_SF(struct ilo_builder
*builder
,
233 const struct ilo_rasterizer_state
*rasterizer
,
234 const struct ilo_shader_state
*fs
,
237 const uint8_t cmd_len
= 20;
238 uint32_t gen8_3dstate_sbe
[4], gen8_3dstate_sbe_swiz
[11];
239 uint32_t gen7_3dstate_sf
[7];
240 const struct ilo_rasterizer_sf
*sf
;
241 int sprite_coord_mode
;
244 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
246 sf
= (rasterizer
) ? &rasterizer
->sf
: NULL
;
247 sprite_coord_mode
= (rasterizer
) ? rasterizer
->state
.sprite_coord_mode
: 0;
249 gen8_internal_3dstate_sbe(builder
, Elements(gen8_3dstate_sbe
),
250 gen8_3dstate_sbe
, fs
, sprite_coord_mode
);
251 gen8_internal_3dstate_sbe_swiz(builder
, Elements(gen8_3dstate_sbe_swiz
),
252 gen8_3dstate_sbe_swiz
, fs
);
253 gen7_internal_3dstate_sf(builder
, Elements(gen7_3dstate_sf
),
254 gen7_3dstate_sf
, sf
, sample_count
);
256 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
258 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_SF
) | (cmd_len
- 2);
259 dw
[1] = gen8_3dstate_sbe
[1];
260 memcpy(&dw
[2], &gen7_3dstate_sf
[1], sizeof(*dw
) * 6);
261 memcpy(&dw
[8], &gen8_3dstate_sbe_swiz
[1], sizeof(*dw
) * 8);
262 dw
[16] = gen8_3dstate_sbe
[2];
263 dw
[17] = gen8_3dstate_sbe
[3];
264 dw
[18] = gen8_3dstate_sbe_swiz
[9];
265 dw
[19] = gen8_3dstate_sbe_swiz
[10];
269 gen7_3DSTATE_SF(struct ilo_builder
*builder
,
270 const struct ilo_rasterizer_sf
*sf
,
271 enum pipe_format zs_format
,
274 const uint8_t cmd_len
= 7;
277 ILO_DEV_ASSERT(builder
->dev
, 7, 7.5);
279 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
281 gen7_internal_3dstate_sf(builder
, cmd_len
, dw
, sf
, sample_count
);
283 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7)) {
286 /* separate stencil */
288 case PIPE_FORMAT_Z16_UNORM
:
289 hw_format
= GEN6_ZFORMAT_D16_UNORM
;
291 case PIPE_FORMAT_Z32_FLOAT
:
292 case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT
:
293 hw_format
= GEN6_ZFORMAT_D32_FLOAT
;
295 case PIPE_FORMAT_Z24X8_UNORM
:
296 case PIPE_FORMAT_Z24_UNORM_S8_UINT
:
297 hw_format
= GEN6_ZFORMAT_D24_UNORM_X8_UINT
;
300 /* FLOAT surface is assumed when there is no depth buffer */
301 hw_format
= GEN6_ZFORMAT_D32_FLOAT
;
305 dw
[1] |= hw_format
<< GEN7_SF_DW1_DEPTH_FORMAT__SHIFT
;
310 gen8_3DSTATE_SF(struct ilo_builder
*builder
,
311 const struct ilo_rasterizer_sf
*sf
)
313 const uint8_t cmd_len
= 4;
316 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
318 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
320 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_SF
) | (cmd_len
- 2);
322 /* see rasterizer_init_sf_gen8() */
323 STATIC_ASSERT(Elements(sf
->payload
) >= 3);
324 dw
[1] = sf
->payload
[0];
325 dw
[2] = sf
->payload
[1];
326 dw
[3] = sf
->payload
[2];
330 gen7_3DSTATE_SBE(struct ilo_builder
*builder
,
331 const struct ilo_shader_state
*fs
,
332 int sprite_coord_mode
)
334 const uint8_t cmd_len
= 14;
335 uint32_t gen8_3dstate_sbe
[4], gen8_3dstate_sbe_swiz
[11];
338 ILO_DEV_ASSERT(builder
->dev
, 7, 7.5);
340 gen8_internal_3dstate_sbe(builder
, Elements(gen8_3dstate_sbe
),
341 gen8_3dstate_sbe
, fs
, sprite_coord_mode
);
342 gen8_internal_3dstate_sbe_swiz(builder
, Elements(gen8_3dstate_sbe_swiz
),
343 gen8_3dstate_sbe_swiz
, fs
);
345 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
347 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_SBE
) | (cmd_len
- 2);
348 dw
[1] = gen8_3dstate_sbe
[1];
349 memcpy(&dw
[2], &gen8_3dstate_sbe_swiz
[1], sizeof(*dw
) * 8);
350 dw
[10] = gen8_3dstate_sbe
[2];
351 dw
[11] = gen8_3dstate_sbe
[3];
352 dw
[12] = gen8_3dstate_sbe_swiz
[9];
353 dw
[13] = gen8_3dstate_sbe_swiz
[10];
357 gen8_3DSTATE_SBE(struct ilo_builder
*builder
,
358 const struct ilo_shader_state
*fs
,
359 int sprite_coord_mode
)
361 const uint8_t cmd_len
= 4;
364 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
366 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
368 gen8_internal_3dstate_sbe(builder
, cmd_len
, dw
, fs
, sprite_coord_mode
);
372 gen8_3DSTATE_SBE_SWIZ(struct ilo_builder
*builder
,
373 const struct ilo_shader_state
*fs
)
375 const uint8_t cmd_len
= 11;
378 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
380 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
382 gen8_internal_3dstate_sbe_swiz(builder
, cmd_len
, dw
, fs
);
386 gen8_3DSTATE_RASTER(struct ilo_builder
*builder
,
387 const struct ilo_rasterizer_sf
*sf
)
389 const uint8_t cmd_len
= 5;
392 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
394 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
396 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_RASTER
) | (cmd_len
- 2);
397 dw
[1] = sf
->dw_raster
;
398 dw
[2] = sf
->dw_depth_offset_const
;
399 dw
[3] = sf
->dw_depth_offset_scale
;
400 dw
[4] = sf
->dw_depth_offset_clamp
;
404 gen6_3DSTATE_WM(struct ilo_builder
*builder
,
405 const struct ilo_shader_state
*fs
,
406 const struct ilo_rasterizer_state
*rasterizer
,
407 bool dual_blend
, bool cc_may_kill
)
409 const uint8_t cmd_len
= 9;
410 const int num_samples
= 1;
411 const struct ilo_shader_cso
*cso
;
412 uint32_t dw2
, dw4
, dw5
, dw6
, *dw
;
414 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
416 cso
= ilo_shader_get_kernel_cso(fs
);
417 dw2
= cso
->payload
[0];
418 dw4
= cso
->payload
[1];
419 dw5
= cso
->payload
[2];
420 dw6
= cso
->payload
[3];
423 * From the Sandy Bridge PRM, volume 2 part 1, page 248:
425 * "This bit (Statistics Enable) must be disabled if either of these
426 * bits is set: Depth Buffer Clear , Hierarchical Depth Buffer Resolve
427 * Enable or Depth Buffer Resolve Enable."
429 dw4
|= GEN6_WM_DW4_STATISTICS
;
432 dw5
|= GEN6_WM_DW5_PS_KILL_PIXEL
| GEN6_WM_DW5_PS_DISPATCH_ENABLE
;
435 dw5
|= GEN6_WM_DW5_PS_DUAL_SOURCE_BLEND
;
437 dw5
|= rasterizer
->wm
.payload
[0];
439 dw6
|= rasterizer
->wm
.payload
[1];
441 if (num_samples
> 1) {
442 dw6
|= rasterizer
->wm
.dw_msaa_rast
|
443 rasterizer
->wm
.dw_msaa_disp
;
446 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
448 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_WM
) | (cmd_len
- 2);
449 dw
[1] = ilo_shader_get_kernel_offset(fs
);
451 dw
[3] = 0; /* scratch */
455 dw
[7] = 0; /* kernel 1 */
456 dw
[8] = 0; /* kernel 2 */
460 gen6_hiz_3DSTATE_WM(struct ilo_builder
*builder
, uint32_t hiz_op
)
462 const uint8_t cmd_len
= 9;
463 const int max_threads
= (builder
->dev
->gt
== 2) ? 80 : 40;
466 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
468 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
470 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_WM
) | (cmd_len
- 2);
475 /* honor the valid range even if dispatching is disabled */
476 dw
[5] = (max_threads
- 1) << GEN6_WM_DW5_MAX_THREADS__SHIFT
;
483 gen7_3DSTATE_WM(struct ilo_builder
*builder
,
484 const struct ilo_shader_state
*fs
,
485 const struct ilo_rasterizer_state
*rasterizer
,
488 const uint8_t cmd_len
= 3;
489 const int num_samples
= 1;
490 const struct ilo_shader_cso
*cso
;
491 uint32_t dw1
, dw2
, *dw
;
493 ILO_DEV_ASSERT(builder
->dev
, 7, 7.5);
495 /* see rasterizer_init_wm_gen7() */
496 dw1
= rasterizer
->wm
.payload
[0];
497 dw2
= rasterizer
->wm
.payload
[1];
499 /* see fs_init_cso_gen7() */
500 cso
= ilo_shader_get_kernel_cso(fs
);
501 dw1
|= cso
->payload
[3];
503 dw1
|= GEN7_WM_DW1_STATISTICS
;
506 dw1
|= GEN7_WM_DW1_PS_DISPATCH_ENABLE
| GEN7_WM_DW1_PS_KILL_PIXEL
;
508 if (num_samples
> 1) {
509 dw1
|= rasterizer
->wm
.dw_msaa_rast
;
510 dw2
|= rasterizer
->wm
.dw_msaa_disp
;
513 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
515 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_WM
) | (cmd_len
- 2);
521 gen8_3DSTATE_WM(struct ilo_builder
*builder
,
522 const struct ilo_shader_state
*fs
,
523 const struct ilo_rasterizer_state
*rasterizer
)
525 const uint8_t cmd_len
= 2;
526 const struct ilo_shader_cso
*cso
;
527 uint32_t dw1
, interps
, *dw
;
529 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
531 /* see rasterizer_get_wm_gen8() */
532 dw1
= rasterizer
->wm
.payload
[0];
533 dw1
|= GEN7_WM_DW1_STATISTICS
;
535 /* see fs_init_cso_gen8() */
536 cso
= ilo_shader_get_kernel_cso(fs
);
537 interps
= cso
->payload
[4];
539 assert(!(dw1
& interps
));
541 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
543 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_WM
) | (cmd_len
- 2);
544 dw
[1] = dw1
| interps
;
548 gen7_hiz_3DSTATE_WM(struct ilo_builder
*builder
, uint32_t hiz_op
)
550 const uint8_t cmd_len
= 3;
553 ILO_DEV_ASSERT(builder
->dev
, 7, 7.5);
555 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
556 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_WM
) | (cmd_len
- 2);
562 gen8_3DSTATE_WM_DEPTH_STENCIL(struct ilo_builder
*builder
,
563 const struct ilo_dsa_state
*dsa
)
565 const uint8_t cmd_len
= 3;
566 uint32_t dw1
, dw2
, *dw
;
568 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
570 dw1
= dsa
->payload
[0];
571 dw2
= dsa
->payload
[1];
573 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
575 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_WM_DEPTH_STENCIL
) | (cmd_len
- 2);
581 gen8_3DSTATE_WM_HZ_OP(struct ilo_builder
*builder
, uint32_t op
,
582 uint16_t width
, uint16_t height
, int sample_count
)
584 const uint8_t cmd_len
= 5;
585 const uint32_t sample_mask
= ((1 << sample_count
) - 1) | 0x1;
588 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
592 switch (sample_count
) {
595 dw1
|= GEN8_WM_HZ_DW1_NUMSAMPLES_1
;
598 dw1
|= GEN8_WM_HZ_DW1_NUMSAMPLES_2
;
601 dw1
|= GEN8_WM_HZ_DW1_NUMSAMPLES_4
;
604 dw1
|= GEN8_WM_HZ_DW1_NUMSAMPLES_8
;
607 dw1
|= GEN8_WM_HZ_DW1_NUMSAMPLES_16
;
610 assert(!"unsupported sample count");
611 dw1
|= GEN8_WM_HZ_DW1_NUMSAMPLES_1
;
615 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
617 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_WM_HZ_OP
) | (cmd_len
- 2);
621 dw
[3] = height
<< 16 | width
;
626 gen8_disable_3DSTATE_WM_HZ_OP(struct ilo_builder
*builder
)
628 const uint8_t cmd_len
= 5;
631 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
633 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
635 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_WM_HZ_OP
) | (cmd_len
- 2);
643 gen8_3DSTATE_WM_CHROMAKEY(struct ilo_builder
*builder
)
645 const uint8_t cmd_len
= 2;
648 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
650 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
652 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_WM_CHROMAKEY
) | (cmd_len
- 2);
657 gen7_3DSTATE_PS(struct ilo_builder
*builder
,
658 const struct ilo_shader_state
*fs
,
661 const uint8_t cmd_len
= 8;
662 const struct ilo_shader_cso
*cso
;
663 uint32_t dw2
, dw4
, dw5
, *dw
;
665 ILO_DEV_ASSERT(builder
->dev
, 7, 7.5);
667 /* see fs_init_cso_gen7() */
668 cso
= ilo_shader_get_kernel_cso(fs
);
669 dw2
= cso
->payload
[0];
670 dw4
= cso
->payload
[1];
671 dw5
= cso
->payload
[2];
674 dw4
|= GEN7_PS_DW4_DUAL_SOURCE_BLEND
;
676 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
678 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_PS
) | (cmd_len
- 2);
679 dw
[1] = ilo_shader_get_kernel_offset(fs
);
681 dw
[3] = 0; /* scratch */
684 dw
[6] = 0; /* kernel 1 */
685 dw
[7] = 0; /* kernel 2 */
689 gen7_disable_3DSTATE_PS(struct ilo_builder
*builder
)
691 const uint8_t cmd_len
= 8;
695 ILO_DEV_ASSERT(builder
->dev
, 7, 7.5);
697 /* GPU hangs if none of the dispatch enable bits is set */
698 dw4
= GEN6_PS_DISPATCH_8
<< GEN7_PS_DW4_DISPATCH_MODE__SHIFT
;
700 /* see brwCreateContext() */
701 switch (ilo_dev_gen(builder
->dev
)) {
703 max_threads
= (builder
->dev
->gt
== 3) ? 408 :
704 (builder
->dev
->gt
== 2) ? 204 : 102;
705 dw4
|= (max_threads
- 1) << GEN75_PS_DW4_MAX_THREADS__SHIFT
;
709 max_threads
= (builder
->dev
->gt
== 2) ? 172 : 48;
710 dw4
|= (max_threads
- 1) << GEN7_PS_DW4_MAX_THREADS__SHIFT
;
714 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
716 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_PS
) | (cmd_len
- 2);
727 gen8_3DSTATE_PS(struct ilo_builder
*builder
,
728 const struct ilo_shader_state
*fs
)
730 const uint8_t cmd_len
= 12;
731 const struct ilo_shader_cso
*cso
;
732 uint32_t dw3
, dw6
, dw7
, *dw
;
734 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
736 /* see fs_init_cso_gen8() */
737 cso
= ilo_shader_get_kernel_cso(fs
);
738 dw3
= cso
->payload
[0];
739 dw6
= cso
->payload
[1];
740 dw7
= cso
->payload
[2];
742 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
744 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_PS
) | (cmd_len
- 2);
745 dw
[1] = ilo_shader_get_kernel_offset(fs
);
748 dw
[4] = 0; /* scratch */
752 dw
[8] = 0; /* kernel 1 */
754 dw
[10] = 0; /* kernel 2 */
759 gen8_3DSTATE_PS_EXTRA(struct ilo_builder
*builder
,
760 const struct ilo_shader_state
*fs
,
761 bool cc_may_kill
, bool per_sample
)
763 const uint8_t cmd_len
= 2;
764 const struct ilo_shader_cso
*cso
;
767 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
769 /* see fs_init_cso_gen8() */
770 cso
= ilo_shader_get_kernel_cso(fs
);
771 dw1
= cso
->payload
[3];
774 dw1
|= GEN8_PSX_DW1_DISPATCH_ENABLE
| GEN8_PSX_DW1_KILL_PIXEL
;
776 dw1
|= GEN8_PSX_DW1_PER_SAMPLE
;
778 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
780 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_PS_EXTRA
) | (cmd_len
- 2);
785 gen8_3DSTATE_PS_BLEND(struct ilo_builder
*builder
,
786 const struct ilo_blend_state
*blend
,
787 const struct ilo_fb_state
*fb
,
788 const struct ilo_dsa_state
*dsa
)
790 const uint8_t cmd_len
= 2;
793 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
796 if (blend
->alpha_to_coverage
&& fb
->num_samples
> 1)
797 dw1
|= GEN8_PS_BLEND_DW1_ALPHA_TO_COVERAGE
;
799 if (fb
->state
.nr_cbufs
&& fb
->state
.cbufs
[0]) {
800 const struct ilo_fb_blend_caps
*caps
= &fb
->blend_caps
[0];
802 dw1
|= GEN8_PS_BLEND_DW1_WRITABLE_RT
;
803 if (caps
->can_blend
) {
804 if (caps
->dst_alpha_forced_one
)
805 dw1
|= blend
->dw_ps_blend_dst_alpha_forced_one
;
807 dw1
|= blend
->dw_ps_blend
;
810 if (caps
->can_alpha_test
)
811 dw1
|= dsa
->dw_ps_blend_alpha
;
813 dw1
|= dsa
->dw_ps_blend_alpha
;
816 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
818 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_PS_BLEND
) | (cmd_len
- 2);
823 gen6_3DSTATE_CONSTANT_PS(struct ilo_builder
*builder
,
824 const uint32_t *bufs
, const int *sizes
,
827 gen6_3dstate_constant(builder
, GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_PS
,
828 bufs
, sizes
, num_bufs
);
832 gen7_3DSTATE_CONSTANT_PS(struct ilo_builder
*builder
,
833 const uint32_t *bufs
, const int *sizes
,
836 gen7_3dstate_constant(builder
, GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_PS
,
837 bufs
, sizes
, num_bufs
);
841 gen7_3DSTATE_BINDING_TABLE_POINTERS_PS(struct ilo_builder
*builder
,
842 uint32_t binding_table
)
844 gen7_3dstate_pointer(builder
,
845 GEN7_RENDER_OPCODE_3DSTATE_BINDING_TABLE_POINTERS_PS
,
850 gen7_3DSTATE_SAMPLER_STATE_POINTERS_PS(struct ilo_builder
*builder
,
851 uint32_t sampler_state
)
853 gen7_3dstate_pointer(builder
,
854 GEN7_RENDER_OPCODE_3DSTATE_SAMPLER_STATE_POINTERS_PS
,
859 gen6_3DSTATE_MULTISAMPLE(struct ilo_builder
*builder
,
860 int num_samples
, const uint32_t *pattern
,
861 bool pixel_location_center
)
863 const uint8_t cmd_len
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7)) ? 4 : 3;
864 uint32_t dw1
, dw2
, dw3
, *dw
;
866 ILO_DEV_ASSERT(builder
->dev
, 6, 7.5);
868 dw1
= (pixel_location_center
) ? GEN6_MULTISAMPLE_DW1_PIXLOC_CENTER
:
869 GEN6_MULTISAMPLE_DW1_PIXLOC_UL_CORNER
;
871 switch (num_samples
) {
874 dw1
|= GEN6_MULTISAMPLE_DW1_NUMSAMPLES_1
;
879 dw1
|= GEN6_MULTISAMPLE_DW1_NUMSAMPLES_4
;
884 assert(ilo_dev_gen(builder
->dev
) >= ILO_GEN(7));
885 dw1
|= GEN7_MULTISAMPLE_DW1_NUMSAMPLES_8
;
890 assert(!"unsupported sample count");
891 dw1
|= GEN6_MULTISAMPLE_DW1_NUMSAMPLES_1
;
897 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
899 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_MULTISAMPLE
) | (cmd_len
- 2);
902 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7))
907 gen8_3DSTATE_MULTISAMPLE(struct ilo_builder
*builder
,
909 bool pixel_location_center
)
911 const uint8_t cmd_len
= 2;
914 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
916 dw1
= (pixel_location_center
) ? GEN6_MULTISAMPLE_DW1_PIXLOC_CENTER
:
917 GEN6_MULTISAMPLE_DW1_PIXLOC_UL_CORNER
;
919 switch (num_samples
) {
922 dw1
|= GEN6_MULTISAMPLE_DW1_NUMSAMPLES_1
;
925 dw1
|= GEN8_MULTISAMPLE_DW1_NUMSAMPLES_2
;
928 dw1
|= GEN6_MULTISAMPLE_DW1_NUMSAMPLES_4
;
931 dw1
|= GEN7_MULTISAMPLE_DW1_NUMSAMPLES_8
;
934 dw1
|= GEN8_MULTISAMPLE_DW1_NUMSAMPLES_16
;
937 assert(!"unsupported sample count");
938 dw1
|= GEN6_MULTISAMPLE_DW1_NUMSAMPLES_1
;
942 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
944 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_MULTISAMPLE
) | (cmd_len
- 2);
949 gen8_3DSTATE_SAMPLE_PATTERN(struct ilo_builder
*builder
,
950 const uint32_t *pattern_1x
,
951 const uint32_t *pattern_2x
,
952 const uint32_t *pattern_4x
,
953 const uint32_t *pattern_8x
,
954 const uint32_t *pattern_16x
)
956 const uint8_t cmd_len
= 9;
959 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
961 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
963 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_SAMPLE_PATTERN
) | (cmd_len
- 2);
964 dw
[1] = pattern_16x
[3];
965 dw
[2] = pattern_16x
[2];
966 dw
[3] = pattern_16x
[1];
967 dw
[4] = pattern_16x
[0];
968 dw
[5] = pattern_8x
[1];
969 dw
[6] = pattern_8x
[0];
970 dw
[7] = pattern_4x
[0];
971 dw
[8] = pattern_1x
[0] << 16 |
976 gen6_3DSTATE_SAMPLE_MASK(struct ilo_builder
*builder
,
977 unsigned sample_mask
)
979 const uint8_t cmd_len
= 2;
980 const unsigned valid_mask
= 0xf;
983 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
985 sample_mask
&= valid_mask
;
987 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
989 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_SAMPLE_MASK
) | (cmd_len
- 2);
994 gen7_3DSTATE_SAMPLE_MASK(struct ilo_builder
*builder
,
995 unsigned sample_mask
,
998 const uint8_t cmd_len
= 2;
999 const unsigned valid_mask
= ((1 << num_samples
) - 1) | 0x1;
1002 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
1005 * From the Ivy Bridge PRM, volume 2 part 1, page 294:
1007 * "If Number of Multisamples is NUMSAMPLES_1, bits 7:1 of this field
1008 * (Sample Mask) must be zero.
1010 * If Number of Multisamples is NUMSAMPLES_4, bits 7:4 of this field
1013 sample_mask
&= valid_mask
;
1015 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
1017 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_SAMPLE_MASK
) | (cmd_len
- 2);
1018 dw
[1] = sample_mask
;
1022 gen6_3DSTATE_DRAWING_RECTANGLE(struct ilo_builder
*builder
,
1023 unsigned x
, unsigned y
,
1024 unsigned width
, unsigned height
)
1026 const uint8_t cmd_len
= 4;
1027 unsigned xmax
= x
+ width
- 1;
1028 unsigned ymax
= y
+ height
- 1;
1029 unsigned rect_limit
;
1032 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
1034 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7)) {
1039 * From the Sandy Bridge PRM, volume 2 part 1, page 230:
1041 * "[DevSNB] Errata: This field (Clipped Drawing Rectangle Y Min)
1042 * must be an even number"
1049 if (x
> rect_limit
) x
= rect_limit
;
1050 if (y
> rect_limit
) y
= rect_limit
;
1051 if (xmax
> rect_limit
) xmax
= rect_limit
;
1052 if (ymax
> rect_limit
) ymax
= rect_limit
;
1054 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
1056 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_DRAWING_RECTANGLE
) | (cmd_len
- 2);
1057 dw
[1] = y
<< 16 | x
;
1058 dw
[2] = ymax
<< 16 | xmax
;
1060 * There is no need to set the origin. It is intended to support front
1067 gen6_3DSTATE_POLY_STIPPLE_OFFSET(struct ilo_builder
*builder
,
1068 int x_offset
, int y_offset
)
1070 const uint8_t cmd_len
= 2;
1073 ILO_DEV_ASSERT(builder
->dev
, 6, 7.5);
1075 assert(x_offset
>= 0 && x_offset
<= 31);
1076 assert(y_offset
>= 0 && y_offset
<= 31);
1078 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
1080 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_POLY_STIPPLE_OFFSET
) | (cmd_len
- 2);
1081 dw
[1] = x_offset
<< 8 | y_offset
;
1085 gen6_3DSTATE_POLY_STIPPLE_PATTERN(struct ilo_builder
*builder
,
1086 const struct pipe_poly_stipple
*pattern
)
1088 const uint8_t cmd_len
= 33;
1092 ILO_DEV_ASSERT(builder
->dev
, 6, 7.5);
1094 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
1096 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_POLY_STIPPLE_PATTERN
) | (cmd_len
- 2);
1099 STATIC_ASSERT(Elements(pattern
->stipple
) == 32);
1100 for (i
= 0; i
< 32; i
++)
1101 dw
[i
] = pattern
->stipple
[i
];
1105 gen6_3DSTATE_LINE_STIPPLE(struct ilo_builder
*builder
,
1106 unsigned pattern
, unsigned factor
)
1108 const uint8_t cmd_len
= 3;
1112 ILO_DEV_ASSERT(builder
->dev
, 6, 7.5);
1114 assert((pattern
& 0xffff) == pattern
);
1115 assert(factor
>= 1 && factor
<= 256);
1117 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
1119 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_LINE_STIPPLE
) | (cmd_len
- 2);
1122 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7)) {
1124 inverse
= 65536 / factor
;
1126 dw
[2] = inverse
<< GEN7_LINE_STIPPLE_DW2_INVERSE_REPEAT_COUNT__SHIFT
|
1131 inverse
= 8192 / factor
;
1133 dw
[2] = inverse
<< GEN6_LINE_STIPPLE_DW2_INVERSE_REPEAT_COUNT__SHIFT
|
1139 gen6_3DSTATE_AA_LINE_PARAMETERS(struct ilo_builder
*builder
)
1141 const uint8_t cmd_len
= 3;
1142 const uint32_t dw
[3] = {
1143 GEN6_RENDER_CMD(3D
, 3DSTATE_AA_LINE_PARAMETERS
) | (cmd_len
- 2),
1144 0 << GEN6_AA_LINE_DW1_BIAS__SHIFT
| 0,
1145 0 << GEN6_AA_LINE_DW2_CAP_BIAS__SHIFT
| 0,
1148 ILO_DEV_ASSERT(builder
->dev
, 6, 7.5);
1150 ilo_builder_batch_write(builder
, cmd_len
, dw
);
1154 gen6_3DSTATE_DEPTH_BUFFER(struct ilo_builder
*builder
,
1155 const struct ilo_zs_surface
*zs
,
1158 const uint32_t cmd
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7)) ?
1159 GEN7_RENDER_CMD(3D
, 3DSTATE_DEPTH_BUFFER
) :
1160 GEN6_RENDER_CMD(3D
, 3DSTATE_DEPTH_BUFFER
);
1161 const uint8_t cmd_len
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) ? 8 : 7;
1165 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
1167 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
1169 dw
[0] = cmd
| (cmd_len
- 2);
1170 dw
[1] = zs
->payload
[0];
1173 /* see ilo_gpe_init_zs_surface() */
1174 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) {
1176 dw
[4] = (aligned_8x4
) ? zs
->dw_aligned_8x4
: zs
->payload
[2];
1177 dw
[5] = zs
->payload
[3];
1178 dw
[6] = zs
->payload
[4];
1179 dw
[7] = zs
->payload
[5];
1182 ilo_builder_batch_reloc64(builder
, pos
+ 2, zs
->bo
,
1183 zs
->payload
[1], INTEL_RELOC_WRITE
);
1186 dw
[3] = (aligned_8x4
) ? zs
->dw_aligned_8x4
: zs
->payload
[2];
1187 dw
[4] = zs
->payload
[3];
1188 dw
[5] = zs
->payload
[4];
1189 dw
[6] = zs
->payload
[5];
1192 ilo_builder_batch_reloc(builder
, pos
+ 2, zs
->bo
,
1193 zs
->payload
[1], INTEL_RELOC_WRITE
);
1199 gen6_3DSTATE_STENCIL_BUFFER(struct ilo_builder
*builder
,
1200 const struct ilo_zs_surface
*zs
)
1202 const uint32_t cmd
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7)) ?
1203 GEN7_RENDER_CMD(3D
, 3DSTATE_STENCIL_BUFFER
) :
1204 GEN6_RENDER_CMD(3D
, 3DSTATE_STENCIL_BUFFER
);
1205 const uint8_t cmd_len
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) ? 5 : 3;
1209 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
1211 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
1213 dw
[0] = cmd
| (cmd_len
- 2);
1214 /* see ilo_gpe_init_zs_surface() */
1215 dw
[1] = zs
->payload
[6];
1218 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) {
1220 dw
[4] = zs
->payload
[8];
1222 if (zs
->separate_s8_bo
) {
1223 ilo_builder_batch_reloc64(builder
, pos
+ 2,
1224 zs
->separate_s8_bo
, zs
->payload
[7], INTEL_RELOC_WRITE
);
1227 if (zs
->separate_s8_bo
) {
1228 ilo_builder_batch_reloc(builder
, pos
+ 2,
1229 zs
->separate_s8_bo
, zs
->payload
[7], INTEL_RELOC_WRITE
);
1235 gen6_3DSTATE_HIER_DEPTH_BUFFER(struct ilo_builder
*builder
,
1236 const struct ilo_zs_surface
*zs
)
1238 const uint32_t cmd
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7)) ?
1239 GEN7_RENDER_CMD(3D
, 3DSTATE_HIER_DEPTH_BUFFER
) :
1240 GEN6_RENDER_CMD(3D
, 3DSTATE_HIER_DEPTH_BUFFER
);
1241 const uint8_t cmd_len
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) ? 5 : 3;
1245 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
1247 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
1249 dw
[0] = cmd
| (cmd_len
- 2);
1250 /* see ilo_gpe_init_zs_surface() */
1251 dw
[1] = zs
->payload
[9];
1254 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) {
1256 dw
[4] = zs
->payload
[11];
1259 ilo_builder_batch_reloc64(builder
, pos
+ 2,
1260 zs
->hiz_bo
, zs
->payload
[10], INTEL_RELOC_WRITE
);
1264 ilo_builder_batch_reloc(builder
, pos
+ 2,
1265 zs
->hiz_bo
, zs
->payload
[10], INTEL_RELOC_WRITE
);
1271 gen6_3DSTATE_CLEAR_PARAMS(struct ilo_builder
*builder
,
1274 const uint8_t cmd_len
= 2;
1277 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
1279 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
1281 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_CLEAR_PARAMS
) |
1282 GEN6_CLEAR_PARAMS_DW0_VALID
|
1288 gen7_3DSTATE_CLEAR_PARAMS(struct ilo_builder
*builder
,
1291 const uint8_t cmd_len
= 3;
1294 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
1296 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
1298 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_CLEAR_PARAMS
) | (cmd_len
- 2);
1300 dw
[2] = GEN7_CLEAR_PARAMS_DW2_VALID
;
1304 gen6_3DSTATE_VIEWPORT_STATE_POINTERS(struct ilo_builder
*builder
,
1305 uint32_t clip_viewport
,
1306 uint32_t sf_viewport
,
1307 uint32_t cc_viewport
)
1309 const uint8_t cmd_len
= 4;
1312 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
1314 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
1316 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_VIEWPORT_STATE_POINTERS
) |
1317 GEN6_VP_PTR_DW0_CLIP_CHANGED
|
1318 GEN6_VP_PTR_DW0_SF_CHANGED
|
1319 GEN6_VP_PTR_DW0_CC_CHANGED
|
1321 dw
[1] = clip_viewport
;
1322 dw
[2] = sf_viewport
;
1323 dw
[3] = cc_viewport
;
1327 gen6_3DSTATE_SCISSOR_STATE_POINTERS(struct ilo_builder
*builder
,
1328 uint32_t scissor_rect
)
1330 const uint8_t cmd_len
= 2;
1333 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
1335 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
1337 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_SCISSOR_STATE_POINTERS
) |
1339 dw
[1] = scissor_rect
;
1343 gen6_3DSTATE_CC_STATE_POINTERS(struct ilo_builder
*builder
,
1344 uint32_t blend_state
,
1345 uint32_t depth_stencil_state
,
1346 uint32_t color_calc_state
)
1348 const uint8_t cmd_len
= 4;
1351 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
1353 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
1355 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_CC_STATE_POINTERS
) | (cmd_len
- 2);
1356 dw
[1] = blend_state
| GEN6_CC_PTR_DW1_BLEND_CHANGED
;
1357 dw
[2] = depth_stencil_state
| GEN6_CC_PTR_DW2_ZS_CHANGED
;
1358 dw
[3] = color_calc_state
| GEN6_CC_PTR_DW3_CC_CHANGED
;
1362 gen7_3DSTATE_VIEWPORT_STATE_POINTERS_SF_CLIP(struct ilo_builder
*builder
,
1363 uint32_t sf_clip_viewport
)
1365 gen7_3dstate_pointer(builder
,
1366 GEN7_RENDER_OPCODE_3DSTATE_VIEWPORT_STATE_POINTERS_SF_CLIP
,
1371 gen7_3DSTATE_VIEWPORT_STATE_POINTERS_CC(struct ilo_builder
*builder
,
1372 uint32_t cc_viewport
)
1374 gen7_3dstate_pointer(builder
,
1375 GEN7_RENDER_OPCODE_3DSTATE_VIEWPORT_STATE_POINTERS_CC
,
1380 gen7_3DSTATE_CC_STATE_POINTERS(struct ilo_builder
*builder
,
1381 uint32_t color_calc_state
)
1383 gen7_3dstate_pointer(builder
,
1384 GEN6_RENDER_OPCODE_3DSTATE_CC_STATE_POINTERS
, color_calc_state
);
1388 gen7_3DSTATE_DEPTH_STENCIL_STATE_POINTERS(struct ilo_builder
*builder
,
1389 uint32_t depth_stencil_state
)
1391 gen7_3dstate_pointer(builder
,
1392 GEN7_RENDER_OPCODE_3DSTATE_DEPTH_STENCIL_STATE_POINTERS
,
1393 depth_stencil_state
);
1397 gen7_3DSTATE_BLEND_STATE_POINTERS(struct ilo_builder
*builder
,
1398 uint32_t blend_state
)
1400 gen7_3dstate_pointer(builder
,
1401 GEN7_RENDER_OPCODE_3DSTATE_BLEND_STATE_POINTERS
,
1405 static inline uint32_t
1406 gen6_CLIP_VIEWPORT(struct ilo_builder
*builder
,
1407 const struct ilo_viewport_cso
*viewports
,
1408 unsigned num_viewports
)
1410 const int state_align
= 32;
1411 const int state_len
= 4 * num_viewports
;
1412 uint32_t state_offset
, *dw
;
1415 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
1418 * From the Sandy Bridge PRM, volume 2 part 1, page 193:
1420 * "The viewport-related state is stored as an array of up to 16
1423 assert(num_viewports
&& num_viewports
<= 16);
1425 state_offset
= ilo_builder_dynamic_pointer(builder
,
1426 ILO_BUILDER_ITEM_CLIP_VIEWPORT
, state_align
, state_len
, &dw
);
1428 for (i
= 0; i
< num_viewports
; i
++) {
1429 const struct ilo_viewport_cso
*vp
= &viewports
[i
];
1431 dw
[0] = fui(vp
->min_gbx
);
1432 dw
[1] = fui(vp
->max_gbx
);
1433 dw
[2] = fui(vp
->min_gby
);
1434 dw
[3] = fui(vp
->max_gby
);
1439 return state_offset
;
1442 static inline uint32_t
1443 gen6_SF_VIEWPORT(struct ilo_builder
*builder
,
1444 const struct ilo_viewport_cso
*viewports
,
1445 unsigned num_viewports
)
1447 const int state_align
= 32;
1448 const int state_len
= 8 * num_viewports
;
1449 uint32_t state_offset
, *dw
;
1452 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
1455 * From the Sandy Bridge PRM, volume 2 part 1, page 262:
1457 * "The viewport-specific state used by the SF unit (SF_VIEWPORT) is
1458 * stored as an array of up to 16 elements..."
1460 assert(num_viewports
&& num_viewports
<= 16);
1462 state_offset
= ilo_builder_dynamic_pointer(builder
,
1463 ILO_BUILDER_ITEM_SF_VIEWPORT
, state_align
, state_len
, &dw
);
1465 for (i
= 0; i
< num_viewports
; i
++) {
1466 const struct ilo_viewport_cso
*vp
= &viewports
[i
];
1468 dw
[0] = fui(vp
->m00
);
1469 dw
[1] = fui(vp
->m11
);
1470 dw
[2] = fui(vp
->m22
);
1471 dw
[3] = fui(vp
->m30
);
1472 dw
[4] = fui(vp
->m31
);
1473 dw
[5] = fui(vp
->m32
);
1480 return state_offset
;
1483 static inline uint32_t
1484 gen7_SF_CLIP_VIEWPORT(struct ilo_builder
*builder
,
1485 const struct ilo_viewport_cso
*viewports
,
1486 unsigned num_viewports
)
1488 const int state_align
= 64;
1489 const int state_len
= 16 * num_viewports
;
1490 uint32_t state_offset
, *dw
;
1493 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
1496 * From the Ivy Bridge PRM, volume 2 part 1, page 270:
1498 * "The viewport-specific state used by both the SF and CL units
1499 * (SF_CLIP_VIEWPORT) is stored as an array of up to 16 elements, each
1500 * of which contains the DWords described below. The start of each
1501 * element is spaced 16 DWords apart. The location of first element of
1502 * the array, as specified by both Pointer to SF_VIEWPORT and Pointer
1503 * to CLIP_VIEWPORT, is aligned to a 64-byte boundary."
1505 assert(num_viewports
&& num_viewports
<= 16);
1507 state_offset
= ilo_builder_dynamic_pointer(builder
,
1508 ILO_BUILDER_ITEM_SF_VIEWPORT
, state_align
, state_len
, &dw
);
1510 for (i
= 0; i
< num_viewports
; i
++) {
1511 const struct ilo_viewport_cso
*vp
= &viewports
[i
];
1513 dw
[0] = fui(vp
->m00
);
1514 dw
[1] = fui(vp
->m11
);
1515 dw
[2] = fui(vp
->m22
);
1516 dw
[3] = fui(vp
->m30
);
1517 dw
[4] = fui(vp
->m31
);
1518 dw
[5] = fui(vp
->m32
);
1522 dw
[8] = fui(vp
->min_gbx
);
1523 dw
[9] = fui(vp
->max_gbx
);
1524 dw
[10] = fui(vp
->min_gby
);
1525 dw
[11] = fui(vp
->max_gby
);
1527 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) {
1528 dw
[12] = fui(vp
->min_x
);
1529 dw
[13] = fui(vp
->max_x
- 1.0f
);
1530 dw
[14] = fui(vp
->min_y
);
1531 dw
[15] = fui(vp
->max_y
- 1.0f
);
1542 return state_offset
;
1545 static inline uint32_t
1546 gen6_CC_VIEWPORT(struct ilo_builder
*builder
,
1547 const struct ilo_viewport_cso
*viewports
,
1548 unsigned num_viewports
)
1550 const int state_align
= 32;
1551 const int state_len
= 2 * num_viewports
;
1552 uint32_t state_offset
, *dw
;
1555 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
1558 * From the Sandy Bridge PRM, volume 2 part 1, page 385:
1560 * "The viewport state is stored as an array of up to 16 elements..."
1562 assert(num_viewports
&& num_viewports
<= 16);
1564 state_offset
= ilo_builder_dynamic_pointer(builder
,
1565 ILO_BUILDER_ITEM_CC_VIEWPORT
, state_align
, state_len
, &dw
);
1567 for (i
= 0; i
< num_viewports
; i
++) {
1568 const struct ilo_viewport_cso
*vp
= &viewports
[i
];
1570 dw
[0] = fui(vp
->min_z
);
1571 dw
[1] = fui(vp
->max_z
);
1576 return state_offset
;
1579 static inline uint32_t
1580 gen6_SCISSOR_RECT(struct ilo_builder
*builder
,
1581 const struct ilo_scissor_state
*scissor
,
1582 unsigned num_viewports
)
1584 const int state_align
= 32;
1585 const int state_len
= 2 * num_viewports
;
1587 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
1590 * From the Sandy Bridge PRM, volume 2 part 1, page 263:
1592 * "The viewport-specific state used by the SF unit (SCISSOR_RECT) is
1593 * stored as an array of up to 16 elements..."
1595 assert(num_viewports
&& num_viewports
<= 16);
1596 assert(Elements(scissor
->payload
) >= state_len
);
1598 return ilo_builder_dynamic_write(builder
, ILO_BUILDER_ITEM_SCISSOR_RECT
,
1599 state_align
, state_len
, scissor
->payload
);
1602 static inline uint32_t
1603 gen6_COLOR_CALC_STATE(struct ilo_builder
*builder
,
1604 const struct pipe_stencil_ref
*stencil_ref
,
1606 const struct pipe_blend_color
*blend_color
)
1608 const int state_align
= 64;
1609 const int state_len
= 6;
1610 uint32_t state_offset
, *dw
;
1612 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
1614 state_offset
= ilo_builder_dynamic_pointer(builder
,
1615 ILO_BUILDER_ITEM_COLOR_CALC
, state_align
, state_len
, &dw
);
1617 dw
[0] = stencil_ref
->ref_value
[0] << 24 |
1618 stencil_ref
->ref_value
[1] << 16 |
1619 GEN6_CC_DW0_ALPHATEST_UNORM8
;
1621 dw
[2] = fui(blend_color
->color
[0]);
1622 dw
[3] = fui(blend_color
->color
[1]);
1623 dw
[4] = fui(blend_color
->color
[2]);
1624 dw
[5] = fui(blend_color
->color
[3]);
1626 return state_offset
;
1629 static inline uint32_t
1630 gen6_DEPTH_STENCIL_STATE(struct ilo_builder
*builder
,
1631 const struct ilo_dsa_state
*dsa
)
1633 const int state_align
= 64;
1634 const int state_len
= 3;
1636 ILO_DEV_ASSERT(builder
->dev
, 6, 7.5);
1638 STATIC_ASSERT(Elements(dsa
->payload
) >= state_len
);
1640 return ilo_builder_dynamic_write(builder
, ILO_BUILDER_ITEM_DEPTH_STENCIL
,
1641 state_align
, state_len
, dsa
->payload
);
1644 static inline uint32_t
1645 gen6_BLEND_STATE(struct ilo_builder
*builder
,
1646 const struct ilo_blend_state
*blend
,
1647 const struct ilo_fb_state
*fb
,
1648 const struct ilo_dsa_state
*dsa
)
1650 const int state_align
= 64;
1652 uint32_t state_offset
, *dw
;
1653 unsigned num_targets
, i
;
1655 ILO_DEV_ASSERT(builder
->dev
, 6, 7.5);
1658 * From the Sandy Bridge PRM, volume 2 part 1, page 376:
1660 * "The blend state is stored as an array of up to 8 elements..."
1662 num_targets
= fb
->state
.nr_cbufs
;
1663 assert(num_targets
<= 8);
1666 if (!dsa
->dw_blend_alpha
)
1668 /* to be able to reference alpha func */
1672 state_len
= 2 * num_targets
;
1674 state_offset
= ilo_builder_dynamic_pointer(builder
,
1675 ILO_BUILDER_ITEM_BLEND
, state_align
, state_len
, &dw
);
1677 for (i
= 0; i
< num_targets
; i
++) {
1678 const struct ilo_blend_cso
*cso
= &blend
->cso
[i
];
1680 dw
[0] = cso
->payload
[0];
1681 dw
[1] = cso
->payload
[1] | blend
->dw_shared
;
1683 if (i
< fb
->state
.nr_cbufs
&& fb
->state
.cbufs
[i
]) {
1684 const struct ilo_fb_blend_caps
*caps
= &fb
->blend_caps
[i
];
1686 if (caps
->can_blend
) {
1687 if (caps
->dst_alpha_forced_one
)
1688 dw
[0] |= cso
->dw_blend_dst_alpha_forced_one
;
1690 dw
[0] |= cso
->dw_blend
;
1693 if (caps
->can_logicop
)
1694 dw
[1] |= blend
->dw_logicop
;
1696 if (caps
->can_alpha_test
)
1697 dw
[1] |= dsa
->dw_blend_alpha
;
1699 dw
[1] |= GEN6_RT_DW1_WRITE_DISABLE_A
|
1700 GEN6_RT_DW1_WRITE_DISABLE_R
|
1701 GEN6_RT_DW1_WRITE_DISABLE_G
|
1702 GEN6_RT_DW1_WRITE_DISABLE_B
|
1703 dsa
->dw_blend_alpha
;
1707 * From the Sandy Bridge PRM, volume 2 part 1, page 356:
1709 * "When NumSamples = 1, AlphaToCoverage and AlphaToCoverage
1710 * Dither both must be disabled."
1712 * There is no such limitation on GEN7, or for AlphaToOne. But GL
1713 * requires that anyway.
1715 if (fb
->num_samples
> 1)
1716 dw
[1] |= blend
->dw_alpha_mod
;
1721 return state_offset
;
1724 static inline uint32_t
1725 gen8_BLEND_STATE(struct ilo_builder
*builder
,
1726 const struct ilo_blend_state
*blend
,
1727 const struct ilo_fb_state
*fb
,
1728 const struct ilo_dsa_state
*dsa
)
1730 const int state_align
= 64;
1732 uint32_t state_offset
, *dw
;
1735 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
1737 assert(fb
->state
.nr_cbufs
<= 8);
1739 /* may need to reference alpha func even when there is no color buffer */
1740 if (!fb
->state
.nr_cbufs
&& !dsa
->dw_blend_alpha
)
1743 state_len
= 1 + 2 * fb
->state
.nr_cbufs
;
1745 state_offset
= ilo_builder_dynamic_pointer(builder
,
1746 ILO_BUILDER_ITEM_BLEND
, state_align
, state_len
, &dw
);
1748 dw
[0] = blend
->dw_shared
;
1749 if (fb
->num_samples
> 1)
1750 dw
[0] |= blend
->dw_alpha_mod
;
1751 if (!fb
->state
.nr_cbufs
|| fb
->blend_caps
[0].can_alpha_test
)
1752 dw
[0] |= dsa
->dw_blend_alpha
;
1755 for (i
= 0; i
< fb
->state
.nr_cbufs
; i
++) {
1756 const struct ilo_fb_blend_caps
*caps
= &fb
->blend_caps
[i
];
1757 const struct ilo_blend_cso
*cso
= &blend
->cso
[i
];
1759 dw
[0] = cso
->payload
[0];
1760 dw
[1] = cso
->payload
[1];
1762 if (fb
->state
.cbufs
[i
]) {
1763 if (caps
->can_blend
) {
1764 if (caps
->dst_alpha_forced_one
)
1765 dw
[0] |= cso
->dw_blend_dst_alpha_forced_one
;
1767 dw
[0] |= cso
->dw_blend
;
1770 if (caps
->can_logicop
)
1771 dw
[1] |= blend
->dw_logicop
;
1773 dw
[0] |= GEN8_RT_DW0_WRITE_DISABLE_A
|
1774 GEN8_RT_DW0_WRITE_DISABLE_R
|
1775 GEN8_RT_DW0_WRITE_DISABLE_G
|
1776 GEN8_RT_DW0_WRITE_DISABLE_B
;
1782 return state_offset
;
1785 #endif /* ILO_BUILDER_3D_BOTTOM_H */