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 "../ilo_shader.h"
33 #include "intel_winsys.h"
37 #include "ilo_format.h"
38 #include "ilo_state_cc.h"
39 #include "ilo_state_raster.h"
40 #include "ilo_state_sbe.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_shader_state
*fs
,
204 bool dual_blend
, bool cc_may_kill
)
206 const uint8_t cmd_len
= 9;
207 const bool multisample
= false;
208 const int num_samples
= 1;
209 uint32_t dw2
, dw4
, dw5
, dw6
, *dw
;
211 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
214 /* see raster_set_gen6_3dstate_wm() */
220 const struct ilo_shader_cso
*cso
;
222 cso
= ilo_shader_get_kernel_cso(fs
);
223 /* see fs_init_cso_gen6() */
224 dw2
|= cso
->payload
[0];
225 dw4
|= cso
->payload
[1];
226 dw5
|= cso
->payload
[2];
227 dw6
|= cso
->payload
[3];
229 const int max_threads
= (builder
->dev
->gt
== 2) ? 80 : 40;
231 /* honor the valid range even if dispatching is disabled */
232 dw5
|= (max_threads
- 1) << GEN6_WM_DW5_MAX_THREADS__SHIFT
;
236 dw5
|= GEN6_WM_DW5_PS_KILL_PIXEL
| GEN6_WM_DW5_PS_DISPATCH_ENABLE
;
239 dw5
|= GEN6_WM_DW5_PS_DUAL_SOURCE_BLEND
;
241 if (multisample
&& num_samples
> 1)
242 dw6
|= GEN6_WM_DW6_MSDISPMODE_PERPIXEL
;
244 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
246 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_WM
) | (cmd_len
- 2);
247 dw
[1] = ilo_shader_get_kernel_offset(fs
);
249 dw
[3] = 0; /* scratch */
253 dw
[7] = 0; /* kernel 1 */
254 dw
[8] = 0; /* kernel 2 */
258 gen7_3DSTATE_WM(struct ilo_builder
*builder
,
259 const struct ilo_state_raster
*rs
,
260 const struct ilo_shader_state
*fs
,
263 const uint8_t cmd_len
= 3;
264 const bool multisample
= false;
265 const int num_samples
= 1;
266 uint32_t dw1
, dw2
, *dw
;
268 ILO_DEV_ASSERT(builder
->dev
, 7, 7.5);
270 /* see raster_set_gen8_3DSTATE_WM() */
274 const struct ilo_shader_cso
*cso
;
276 cso
= ilo_shader_get_kernel_cso(fs
);
277 /* see fs_init_cso_gen7() */
278 dw1
|= cso
->payload
[3];
282 dw1
|= GEN7_WM_DW1_PS_DISPATCH_ENABLE
| GEN7_WM_DW1_PS_KILL_PIXEL
;
285 if (multisample
&& num_samples
> 1)
286 dw2
|= GEN7_WM_DW2_MSDISPMODE_PERPIXEL
;
288 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
290 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_WM
) | (cmd_len
- 2);
296 gen8_3DSTATE_WM(struct ilo_builder
*builder
,
297 const struct ilo_state_raster
*rs
)
299 const uint8_t cmd_len
= 2;
302 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
304 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
306 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_WM
) | (cmd_len
- 2);
307 /* see raster_set_gen8_3DSTATE_WM() */
312 gen8_3DSTATE_WM_DEPTH_STENCIL(struct ilo_builder
*builder
,
313 const struct ilo_state_cc
*cc
)
315 const uint8_t cmd_len
= 3;
318 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
320 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
322 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_WM_DEPTH_STENCIL
) | (cmd_len
- 2);
323 /* see cc_set_gen8_3DSTATE_WM_DEPTH_STENCIL() */
329 gen8_3DSTATE_WM_HZ_OP(struct ilo_builder
*builder
,
330 const struct ilo_state_raster
*rs
,
331 uint16_t width
, uint16_t height
)
333 const uint8_t cmd_len
= 5;
336 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
338 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
340 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_WM_HZ_OP
) | (cmd_len
- 2);
341 /* see raster_set_gen8_3dstate_wm_hz_op() */
345 dw
[3] = height
<< 16 | width
;
350 gen8_disable_3DSTATE_WM_HZ_OP(struct ilo_builder
*builder
)
352 const uint8_t cmd_len
= 5;
355 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
357 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
359 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_WM_HZ_OP
) | (cmd_len
- 2);
367 gen8_3DSTATE_WM_CHROMAKEY(struct ilo_builder
*builder
)
369 const uint8_t cmd_len
= 2;
372 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
374 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
376 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_WM_CHROMAKEY
) | (cmd_len
- 2);
381 gen7_3DSTATE_PS(struct ilo_builder
*builder
,
382 const struct ilo_shader_state
*fs
,
385 const uint8_t cmd_len
= 8;
386 const struct ilo_shader_cso
*cso
;
387 uint32_t dw2
, dw4
, dw5
, *dw
;
389 ILO_DEV_ASSERT(builder
->dev
, 7, 7.5);
391 /* see fs_init_cso_gen7() */
392 cso
= ilo_shader_get_kernel_cso(fs
);
393 dw2
= cso
->payload
[0];
394 dw4
= cso
->payload
[1];
395 dw5
= cso
->payload
[2];
398 dw4
|= GEN7_PS_DW4_DUAL_SOURCE_BLEND
;
400 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
402 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_PS
) | (cmd_len
- 2);
403 dw
[1] = ilo_shader_get_kernel_offset(fs
);
405 dw
[3] = 0; /* scratch */
408 dw
[6] = 0; /* kernel 1 */
409 dw
[7] = 0; /* kernel 2 */
413 gen7_disable_3DSTATE_PS(struct ilo_builder
*builder
)
415 const uint8_t cmd_len
= 8;
419 ILO_DEV_ASSERT(builder
->dev
, 7, 7.5);
421 /* GPU hangs if none of the dispatch enable bits is set */
422 dw4
= GEN6_PS_DISPATCH_8
<< GEN7_PS_DW4_DISPATCH_MODE__SHIFT
;
424 /* see brwCreateContext() */
425 switch (ilo_dev_gen(builder
->dev
)) {
427 max_threads
= (builder
->dev
->gt
== 3) ? 408 :
428 (builder
->dev
->gt
== 2) ? 204 : 102;
429 dw4
|= (max_threads
- 1) << GEN75_PS_DW4_MAX_THREADS__SHIFT
;
433 max_threads
= (builder
->dev
->gt
== 2) ? 172 : 48;
434 dw4
|= (max_threads
- 1) << GEN7_PS_DW4_MAX_THREADS__SHIFT
;
438 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
440 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_PS
) | (cmd_len
- 2);
451 gen8_3DSTATE_PS(struct ilo_builder
*builder
,
452 const struct ilo_shader_state
*fs
)
454 const uint8_t cmd_len
= 12;
455 const struct ilo_shader_cso
*cso
;
456 uint32_t dw3
, dw6
, dw7
, *dw
;
458 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
460 /* see fs_init_cso_gen8() */
461 cso
= ilo_shader_get_kernel_cso(fs
);
462 dw3
= cso
->payload
[0];
463 dw6
= cso
->payload
[1];
464 dw7
= cso
->payload
[2];
466 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
468 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_PS
) | (cmd_len
- 2);
469 dw
[1] = ilo_shader_get_kernel_offset(fs
);
472 dw
[4] = 0; /* scratch */
476 dw
[8] = 0; /* kernel 1 */
478 dw
[10] = 0; /* kernel 2 */
483 gen8_3DSTATE_PS_EXTRA(struct ilo_builder
*builder
,
484 const struct ilo_shader_state
*fs
,
485 bool cc_may_kill
, bool per_sample
)
487 const uint8_t cmd_len
= 2;
488 const struct ilo_shader_cso
*cso
;
491 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
493 /* see fs_init_cso_gen8() */
494 cso
= ilo_shader_get_kernel_cso(fs
);
495 dw1
= cso
->payload
[3];
498 dw1
|= GEN8_PSX_DW1_VALID
| GEN8_PSX_DW1_KILL_PIXEL
;
500 dw1
|= GEN8_PSX_DW1_PER_SAMPLE
;
502 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
504 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_PS_EXTRA
) | (cmd_len
- 2);
509 gen8_3DSTATE_PS_BLEND(struct ilo_builder
*builder
,
510 const struct ilo_state_cc
*cc
)
512 const uint8_t cmd_len
= 2;
515 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
517 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
519 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_PS_BLEND
) | (cmd_len
- 2);
520 /* see cc_set_gen8_3DSTATE_PS_BLEND() */
521 dw
[1] = cc
->blend
[0];
525 gen6_3DSTATE_CONSTANT_PS(struct ilo_builder
*builder
,
526 const uint32_t *bufs
, const int *sizes
,
529 gen6_3dstate_constant(builder
, GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_PS
,
530 bufs
, sizes
, num_bufs
);
534 gen7_3DSTATE_CONSTANT_PS(struct ilo_builder
*builder
,
535 const uint32_t *bufs
, const int *sizes
,
538 gen7_3dstate_constant(builder
, GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_PS
,
539 bufs
, sizes
, num_bufs
);
543 gen7_3DSTATE_BINDING_TABLE_POINTERS_PS(struct ilo_builder
*builder
,
544 uint32_t binding_table
)
546 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
548 gen7_3dstate_pointer(builder
,
549 GEN7_RENDER_OPCODE_3DSTATE_BINDING_TABLE_POINTERS_PS
,
554 gen7_3DSTATE_SAMPLER_STATE_POINTERS_PS(struct ilo_builder
*builder
,
555 uint32_t sampler_state
)
557 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
559 gen7_3dstate_pointer(builder
,
560 GEN7_RENDER_OPCODE_3DSTATE_SAMPLER_STATE_POINTERS_PS
,
565 gen6_3DSTATE_MULTISAMPLE(struct ilo_builder
*builder
,
566 const struct ilo_state_raster
*rs
,
567 const uint32_t *pattern
, int pattern_len
)
569 const uint8_t cmd_len
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7)) ? 4 : 3;
572 ILO_DEV_ASSERT(builder
->dev
, 6, 7.5);
574 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
576 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_MULTISAMPLE
) | (cmd_len
- 2);
577 /* see raster_set_gen8_3DSTATE_MULTISAMPLE() */
578 dw
[1] = rs
->sample
[0];
580 assert(pattern_len
== 1 || pattern_len
== 2);
582 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7))
583 dw
[3] = (pattern_len
== 2) ? pattern
[1] : 0;
587 gen8_3DSTATE_MULTISAMPLE(struct ilo_builder
*builder
,
588 const struct ilo_state_raster
*rs
)
590 const uint8_t cmd_len
= 2;
593 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
595 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
597 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_MULTISAMPLE
) | (cmd_len
- 2);
598 /* see raster_set_gen8_3DSTATE_MULTISAMPLE() */
599 dw
[1] = rs
->sample
[0];
603 gen8_3DSTATE_SAMPLE_PATTERN(struct ilo_builder
*builder
,
604 const uint32_t *pattern_1x
,
605 const uint32_t *pattern_2x
,
606 const uint32_t *pattern_4x
,
607 const uint32_t *pattern_8x
,
608 const uint32_t *pattern_16x
)
610 const uint8_t cmd_len
= 9;
613 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
615 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
617 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_SAMPLE_PATTERN
) | (cmd_len
- 2);
618 dw
[1] = pattern_16x
[3];
619 dw
[2] = pattern_16x
[2];
620 dw
[3] = pattern_16x
[1];
621 dw
[4] = pattern_16x
[0];
622 dw
[5] = pattern_8x
[1];
623 dw
[6] = pattern_8x
[0];
624 dw
[7] = pattern_4x
[0];
625 dw
[8] = pattern_1x
[0] << 16 |
630 gen6_3DSTATE_SAMPLE_MASK(struct ilo_builder
*builder
,
631 const struct ilo_state_raster
*rs
)
633 const uint8_t cmd_len
= 2;
636 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
638 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
640 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_SAMPLE_MASK
) | (cmd_len
- 2);
641 /* see raster_set_gen6_3DSTATE_SAMPLE_MASK() */
642 dw
[1] = rs
->sample
[1];
646 gen6_3DSTATE_DRAWING_RECTANGLE(struct ilo_builder
*builder
,
647 unsigned x
, unsigned y
,
648 unsigned width
, unsigned height
)
650 const uint8_t cmd_len
= 4;
651 unsigned xmax
= x
+ width
- 1;
652 unsigned ymax
= y
+ height
- 1;
656 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
658 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7)) {
663 * From the Sandy Bridge PRM, volume 2 part 1, page 230:
665 * "[DevSNB] Errata: This field (Clipped Drawing Rectangle Y Min)
666 * must be an even number"
673 if (x
> rect_limit
) x
= rect_limit
;
674 if (y
> rect_limit
) y
= rect_limit
;
675 if (xmax
> rect_limit
) xmax
= rect_limit
;
676 if (ymax
> rect_limit
) ymax
= rect_limit
;
678 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
680 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_DRAWING_RECTANGLE
) | (cmd_len
- 2);
682 dw
[2] = ymax
<< 16 | xmax
;
684 * There is no need to set the origin. It is intended to support front
691 gen6_3DSTATE_POLY_STIPPLE_OFFSET(struct ilo_builder
*builder
,
692 int x_offset
, int y_offset
)
694 const uint8_t cmd_len
= 2;
697 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
699 assert(x_offset
>= 0 && x_offset
<= 31);
700 assert(y_offset
>= 0 && y_offset
<= 31);
702 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
704 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_POLY_STIPPLE_OFFSET
) | (cmd_len
- 2);
705 dw
[1] = x_offset
<< 8 | y_offset
;
709 gen6_3DSTATE_POLY_STIPPLE_PATTERN(struct ilo_builder
*builder
,
710 const struct pipe_poly_stipple
*pattern
)
712 const uint8_t cmd_len
= 33;
716 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
718 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
720 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_POLY_STIPPLE_PATTERN
) | (cmd_len
- 2);
723 STATIC_ASSERT(Elements(pattern
->stipple
) == 32);
724 for (i
= 0; i
< 32; i
++)
725 dw
[i
] = pattern
->stipple
[i
];
729 gen6_3DSTATE_LINE_STIPPLE(struct ilo_builder
*builder
,
730 unsigned pattern
, unsigned factor
)
732 const uint8_t cmd_len
= 3;
736 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
738 assert((pattern
& 0xffff) == pattern
);
739 assert(factor
>= 1 && factor
<= 256);
741 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
743 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_LINE_STIPPLE
) | (cmd_len
- 2);
746 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7)) {
748 inverse
= 65536 / factor
;
750 dw
[2] = inverse
<< GEN7_LINE_STIPPLE_DW2_INVERSE_REPEAT_COUNT__SHIFT
|
755 inverse
= 8192 / factor
;
757 dw
[2] = inverse
<< GEN6_LINE_STIPPLE_DW2_INVERSE_REPEAT_COUNT__SHIFT
|
763 gen6_3DSTATE_AA_LINE_PARAMETERS(struct ilo_builder
*builder
)
765 const uint8_t cmd_len
= 3;
766 const uint32_t dw
[3] = {
767 GEN6_RENDER_CMD(3D
, 3DSTATE_AA_LINE_PARAMETERS
) | (cmd_len
- 2),
768 0 << GEN6_AA_LINE_DW1_BIAS__SHIFT
| 0,
769 0 << GEN6_AA_LINE_DW2_CAP_BIAS__SHIFT
| 0,
772 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
774 ilo_builder_batch_write(builder
, cmd_len
, dw
);
778 gen6_3DSTATE_DEPTH_BUFFER(struct ilo_builder
*builder
,
779 const struct ilo_state_zs
*zs
)
781 const uint32_t cmd
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7)) ?
782 GEN7_RENDER_CMD(3D
, 3DSTATE_DEPTH_BUFFER
) :
783 GEN6_RENDER_CMD(3D
, 3DSTATE_DEPTH_BUFFER
);
784 const uint8_t cmd_len
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) ? 8 : 7;
788 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
790 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
792 dw
[0] = cmd
| (cmd_len
- 2);
795 * see zs_set_gen6_3DSTATE_DEPTH_BUFFER() and
796 * zs_set_gen7_3DSTATE_DEPTH_BUFFER()
798 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) {
799 dw
[1] = zs
->depth
[0];
802 dw
[4] = zs
->depth
[2];
803 dw
[5] = zs
->depth
[3];
805 dw
[7] = zs
->depth
[4];
807 dw
[5] |= builder
->mocs
<< GEN8_DEPTH_DW5_MOCS__SHIFT
;
810 ilo_builder_batch_reloc64(builder
, pos
+ 2, zs
->depth_bo
,
811 zs
->depth
[1], (zs
->z_readonly
) ? 0 : INTEL_RELOC_WRITE
);
814 dw
[1] = zs
->depth
[0];
816 dw
[3] = zs
->depth
[2];
817 dw
[4] = zs
->depth
[3];
819 dw
[6] = zs
->depth
[4];
821 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7))
822 dw
[4] |= builder
->mocs
<< GEN7_DEPTH_DW4_MOCS__SHIFT
;
824 dw
[6] |= builder
->mocs
<< GEN6_DEPTH_DW6_MOCS__SHIFT
;
827 ilo_builder_batch_reloc(builder
, pos
+ 2, zs
->depth_bo
,
828 zs
->depth
[1], (zs
->z_readonly
) ? 0 : INTEL_RELOC_WRITE
);
834 gen6_3DSTATE_STENCIL_BUFFER(struct ilo_builder
*builder
,
835 const struct ilo_state_zs
*zs
)
837 const uint32_t cmd
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7)) ?
838 GEN7_RENDER_CMD(3D
, 3DSTATE_STENCIL_BUFFER
) :
839 GEN6_RENDER_CMD(3D
, 3DSTATE_STENCIL_BUFFER
);
840 const uint8_t cmd_len
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) ? 5 : 3;
844 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
846 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
848 dw
[0] = cmd
| (cmd_len
- 2);
850 /* see zs_set_gen6_3DSTATE_STENCIL_BUFFER() */
851 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) {
852 dw
[1] = zs
->stencil
[0];
855 dw
[4] = zs
->stencil
[2];
857 dw
[1] |= builder
->mocs
<< GEN8_STENCIL_DW1_MOCS__SHIFT
;
859 if (zs
->stencil_bo
) {
860 ilo_builder_batch_reloc64(builder
, pos
+ 2, zs
->stencil_bo
,
861 zs
->stencil
[1], (zs
->s_readonly
) ? 0 : INTEL_RELOC_WRITE
);
864 dw
[1] = zs
->stencil
[0];
867 dw
[1] |= builder
->mocs
<< GEN6_STENCIL_DW1_MOCS__SHIFT
;
869 if (zs
->stencil_bo
) {
870 ilo_builder_batch_reloc(builder
, pos
+ 2, zs
->stencil_bo
,
871 zs
->stencil
[1], (zs
->s_readonly
) ? 0 : INTEL_RELOC_WRITE
);
877 gen6_3DSTATE_HIER_DEPTH_BUFFER(struct ilo_builder
*builder
,
878 const struct ilo_state_zs
*zs
)
880 const uint32_t cmd
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7)) ?
881 GEN7_RENDER_CMD(3D
, 3DSTATE_HIER_DEPTH_BUFFER
) :
882 GEN6_RENDER_CMD(3D
, 3DSTATE_HIER_DEPTH_BUFFER
);
883 const uint8_t cmd_len
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) ? 5 : 3;
887 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
889 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
891 dw
[0] = cmd
| (cmd_len
- 2);
893 /* see zs_set_gen6_3DSTATE_HIER_DEPTH_BUFFER() */
894 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) {
900 dw
[1] |= builder
->mocs
<< GEN8_HIZ_DW1_MOCS__SHIFT
;
903 ilo_builder_batch_reloc64(builder
, pos
+ 2, zs
->hiz_bo
,
904 zs
->hiz
[1], (zs
->z_readonly
) ? 0 : INTEL_RELOC_WRITE
);
910 dw
[1] |= builder
->mocs
<< GEN6_HIZ_DW1_MOCS__SHIFT
;
913 ilo_builder_batch_reloc(builder
, pos
+ 2, zs
->hiz_bo
,
914 zs
->hiz
[1], (zs
->z_readonly
) ? 0 : INTEL_RELOC_WRITE
);
920 gen6_3DSTATE_CLEAR_PARAMS(struct ilo_builder
*builder
,
923 const uint8_t cmd_len
= 2;
926 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
928 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
930 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_CLEAR_PARAMS
) |
931 GEN6_CLEAR_PARAMS_DW0_VALID
|
937 gen7_3DSTATE_CLEAR_PARAMS(struct ilo_builder
*builder
,
940 const uint8_t cmd_len
= 3;
943 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
945 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
947 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_CLEAR_PARAMS
) | (cmd_len
- 2);
949 dw
[2] = GEN7_CLEAR_PARAMS_DW2_VALID
;
953 gen6_3DSTATE_VIEWPORT_STATE_POINTERS(struct ilo_builder
*builder
,
954 uint32_t clip_viewport
,
955 uint32_t sf_viewport
,
956 uint32_t cc_viewport
)
958 const uint8_t cmd_len
= 4;
961 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
963 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
965 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_VIEWPORT_STATE_POINTERS
) |
966 GEN6_VP_PTR_DW0_CLIP_CHANGED
|
967 GEN6_VP_PTR_DW0_SF_CHANGED
|
968 GEN6_VP_PTR_DW0_CC_CHANGED
|
970 dw
[1] = clip_viewport
;
976 gen6_3DSTATE_SCISSOR_STATE_POINTERS(struct ilo_builder
*builder
,
977 uint32_t scissor_rect
)
979 const uint8_t cmd_len
= 2;
982 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
984 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
986 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_SCISSOR_STATE_POINTERS
) |
988 dw
[1] = scissor_rect
;
992 gen6_3DSTATE_CC_STATE_POINTERS(struct ilo_builder
*builder
,
993 uint32_t blend_state
,
994 uint32_t depth_stencil_state
,
995 uint32_t color_calc_state
)
997 const uint8_t cmd_len
= 4;
1000 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
1002 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
1004 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_CC_STATE_POINTERS
) | (cmd_len
- 2);
1005 dw
[1] = blend_state
| GEN6_CC_PTR_DW1_BLEND_CHANGED
;
1006 dw
[2] = depth_stencil_state
| GEN6_CC_PTR_DW2_ZS_CHANGED
;
1007 dw
[3] = color_calc_state
| GEN6_CC_PTR_DW3_CC_CHANGED
;
1011 gen7_3DSTATE_VIEWPORT_STATE_POINTERS_SF_CLIP(struct ilo_builder
*builder
,
1012 uint32_t sf_clip_viewport
)
1014 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
1016 gen7_3dstate_pointer(builder
,
1017 GEN7_RENDER_OPCODE_3DSTATE_VIEWPORT_STATE_POINTERS_SF_CLIP
,
1022 gen7_3DSTATE_VIEWPORT_STATE_POINTERS_CC(struct ilo_builder
*builder
,
1023 uint32_t cc_viewport
)
1025 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
1027 gen7_3dstate_pointer(builder
,
1028 GEN7_RENDER_OPCODE_3DSTATE_VIEWPORT_STATE_POINTERS_CC
,
1033 gen7_3DSTATE_CC_STATE_POINTERS(struct ilo_builder
*builder
,
1034 uint32_t color_calc_state
)
1036 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
1038 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8))
1039 color_calc_state
|= 1;
1041 gen7_3dstate_pointer(builder
,
1042 GEN6_RENDER_OPCODE_3DSTATE_CC_STATE_POINTERS
, color_calc_state
);
1046 gen7_3DSTATE_DEPTH_STENCIL_STATE_POINTERS(struct ilo_builder
*builder
,
1047 uint32_t depth_stencil_state
)
1049 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
1051 gen7_3dstate_pointer(builder
,
1052 GEN7_RENDER_OPCODE_3DSTATE_DEPTH_STENCIL_STATE_POINTERS
,
1053 depth_stencil_state
);
1057 gen7_3DSTATE_BLEND_STATE_POINTERS(struct ilo_builder
*builder
,
1058 uint32_t blend_state
)
1060 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
1062 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8))
1065 gen7_3dstate_pointer(builder
,
1066 GEN7_RENDER_OPCODE_3DSTATE_BLEND_STATE_POINTERS
,
1070 static inline uint32_t
1071 gen6_CLIP_VIEWPORT(struct ilo_builder
*builder
,
1072 const struct ilo_state_viewport
*vp
)
1074 const int state_align
= 32;
1075 const int state_len
= 4 * vp
->count
;
1076 uint32_t state_offset
, *dw
;
1079 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
1081 state_offset
= ilo_builder_dynamic_pointer(builder
,
1082 ILO_BUILDER_ITEM_CLIP_VIEWPORT
, state_align
, state_len
, &dw
);
1084 for (i
= 0; i
< vp
->count
; i
++) {
1085 /* see viewport_matrix_set_gen7_SF_CLIP_VIEWPORT() */
1086 dw
[0] = vp
->sf_clip
[i
][8];
1087 dw
[1] = vp
->sf_clip
[i
][9];
1088 dw
[2] = vp
->sf_clip
[i
][10];
1089 dw
[3] = vp
->sf_clip
[i
][11];
1094 return state_offset
;
1097 static inline uint32_t
1098 gen6_SF_VIEWPORT(struct ilo_builder
*builder
,
1099 const struct ilo_state_viewport
*vp
)
1101 const int state_align
= 32;
1102 const int state_len
= 8 * vp
->count
;
1103 uint32_t state_offset
, *dw
;
1106 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
1108 state_offset
= ilo_builder_dynamic_pointer(builder
,
1109 ILO_BUILDER_ITEM_SF_VIEWPORT
, state_align
, state_len
, &dw
);
1111 for (i
= 0; i
< vp
->count
; i
++) {
1112 /* see viewport_matrix_set_gen7_SF_CLIP_VIEWPORT() */
1113 memcpy(dw
, vp
->sf_clip
[i
], sizeof(*dw
) * 8);
1118 return state_offset
;
1121 static inline uint32_t
1122 gen7_SF_CLIP_VIEWPORT(struct ilo_builder
*builder
,
1123 const struct ilo_state_viewport
*vp
)
1125 const int state_align
= 64;
1126 const int state_len
= 16 * vp
->count
;
1128 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
1130 /* see viewport_matrix_set_gen7_SF_CLIP_VIEWPORT() */
1131 return ilo_builder_dynamic_write(builder
, ILO_BUILDER_ITEM_SF_VIEWPORT
,
1132 state_align
, state_len
, (const uint32_t *) vp
->sf_clip
);
1135 static inline uint32_t
1136 gen6_CC_VIEWPORT(struct ilo_builder
*builder
,
1137 const struct ilo_state_viewport
*vp
)
1139 const int state_align
= 32;
1140 const int state_len
= 2 * vp
->count
;
1142 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
1144 /* see viewport_matrix_set_gen6_CC_VIEWPORT() */
1145 return ilo_builder_dynamic_write(builder
, ILO_BUILDER_ITEM_CC_VIEWPORT
,
1146 state_align
, state_len
, (const uint32_t *) vp
->cc
);
1149 static inline uint32_t
1150 gen6_SCISSOR_RECT(struct ilo_builder
*builder
,
1151 const struct ilo_state_viewport
*vp
)
1153 const int state_align
= 32;
1154 const int state_len
= 2 * vp
->count
;
1156 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
1158 /* see viewport_scissor_set_gen6_SCISSOR_RECT() */
1159 return ilo_builder_dynamic_write(builder
, ILO_BUILDER_ITEM_SCISSOR_RECT
,
1160 state_align
, state_len
, (const uint32_t *) vp
->scissor
);
1163 static inline uint32_t
1164 gen6_COLOR_CALC_STATE(struct ilo_builder
*builder
,
1165 const struct ilo_state_cc
*cc
)
1167 const int state_align
= 64;
1168 const int state_len
= 6;
1170 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
1172 /* see cc_params_set_gen6_COLOR_CALC_STATE() */
1173 return ilo_builder_dynamic_write(builder
, ILO_BUILDER_ITEM_COLOR_CALC
,
1174 state_align
, state_len
, cc
->cc
);
1177 static inline uint32_t
1178 gen6_DEPTH_STENCIL_STATE(struct ilo_builder
*builder
,
1179 const struct ilo_state_cc
*cc
)
1181 const int state_align
= 64;
1182 const int state_len
= 3;
1184 ILO_DEV_ASSERT(builder
->dev
, 6, 7.5);
1186 /* see cc_set_gen6_DEPTH_STENCIL_STATE() */
1187 return ilo_builder_dynamic_write(builder
, ILO_BUILDER_ITEM_DEPTH_STENCIL
,
1188 state_align
, state_len
, cc
->ds
);
1191 static inline uint32_t
1192 gen6_BLEND_STATE(struct ilo_builder
*builder
,
1193 const struct ilo_state_cc
*cc
)
1195 const int state_align
= 64;
1196 const int state_len
= 2 * cc
->blend_state_count
;
1198 ILO_DEV_ASSERT(builder
->dev
, 6, 7.5);
1203 /* see cc_set_gen6_BLEND_STATE() */
1204 return ilo_builder_dynamic_write(builder
, ILO_BUILDER_ITEM_BLEND
,
1205 state_align
, state_len
, cc
->blend
);
1208 static inline uint32_t
1209 gen8_BLEND_STATE(struct ilo_builder
*builder
,
1210 const struct ilo_state_cc
*cc
)
1212 const int state_align
= 64;
1213 const int state_len
= 1 + 2 * cc
->blend_state_count
;
1215 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
1217 /* see cc_set_gen8_BLEND_STATE() */
1218 return ilo_builder_dynamic_write(builder
, ILO_BUILDER_ITEM_BLEND
,
1219 state_align
, state_len
, &cc
->blend
[1]);
1222 #endif /* ILO_BUILDER_3D_BOTTOM_H */