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_TOP_H
29 #define ILO_BUILDER_3D_TOP_H
31 #include "genhw/genhw.h"
32 #include "../ilo_resource.h"
33 #include "../ilo_state.h"
34 #include "intel_winsys.h"
38 #include "ilo_state_sampler.h"
39 #include "ilo_state_shader.h"
40 #include "ilo_state_sol.h"
41 #include "ilo_state_urb.h"
42 #include "ilo_state_vf.h"
43 #include "ilo_builder.h"
46 gen6_3DSTATE_URB(struct ilo_builder
*builder
,
47 const struct ilo_state_urb
*urb
)
49 const uint8_t cmd_len
= 3;
52 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
54 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_URB
) | (cmd_len
- 2);
55 /* see urb_set_gen6_3DSTATE_URB() */
61 gen7_3DSTATE_PUSH_CONSTANT_ALLOC_VS(struct ilo_builder
*builder
,
62 const struct ilo_state_urb
*urb
)
64 const uint8_t cmd_len
= 2;
67 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
69 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_PUSH_CONSTANT_ALLOC_VS
) |
71 /* see urb_set_gen7_3dstate_push_constant_alloc() */
76 gen7_3DSTATE_PUSH_CONSTANT_ALLOC_HS(struct ilo_builder
*builder
,
77 const struct ilo_state_urb
*urb
)
79 const uint8_t cmd_len
= 2;
82 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
84 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_PUSH_CONSTANT_ALLOC_HS
) |
86 /* see urb_set_gen7_3dstate_push_constant_alloc() */
91 gen7_3DSTATE_PUSH_CONSTANT_ALLOC_DS(struct ilo_builder
*builder
,
92 const struct ilo_state_urb
*urb
)
94 const uint8_t cmd_len
= 2;
97 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
99 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_PUSH_CONSTANT_ALLOC_DS
) |
101 /* see urb_set_gen7_3dstate_push_constant_alloc() */
106 gen7_3DSTATE_PUSH_CONSTANT_ALLOC_GS(struct ilo_builder
*builder
,
107 const struct ilo_state_urb
*urb
)
109 const uint8_t cmd_len
= 2;
112 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
114 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_PUSH_CONSTANT_ALLOC_GS
) |
116 /* see urb_set_gen7_3dstate_push_constant_alloc() */
121 gen7_3DSTATE_PUSH_CONSTANT_ALLOC_PS(struct ilo_builder
*builder
,
122 const struct ilo_state_urb
*urb
)
124 const uint8_t cmd_len
= 2;
127 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
129 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_PUSH_CONSTANT_ALLOC_PS
) |
131 /* see urb_set_gen7_3dstate_push_constant_alloc() */
136 gen7_3DSTATE_URB_VS(struct ilo_builder
*builder
,
137 const struct ilo_state_urb
*urb
)
139 const uint8_t cmd_len
= 2;
142 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
144 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_URB_VS
) | (cmd_len
- 2);
145 /* see urb_set_gen7_3dstate_push_constant_alloc() */
150 gen7_3DSTATE_URB_HS(struct ilo_builder
*builder
,
151 const struct ilo_state_urb
*urb
)
153 const uint8_t cmd_len
= 2;
156 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
158 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_URB_HS
) | (cmd_len
- 2);
159 /* see urb_set_gen7_3dstate_push_constant_alloc() */
164 gen7_3DSTATE_URB_DS(struct ilo_builder
*builder
,
165 const struct ilo_state_urb
*urb
)
167 const uint8_t cmd_len
= 2;
170 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
172 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_URB_DS
) | (cmd_len
- 2);
173 /* see urb_set_gen7_3dstate_push_constant_alloc() */
178 gen7_3DSTATE_URB_GS(struct ilo_builder
*builder
,
179 const struct ilo_state_urb
*urb
)
181 const uint8_t cmd_len
= 2;
184 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
186 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_URB_GS
) | (cmd_len
- 2);
187 /* see urb_set_gen7_3dstate_push_constant_alloc() */
192 gen75_3DSTATE_VF(struct ilo_builder
*builder
,
193 bool enable_cut_index
,
196 const uint8_t cmd_len
= 2;
199 ILO_DEV_ASSERT(builder
->dev
, 7.5, 8);
201 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
203 dw
[0] = GEN75_RENDER_CMD(3D
, 3DSTATE_VF
) | (cmd_len
- 2);
204 if (enable_cut_index
)
205 dw
[0] |= GEN75_VF_DW0_CUT_INDEX_ENABLE
;
211 gen6_3DSTATE_VF_STATISTICS(struct ilo_builder
*builder
,
214 const uint8_t cmd_len
= 1;
215 const uint32_t dw0
= GEN6_RENDER_CMD(SINGLE_DW
, 3DSTATE_VF_STATISTICS
) |
218 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
220 ilo_builder_batch_write(builder
, cmd_len
, &dw0
);
224 * Translate a pipe primitive type to the matching hardware primitive type.
227 gen6_3d_translate_pipe_prim(unsigned prim
)
229 static const int prim_mapping
[ILO_PRIM_MAX
] = {
230 [PIPE_PRIM_POINTS
] = GEN6_3DPRIM_POINTLIST
,
231 [PIPE_PRIM_LINES
] = GEN6_3DPRIM_LINELIST
,
232 [PIPE_PRIM_LINE_LOOP
] = GEN6_3DPRIM_LINELOOP
,
233 [PIPE_PRIM_LINE_STRIP
] = GEN6_3DPRIM_LINESTRIP
,
234 [PIPE_PRIM_TRIANGLES
] = GEN6_3DPRIM_TRILIST
,
235 [PIPE_PRIM_TRIANGLE_STRIP
] = GEN6_3DPRIM_TRISTRIP
,
236 [PIPE_PRIM_TRIANGLE_FAN
] = GEN6_3DPRIM_TRIFAN
,
237 [PIPE_PRIM_QUADS
] = GEN6_3DPRIM_QUADLIST
,
238 [PIPE_PRIM_QUAD_STRIP
] = GEN6_3DPRIM_QUADSTRIP
,
239 [PIPE_PRIM_POLYGON
] = GEN6_3DPRIM_POLYGON
,
240 [PIPE_PRIM_LINES_ADJACENCY
] = GEN6_3DPRIM_LINELIST_ADJ
,
241 [PIPE_PRIM_LINE_STRIP_ADJACENCY
] = GEN6_3DPRIM_LINESTRIP_ADJ
,
242 [PIPE_PRIM_TRIANGLES_ADJACENCY
] = GEN6_3DPRIM_TRILIST_ADJ
,
243 [PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY
] = GEN6_3DPRIM_TRISTRIP_ADJ
,
244 [ILO_PRIM_RECTANGLES
] = GEN6_3DPRIM_RECTLIST
,
247 assert(prim_mapping
[prim
]);
249 return prim_mapping
[prim
];
253 gen8_3DSTATE_VF_TOPOLOGY(struct ilo_builder
*builder
,
254 enum gen_3dprim_type topology
)
256 const uint8_t cmd_len
= 2;
259 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
261 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
263 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_VF_TOPOLOGY
) | (cmd_len
- 2);
264 dw
[1] = topology
<< GEN8_TOPOLOGY_DW1_TYPE__SHIFT
;
268 gen8_3DSTATE_VF_INSTANCING(struct ilo_builder
*builder
,
269 int vb_index
, uint32_t step_rate
)
271 const uint8_t cmd_len
= 3;
274 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
276 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
278 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_VF_INSTANCING
) | (cmd_len
- 2);
281 dw
[1] |= GEN8_INSTANCING_DW1_ENABLE
;
286 gen8_3DSTATE_VF_SGVS(struct ilo_builder
*builder
,
287 const struct ilo_state_vf
*vf
)
289 const uint8_t cmd_len
= 2;
292 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
294 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
296 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_VF_SGVS
) | (cmd_len
- 2);
297 /* see vf_params_set_gen8_3DSTATE_VF_SGVS() */
302 gen6_3DSTATE_VERTEX_BUFFERS(struct ilo_builder
*builder
,
303 const struct ilo_vb_state
*vb
,
304 const unsigned *vb_mapping
,
305 const unsigned *instance_divisors
,
310 unsigned pos
, hw_idx
;
312 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
315 * From the Sandy Bridge PRM, volume 2 part 1, page 82:
317 * "From 1 to 33 VBs can be specified..."
319 assert(vb_count
<= 33);
324 cmd_len
= 1 + 4 * vb_count
;
325 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
327 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_VERTEX_BUFFERS
) | (cmd_len
- 2);
331 for (hw_idx
= 0; hw_idx
< vb_count
; hw_idx
++) {
332 const unsigned instance_divisor
= instance_divisors
[hw_idx
];
333 const unsigned pipe_idx
= vb_mapping
[hw_idx
];
334 const struct pipe_vertex_buffer
*cso
= &vb
->states
[pipe_idx
];
336 dw
[0] = hw_idx
<< GEN6_VB_DW0_INDEX__SHIFT
;
338 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8))
339 dw
[0] |= builder
->mocs
<< GEN8_VB_DW0_MOCS__SHIFT
;
341 dw
[0] |= builder
->mocs
<< GEN6_VB_DW0_MOCS__SHIFT
;
343 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7))
344 dw
[0] |= GEN7_VB_DW0_ADDR_MODIFIED
;
346 if (instance_divisor
)
347 dw
[0] |= GEN6_VB_DW0_ACCESS_INSTANCEDATA
;
349 dw
[0] |= GEN6_VB_DW0_ACCESS_VERTEXDATA
;
351 /* use null vb if there is no buffer or the stride is out of range */
352 if (!cso
->buffer
|| cso
->stride
> 2048) {
353 dw
[0] |= GEN6_VB_DW0_IS_NULL
;
356 dw
[3] = (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) ?
357 0 : instance_divisor
;
362 dw
[0] |= cso
->stride
<< GEN6_VB_DW0_PITCH__SHIFT
;
364 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) {
365 const struct ilo_buffer
*buf
= ilo_buffer(cso
->buffer
);
366 const uint32_t start_offset
= cso
->buffer_offset
;
368 ilo_builder_batch_reloc64(builder
, pos
+ 1,
369 buf
->bo
, start_offset
, 0);
370 dw
[3] = buf
->bo_size
;
372 const struct ilo_buffer
*buf
= ilo_buffer(cso
->buffer
);
373 const uint32_t start_offset
= cso
->buffer_offset
;
374 const uint32_t end_offset
= buf
->bo_size
- 1;
376 dw
[3] = instance_divisor
;
378 ilo_builder_batch_reloc(builder
, pos
+ 1, buf
->bo
, start_offset
, 0);
379 ilo_builder_batch_reloc(builder
, pos
+ 2, buf
->bo
, end_offset
, 0);
387 /* the user vertex buffer must be uploaded with gen6_user_vertex_buffer() */
389 gen6_user_3DSTATE_VERTEX_BUFFERS(struct ilo_builder
*builder
,
390 uint32_t vb_begin
, uint32_t vb_end
,
393 const struct ilo_builder_writer
*bat
=
394 &builder
->writers
[ILO_BUILDER_WRITER_BATCH
];
395 const uint8_t cmd_len
= 1 + 4;
399 ILO_DEV_ASSERT(builder
->dev
, 6, 7.5);
401 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
403 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_VERTEX_BUFFERS
) | (cmd_len
- 2);
407 /* VERTEX_BUFFER_STATE */
408 dw
[0] = 0 << GEN6_VB_DW0_INDEX__SHIFT
|
409 GEN6_VB_DW0_ACCESS_VERTEXDATA
|
410 stride
<< GEN6_VB_DW0_PITCH__SHIFT
;
411 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7))
412 dw
[0] |= GEN7_VB_DW0_ADDR_MODIFIED
;
416 ilo_builder_batch_reloc(builder
, pos
+ 1, bat
->bo
, vb_begin
, 0);
417 ilo_builder_batch_reloc(builder
, pos
+ 2, bat
->bo
, vb_end
, 0);
421 gen6_3DSTATE_VERTEX_ELEMENTS(struct ilo_builder
*builder
,
422 const struct ilo_state_vf
*vf
)
427 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
429 cmd_len
= 1 + 2 * (vf
->internal_ve_count
+ vf
->user_ve_count
);
431 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
433 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_VERTEX_ELEMENTS
) | (cmd_len
- 2);
436 /* see vf_set_gen6_3DSTATE_VERTEX_ELEMENTS() */
437 if (vf
->internal_ve_count
) {
438 memcpy(dw
, vf
->internal_ve
,
439 sizeof(vf
->internal_ve
[0]) * vf
->internal_ve_count
);
440 dw
+= 2 * vf
->internal_ve_count
;
442 memcpy(dw
, vf
->user_ve
, sizeof(vf
->user_ve
[0]) * vf
->user_ve_count
);
446 gen6_3DSTATE_INDEX_BUFFER(struct ilo_builder
*builder
,
447 const struct ilo_ib_state
*ib
,
448 bool enable_cut_index
)
450 const uint8_t cmd_len
= 3;
451 struct ilo_buffer
*buf
= ilo_buffer(ib
->hw_resource
);
452 uint32_t start_offset
, end_offset
;
457 ILO_DEV_ASSERT(builder
->dev
, 6, 7.5);
462 /* this is moved to the new 3DSTATE_VF */
463 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7.5))
464 assert(!enable_cut_index
);
466 switch (ib
->hw_index_size
) {
468 format
= GEN6_IB_DW0_FORMAT_DWORD
;
471 format
= GEN6_IB_DW0_FORMAT_WORD
;
474 format
= GEN6_IB_DW0_FORMAT_BYTE
;
477 assert(!"unknown index size");
478 format
= GEN6_IB_DW0_FORMAT_BYTE
;
483 * set start_offset to 0 here and adjust pipe_draw_info::start with
484 * ib->draw_start_offset in 3DPRIMITIVE
487 end_offset
= buf
->bo_size
;
489 /* end_offset must also be aligned and is inclusive */
490 end_offset
-= (end_offset
% ib
->hw_index_size
);
493 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
495 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_INDEX_BUFFER
) | (cmd_len
- 2) |
496 builder
->mocs
<< GEN6_IB_DW0_MOCS__SHIFT
|
498 if (enable_cut_index
)
499 dw
[0] |= GEN6_IB_DW0_CUT_INDEX_ENABLE
;
501 ilo_builder_batch_reloc(builder
, pos
+ 1, buf
->bo
, start_offset
, 0);
502 ilo_builder_batch_reloc(builder
, pos
+ 2, buf
->bo
, end_offset
, 0);
506 gen8_3DSTATE_INDEX_BUFFER(struct ilo_builder
*builder
,
507 const struct ilo_ib_state
*ib
)
509 const uint8_t cmd_len
= 5;
510 struct ilo_buffer
*buf
= ilo_buffer(ib
->hw_resource
);
515 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
520 switch (ib
->hw_index_size
) {
522 format
= GEN8_IB_DW1_FORMAT_DWORD
;
525 format
= GEN8_IB_DW1_FORMAT_WORD
;
528 format
= GEN8_IB_DW1_FORMAT_BYTE
;
531 assert(!"unknown index size");
532 format
= GEN8_IB_DW1_FORMAT_BYTE
;
536 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
538 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_INDEX_BUFFER
) | (cmd_len
- 2);
540 builder
->mocs
<< GEN8_IB_DW1_MOCS__SHIFT
;
541 dw
[4] = buf
->bo_size
;
543 /* ignore ib->offset here in favor of adjusting 3DPRIMITIVE */
544 ilo_builder_batch_reloc64(builder
, pos
+ 2, buf
->bo
, 0, 0);
548 gen6_3DSTATE_VS(struct ilo_builder
*builder
,
549 const struct ilo_state_vs
*vs
,
550 uint32_t kernel_offset
)
552 const uint8_t cmd_len
= 6;
555 ILO_DEV_ASSERT(builder
->dev
, 6, 7.5);
557 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
559 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_VS
) | (cmd_len
- 2);
560 dw
[1] = kernel_offset
;
561 /* see vs_set_gen6_3DSTATE_VS() */
569 gen8_3DSTATE_VS(struct ilo_builder
*builder
,
570 const struct ilo_state_vs
*vs
,
571 uint32_t kernel_offset
)
573 const uint8_t cmd_len
= 9;
576 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
578 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
580 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_VS
) | (cmd_len
- 2);
581 dw
[1] = kernel_offset
;
583 /* see vs_set_gen6_3DSTATE_VS() */
593 gen7_3DSTATE_HS(struct ilo_builder
*builder
,
594 const struct ilo_state_hs
*hs
,
595 uint32_t kernel_offset
)
597 const uint8_t cmd_len
= 7;
600 ILO_DEV_ASSERT(builder
->dev
, 7, 7.5);
602 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
604 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_HS
) | (cmd_len
- 2);
605 /* see hs_set_gen7_3DSTATE_HS() */
608 dw
[3] = kernel_offset
;
615 gen8_3DSTATE_HS(struct ilo_builder
*builder
,
616 const struct ilo_state_hs
*hs
,
617 uint32_t kernel_offset
)
619 const uint8_t cmd_len
= 9;
622 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
624 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
626 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_HS
) | (cmd_len
- 2);
627 /* see hs_set_gen7_3DSTATE_HS() */
630 dw
[3] = kernel_offset
;
639 gen7_3DSTATE_TE(struct ilo_builder
*builder
,
640 const struct ilo_state_ds
*ds
)
642 const uint8_t cmd_len
= 4;
645 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
647 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
649 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_TE
) | (cmd_len
- 2);
650 /* see ds_set_gen7_3DSTATE_TE() */
657 gen7_3DSTATE_DS(struct ilo_builder
*builder
,
658 const struct ilo_state_ds
*ds
,
659 uint32_t kernel_offset
)
661 const uint8_t cmd_len
= 6;
664 ILO_DEV_ASSERT(builder
->dev
, 7, 7.5);
666 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
668 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_DS
) | (cmd_len
- 2);
669 /* see ds_set_gen7_3DSTATE_DS() */
670 dw
[1] = kernel_offset
;
678 gen8_3DSTATE_DS(struct ilo_builder
*builder
,
679 const struct ilo_state_ds
*ds
,
680 uint32_t kernel_offset
)
682 const uint8_t cmd_len
= 9;
685 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
687 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
689 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_DS
) | (cmd_len
- 2);
690 /* see ds_set_gen7_3DSTATE_DS() */
691 dw
[1] = kernel_offset
;
702 gen6_3DSTATE_GS(struct ilo_builder
*builder
,
703 const struct ilo_state_gs
*gs
,
704 uint32_t kernel_offset
)
706 const uint8_t cmd_len
= 7;
709 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
711 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
713 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_GS
) | (cmd_len
- 2);
714 dw
[1] = kernel_offset
;
715 /* see gs_set_gen6_3DSTATE_GS() */
724 gen6_3DSTATE_GS_SVB_INDEX(struct ilo_builder
*builder
,
725 int index
, unsigned svbi
,
727 bool load_vertex_count
)
729 const uint8_t cmd_len
= 4;
732 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
733 assert(index
>= 0 && index
< 4);
735 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
737 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_GS_SVB_INDEX
) | (cmd_len
- 2);
739 dw
[1] = index
<< GEN6_SVBI_DW1_INDEX__SHIFT
;
740 if (load_vertex_count
)
741 dw
[1] |= GEN6_SVBI_DW1_LOAD_INTERNAL_VERTEX_COUNT
;
748 gen7_3DSTATE_GS(struct ilo_builder
*builder
,
749 const struct ilo_state_gs
*gs
,
750 uint32_t kernel_offset
)
752 const uint8_t cmd_len
= 7;
755 ILO_DEV_ASSERT(builder
->dev
, 7, 7.5);
757 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
759 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_GS
) | (cmd_len
- 2);
760 dw
[1] = kernel_offset
;
761 /* see gs_set_gen7_3DSTATE_GS() */
770 gen8_3DSTATE_GS(struct ilo_builder
*builder
,
771 const struct ilo_state_gs
*gs
,
772 uint32_t kernel_offset
)
774 const uint8_t cmd_len
= 10;
777 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
779 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
781 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_GS
) | (cmd_len
- 2);
782 dw
[1] = kernel_offset
;
784 /* see gs_set_gen7_3DSTATE_GS() */
795 gen7_3DSTATE_STREAMOUT(struct ilo_builder
*builder
,
796 const struct ilo_state_sol
*sol
)
798 const uint8_t cmd_len
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) ? 5 : 3;
801 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
803 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
805 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_STREAMOUT
) | (cmd_len
- 2);
806 /* see sol_set_gen7_3DSTATE_STREAMOUT() */
809 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) {
816 gen7_3DSTATE_SO_DECL_LIST(struct ilo_builder
*builder
,
817 const struct ilo_state_sol
*sol
)
820 * Note that "DWord Length" has 9 bits for this command and the type of
821 * cmd_len cannot be uint8_t.
827 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
829 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7.5)) {
830 cmd_decl_count
= sol
->decl_count
;
833 * From the Ivy Bridge PRM, volume 2 part 1, page 201:
835 * "Errata: All 128 decls for all four streams must be included
836 * whenever this command is issued. The "Num Entries [n]" fields
837 * still contain the actual numbers of valid decls."
839 cmd_decl_count
= 128;
842 cmd_len
= 3 + 2 * cmd_decl_count
;
844 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
846 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_SO_DECL_LIST
) | (cmd_len
- 2);
847 /* see sol_set_gen7_3DSTATE_SO_DECL_LIST() */
850 memcpy(&dw
[3], sol
->decl
, sizeof(sol
->decl
[0]) * sol
->decl_count
);
852 if (sol
->decl_count
< cmd_decl_count
) {
853 memset(&dw
[3 + 2 * sol
->decl_count
], 0, sizeof(sol
->decl
[0]) *
854 cmd_decl_count
- sol
->decl_count
);
859 gen7_3DSTATE_SO_BUFFER(struct ilo_builder
*builder
, int index
, int stride
,
860 const struct pipe_stream_output_target
*so_target
)
862 const uint8_t cmd_len
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) ? 8 : 4;
863 struct ilo_buffer
*buf
;
868 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
870 buf
= ilo_buffer(so_target
->buffer
);
873 assert(stride
% 4 == 0);
874 assert(so_target
->buffer_offset
% 4 == 0);
877 start
= so_target
->buffer_offset
& ~3;
878 end
= (start
+ so_target
->buffer_size
) & ~3;
880 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
882 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_SO_BUFFER
) | (cmd_len
- 2);
883 dw
[1] = index
<< GEN7_SO_BUF_DW1_INDEX__SHIFT
|
886 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) {
887 dw
[1] |= builder
->mocs
<< GEN8_SO_BUF_DW1_MOCS__SHIFT
;
894 ilo_builder_batch_reloc64(builder
, pos
+ 2,
895 buf
->bo
, start
, INTEL_RELOC_WRITE
);
897 dw
[1] |= builder
->mocs
<< GEN7_SO_BUF_DW1_MOCS__SHIFT
;
899 ilo_builder_batch_reloc(builder
, pos
+ 2,
900 buf
->bo
, start
, INTEL_RELOC_WRITE
);
901 ilo_builder_batch_reloc(builder
, pos
+ 3,
902 buf
->bo
, end
, INTEL_RELOC_WRITE
);
907 gen7_disable_3DSTATE_SO_BUFFER(struct ilo_builder
*builder
, int index
)
909 const uint8_t cmd_len
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) ? 8 : 4;
912 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
914 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
916 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_SO_BUFFER
) | (cmd_len
- 2);
917 dw
[1] = index
<< GEN7_SO_BUF_DW1_INDEX__SHIFT
;
921 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) {
930 gen6_3DSTATE_BINDING_TABLE_POINTERS(struct ilo_builder
*builder
,
931 uint32_t vs_binding_table
,
932 uint32_t gs_binding_table
,
933 uint32_t ps_binding_table
)
935 const uint8_t cmd_len
= 4;
938 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
940 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
942 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_BINDING_TABLE_POINTERS
) |
943 GEN6_BINDING_TABLE_PTR_DW0_VS_CHANGED
|
944 GEN6_BINDING_TABLE_PTR_DW0_GS_CHANGED
|
945 GEN6_BINDING_TABLE_PTR_DW0_PS_CHANGED
|
947 dw
[1] = vs_binding_table
;
948 dw
[2] = gs_binding_table
;
949 dw
[3] = ps_binding_table
;
953 gen6_3DSTATE_SAMPLER_STATE_POINTERS(struct ilo_builder
*builder
,
954 uint32_t vs_sampler_state
,
955 uint32_t gs_sampler_state
,
956 uint32_t ps_sampler_state
)
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_SAMPLER_STATE_POINTERS
) |
966 GEN6_SAMPLER_PTR_DW0_VS_CHANGED
|
967 GEN6_SAMPLER_PTR_DW0_GS_CHANGED
|
968 GEN6_SAMPLER_PTR_DW0_PS_CHANGED
|
970 dw
[1] = vs_sampler_state
;
971 dw
[2] = gs_sampler_state
;
972 dw
[3] = ps_sampler_state
;
976 gen7_3dstate_pointer(struct ilo_builder
*builder
,
977 int subop
, uint32_t pointer
)
979 const uint32_t cmd
= GEN6_RENDER_TYPE_RENDER
|
980 GEN6_RENDER_SUBTYPE_3D
|
982 const uint8_t cmd_len
= 2;
985 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
987 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
989 dw
[0] = cmd
| (cmd_len
- 2);
994 gen7_3DSTATE_BINDING_TABLE_POINTERS_VS(struct ilo_builder
*builder
,
995 uint32_t binding_table
)
997 gen7_3dstate_pointer(builder
,
998 GEN7_RENDER_OPCODE_3DSTATE_BINDING_TABLE_POINTERS_VS
,
1003 gen7_3DSTATE_BINDING_TABLE_POINTERS_HS(struct ilo_builder
*builder
,
1004 uint32_t binding_table
)
1006 gen7_3dstate_pointer(builder
,
1007 GEN7_RENDER_OPCODE_3DSTATE_BINDING_TABLE_POINTERS_HS
,
1012 gen7_3DSTATE_BINDING_TABLE_POINTERS_DS(struct ilo_builder
*builder
,
1013 uint32_t binding_table
)
1015 gen7_3dstate_pointer(builder
,
1016 GEN7_RENDER_OPCODE_3DSTATE_BINDING_TABLE_POINTERS_DS
,
1021 gen7_3DSTATE_BINDING_TABLE_POINTERS_GS(struct ilo_builder
*builder
,
1022 uint32_t binding_table
)
1024 gen7_3dstate_pointer(builder
,
1025 GEN7_RENDER_OPCODE_3DSTATE_BINDING_TABLE_POINTERS_GS
,
1030 gen7_3DSTATE_SAMPLER_STATE_POINTERS_VS(struct ilo_builder
*builder
,
1031 uint32_t sampler_state
)
1033 gen7_3dstate_pointer(builder
,
1034 GEN7_RENDER_OPCODE_3DSTATE_SAMPLER_STATE_POINTERS_VS
,
1039 gen7_3DSTATE_SAMPLER_STATE_POINTERS_HS(struct ilo_builder
*builder
,
1040 uint32_t sampler_state
)
1042 gen7_3dstate_pointer(builder
,
1043 GEN7_RENDER_OPCODE_3DSTATE_SAMPLER_STATE_POINTERS_HS
,
1048 gen7_3DSTATE_SAMPLER_STATE_POINTERS_DS(struct ilo_builder
*builder
,
1049 uint32_t sampler_state
)
1051 gen7_3dstate_pointer(builder
,
1052 GEN7_RENDER_OPCODE_3DSTATE_SAMPLER_STATE_POINTERS_DS
,
1057 gen7_3DSTATE_SAMPLER_STATE_POINTERS_GS(struct ilo_builder
*builder
,
1058 uint32_t sampler_state
)
1060 gen7_3dstate_pointer(builder
,
1061 GEN7_RENDER_OPCODE_3DSTATE_SAMPLER_STATE_POINTERS_GS
,
1066 gen6_3dstate_constant(struct ilo_builder
*builder
, int subop
,
1067 const uint32_t *bufs
, const int *sizes
,
1070 const uint32_t cmd
= GEN6_RENDER_TYPE_RENDER
|
1071 GEN6_RENDER_SUBTYPE_3D
|
1073 const uint8_t cmd_len
= 5;
1074 unsigned buf_enabled
= 0x0;
1075 uint32_t buf_dw
[4], *dw
;
1076 int max_read_length
, total_read_length
;
1079 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
1081 assert(num_bufs
<= 4);
1084 * From the Sandy Bridge PRM, volume 2 part 1, page 138:
1086 * "(3DSTATE_CONSTANT_VS) The sum of all four read length fields (each
1087 * incremented to represent the actual read length) must be less than
1090 * From the Sandy Bridge PRM, volume 2 part 1, page 161:
1092 * "(3DSTATE_CONSTANT_GS) The sum of all four read length fields (each
1093 * incremented to represent the actual read length) must be less than
1096 * From the Sandy Bridge PRM, volume 2 part 1, page 287:
1098 * "(3DSTATE_CONSTANT_PS) The sum of all four read length fields (each
1099 * incremented to represent the actual read length) must be less than
1103 case GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_VS
:
1104 max_read_length
= 32;
1106 case GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_GS
:
1107 case GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_PS
:
1108 max_read_length
= 64;
1111 assert(!"unknown pcb subop");
1112 max_read_length
= 0;
1116 total_read_length
= 0;
1117 for (i
= 0; i
< 4; i
++) {
1118 if (i
< num_bufs
&& sizes
[i
]) {
1119 /* in 256-bit units */
1120 const int read_len
= (sizes
[i
] + 31) / 32;
1122 assert(bufs
[i
] % 32 == 0);
1123 assert(read_len
<= 32);
1125 buf_enabled
|= 1 << i
;
1126 buf_dw
[i
] = bufs
[i
] | (read_len
- 1);
1128 total_read_length
+= read_len
;
1134 assert(total_read_length
<= max_read_length
);
1136 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
1138 dw
[0] = cmd
| (cmd_len
- 2) |
1139 buf_enabled
<< GEN6_CONSTANT_DW0_BUFFER_ENABLES__SHIFT
|
1140 builder
->mocs
<< GEN6_CONSTANT_DW0_MOCS__SHIFT
;
1142 memcpy(&dw
[1], buf_dw
, sizeof(buf_dw
));
1146 gen6_3DSTATE_CONSTANT_VS(struct ilo_builder
*builder
,
1147 const uint32_t *bufs
, const int *sizes
,
1150 gen6_3dstate_constant(builder
, GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_VS
,
1151 bufs
, sizes
, num_bufs
);
1155 gen6_3DSTATE_CONSTANT_GS(struct ilo_builder
*builder
,
1156 const uint32_t *bufs
, const int *sizes
,
1159 gen6_3dstate_constant(builder
, GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_GS
,
1160 bufs
, sizes
, num_bufs
);
1164 gen7_3dstate_constant(struct ilo_builder
*builder
,
1166 const uint32_t *bufs
, const int *sizes
,
1169 const uint32_t cmd
= GEN6_RENDER_TYPE_RENDER
|
1170 GEN6_RENDER_SUBTYPE_3D
|
1172 const uint8_t cmd_len
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) ? 11 : 7;
1173 uint32_t payload
[6], *dw
;
1174 int total_read_length
, i
;
1176 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
1178 /* VS, HS, DS, GS, and PS variants */
1179 assert(subop
>= GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_VS
&&
1180 subop
<= GEN7_RENDER_OPCODE_3DSTATE_CONSTANT_DS
&&
1181 subop
!= GEN6_RENDER_OPCODE_3DSTATE_SAMPLE_MASK
);
1183 assert(num_bufs
<= 4);
1188 total_read_length
= 0;
1189 for (i
= 0; i
< 4; i
++) {
1193 * From the Ivy Bridge PRM, volume 2 part 1, page 112:
1195 * "Constant buffers must be enabled in order from Constant Buffer 0
1196 * to Constant Buffer 3 within this command. For example, it is
1197 * not allowed to enable Constant Buffer 1 by programming a
1198 * non-zero value in the VS Constant Buffer 1 Read Length without a
1199 * non-zero value in VS Constant Buffer 0 Read Length."
1201 if (i
>= num_bufs
|| !sizes
[i
]) {
1202 for (; i
< 4; i
++) {
1203 assert(i
>= num_bufs
|| !sizes
[i
]);
1209 /* read lengths are in 256-bit units */
1210 read_len
= (sizes
[i
] + 31) / 32;
1211 /* the lower 5 bits are used for memory object control state */
1212 assert(bufs
[i
] % 32 == 0);
1214 payload
[i
/ 2] |= read_len
<< ((i
% 2) ? 16 : 0);
1215 payload
[2 + i
] = bufs
[i
];
1217 total_read_length
+= read_len
;
1221 * From the Ivy Bridge PRM, volume 2 part 1, page 113:
1223 * "The sum of all four read length fields must be less than or equal
1224 * to the size of 64"
1226 assert(total_read_length
<= 64);
1228 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
1230 dw
[0] = cmd
| (cmd_len
- 2);
1231 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) {
1243 payload
[2] |= builder
->mocs
<< GEN7_CONSTANT_DW_ADDR_MOCS__SHIFT
;
1245 memcpy(&dw
[1], payload
, sizeof(payload
));
1250 gen7_3DSTATE_CONSTANT_VS(struct ilo_builder
*builder
,
1251 const uint32_t *bufs
, const int *sizes
,
1254 gen7_3dstate_constant(builder
, GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_VS
,
1255 bufs
, sizes
, num_bufs
);
1259 gen7_3DSTATE_CONSTANT_HS(struct ilo_builder
*builder
,
1260 const uint32_t *bufs
, const int *sizes
,
1263 gen7_3dstate_constant(builder
, GEN7_RENDER_OPCODE_3DSTATE_CONSTANT_HS
,
1264 bufs
, sizes
, num_bufs
);
1268 gen7_3DSTATE_CONSTANT_DS(struct ilo_builder
*builder
,
1269 const uint32_t *bufs
, const int *sizes
,
1272 gen7_3dstate_constant(builder
, GEN7_RENDER_OPCODE_3DSTATE_CONSTANT_DS
,
1273 bufs
, sizes
, num_bufs
);
1277 gen7_3DSTATE_CONSTANT_GS(struct ilo_builder
*builder
,
1278 const uint32_t *bufs
, const int *sizes
,
1281 gen7_3dstate_constant(builder
, GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_GS
,
1282 bufs
, sizes
, num_bufs
);
1285 static inline uint32_t
1286 gen6_BINDING_TABLE_STATE(struct ilo_builder
*builder
,
1287 const uint32_t *surface_states
,
1288 int num_surface_states
)
1290 const int state_align
= 32;
1291 const int state_len
= num_surface_states
;
1292 uint32_t state_offset
, *dw
;
1294 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
1297 * From the Sandy Bridge PRM, volume 4 part 1, page 69:
1299 * "It is stored as an array of up to 256 elements..."
1301 assert(num_surface_states
<= 256);
1303 if (!num_surface_states
)
1306 state_offset
= ilo_builder_surface_pointer(builder
,
1307 ILO_BUILDER_ITEM_BINDING_TABLE
, state_align
, state_len
, &dw
);
1308 memcpy(dw
, surface_states
, state_len
<< 2);
1310 return state_offset
;
1313 static inline uint32_t
1314 gen6_SURFACE_STATE(struct ilo_builder
*builder
,
1315 const struct ilo_state_surface
*surf
)
1317 int state_align
, state_len
;
1318 uint32_t state_offset
, *dw
;
1320 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
1322 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) {
1326 state_offset
= ilo_builder_surface_pointer(builder
,
1327 ILO_BUILDER_ITEM_SURFACE
, state_align
, state_len
, &dw
);
1328 memcpy(dw
, surf
->surface
, state_len
<< 2);
1331 const uint32_t mocs
= (surf
->scanout
) ?
1332 (GEN8_MOCS_MT_PTE
| GEN8_MOCS_CT_L3
) : builder
->mocs
;
1334 dw
[1] |= mocs
<< GEN8_SURFACE_DW1_MOCS__SHIFT
;
1336 ilo_builder_surface_reloc64(builder
, state_offset
, 8, surf
->bo
,
1337 surf
->surface
[8], (surf
->readonly
) ? 0 : INTEL_RELOC_WRITE
);
1341 state_len
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7)) ? 8 : 6;
1343 state_offset
= ilo_builder_surface_pointer(builder
,
1344 ILO_BUILDER_ITEM_SURFACE
, state_align
, state_len
, &dw
);
1345 memcpy(dw
, surf
->surface
, state_len
<< 2);
1349 * For scanouts, we should not enable caching in LLC. Since we only
1350 * enable that on Gen8+, we are fine here.
1352 dw
[5] |= builder
->mocs
<< GEN6_SURFACE_DW5_MOCS__SHIFT
;
1354 ilo_builder_surface_reloc(builder
, state_offset
, 1, surf
->bo
,
1355 surf
->surface
[1], (surf
->readonly
) ? 0 : INTEL_RELOC_WRITE
);
1359 return state_offset
;
1362 static inline uint32_t
1363 gen6_so_SURFACE_STATE(struct ilo_builder
*builder
,
1364 const struct pipe_stream_output_target
*so
,
1365 const struct pipe_stream_output_info
*so_info
,
1368 struct ilo_buffer
*buf
= ilo_buffer(so
->buffer
);
1369 struct ilo_state_surface_buffer_info info
;
1370 struct ilo_state_surface surf
;
1372 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
1374 memset(&info
, 0, sizeof(info
));
1376 info
.access
= ILO_STATE_SURFACE_ACCESS_DP_SVB
;
1378 switch (so_info
->output
[so_index
].num_components
) {
1380 info
.format
= GEN6_FORMAT_R32_FLOAT
;
1381 info
.format_size
= 4;
1384 info
.format
= GEN6_FORMAT_R32G32_FLOAT
;
1385 info
.format_size
= 8;
1388 info
.format
= GEN6_FORMAT_R32G32B32_FLOAT
;
1389 info
.format_size
= 12;
1392 info
.format
= GEN6_FORMAT_R32G32B32A32_FLOAT
;
1393 info
.format_size
= 16;
1396 assert(!"unexpected SO components length");
1397 info
.format
= GEN6_FORMAT_R32_FLOAT
;
1398 info
.format_size
= 4;
1403 so_info
->stride
[so_info
->output
[so_index
].output_buffer
] * 4;
1404 info
.offset
= so
->buffer_offset
+ so_info
->output
[so_index
].dst_offset
* 4;
1405 info
.size
= so
->buffer_size
- so_info
->output
[so_index
].dst_offset
* 4;
1407 memset(&surf
, 0, sizeof(surf
));
1408 ilo_state_surface_init_for_buffer(&surf
, builder
->dev
, &info
);
1409 surf
.bo
= info
.buf
->bo
;
1411 return gen6_SURFACE_STATE(builder
, &surf
);
1414 static inline uint32_t
1415 gen6_SAMPLER_STATE(struct ilo_builder
*builder
,
1416 const struct ilo_state_sampler
*samplers
,
1417 const uint32_t *sampler_border_colors
,
1420 const int state_align
= 32;
1421 const int state_len
= 4 * sampler_count
;
1422 uint32_t state_offset
, *dw
;
1425 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
1428 * From the Sandy Bridge PRM, volume 4 part 1, page 101:
1430 * "The sampler state is stored as an array of up to 16 elements..."
1432 assert(sampler_count
<= 16);
1438 * From the Sandy Bridge PRM, volume 2 part 1, page 132:
1440 * "(Sampler Count of 3DSTATE_VS) Specifies how many samplers (in
1441 * multiples of 4) the vertex shader 0 kernel uses. Used only for
1442 * prefetching the associated sampler state entries.
1444 * It also applies to other shader stages.
1446 ilo_builder_dynamic_pad_top(builder
, 4 * (4 - (sampler_count
% 4)));
1448 state_offset
= ilo_builder_dynamic_pointer(builder
,
1449 ILO_BUILDER_ITEM_SAMPLER
, state_align
, state_len
, &dw
);
1451 for (i
= 0; i
< sampler_count
; i
++) {
1452 /* see sampler_set_gen6_SAMPLER_STATE() */
1453 dw
[0] = samplers
[i
].sampler
[0];
1454 dw
[1] = samplers
[i
].sampler
[1];
1455 dw
[3] = samplers
[i
].sampler
[2];
1457 assert(!(sampler_border_colors
[i
] & 0x1f));
1458 dw
[2] = sampler_border_colors
[i
];
1463 return state_offset
;
1466 static inline uint32_t
1467 gen6_SAMPLER_BORDER_COLOR_STATE(struct ilo_builder
*builder
,
1468 const struct ilo_state_sampler_border
*border
)
1470 const int state_align
=
1471 (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) ? 64 : 32;
1472 const int state_len
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7)) ? 4 : 12;
1474 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
1477 * see border_set_gen6_SAMPLER_BORDER_COLOR_STATE() and
1478 * border_set_gen7_SAMPLER_BORDER_COLOR_STATE()
1480 return ilo_builder_dynamic_write(builder
, ILO_BUILDER_ITEM_BLOB
,
1481 state_align
, state_len
, border
->color
);
1484 static inline uint32_t
1485 gen6_push_constant_buffer(struct ilo_builder
*builder
,
1486 int size
, void **pcb
)
1489 * For all VS, GS, FS, and CS push constant buffers, they must be aligned
1490 * to 32 bytes, and their sizes are specified in 256-bit units.
1492 const int state_align
= 32;
1493 const int state_len
= align(size
, 32) / 4;
1494 uint32_t state_offset
;
1497 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
1499 state_offset
= ilo_builder_dynamic_pointer(builder
,
1500 ILO_BUILDER_ITEM_BLOB
, state_align
, state_len
, (uint32_t **) &buf
);
1502 /* zero out the unused range */
1503 if (size
< state_len
* 4)
1504 memset(&buf
[size
], 0, state_len
* 4 - size
);
1509 return state_offset
;
1512 static inline uint32_t
1513 gen6_user_vertex_buffer(struct ilo_builder
*builder
,
1514 int size
, const void *vertices
)
1516 const int state_align
= 8;
1517 const int state_len
= size
/ 4;
1519 ILO_DEV_ASSERT(builder
->dev
, 6, 7.5);
1521 assert(size
% 4 == 0);
1523 return ilo_builder_dynamic_write(builder
, ILO_BUILDER_ITEM_BLOB
,
1524 state_align
, state_len
, vertices
);
1527 #endif /* ILO_BUILDER_3D_TOP_H */