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 "intel_winsys.h"
36 #include "ilo_state_sampler.h"
37 #include "ilo_state_shader.h"
38 #include "ilo_state_sol.h"
39 #include "ilo_state_surface.h"
40 #include "ilo_state_urb.h"
41 #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 const struct ilo_state_vf
*vf
)
195 const uint8_t cmd_len
= 2;
198 ILO_DEV_ASSERT(builder
->dev
, 7.5, 8);
200 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
202 /* see vf_params_set_gen75_3DSTATE_VF() */
203 dw
[0] = GEN75_RENDER_CMD(3D
, 3DSTATE_VF
) | (cmd_len
- 2) |
209 gen6_3DSTATE_VF_STATISTICS(struct ilo_builder
*builder
,
212 const uint8_t cmd_len
= 1;
213 const uint32_t dw0
= GEN6_RENDER_CMD(SINGLE_DW
, 3DSTATE_VF_STATISTICS
) |
216 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
218 ilo_builder_batch_write(builder
, cmd_len
, &dw0
);
222 gen8_3DSTATE_VF_TOPOLOGY(struct ilo_builder
*builder
,
223 enum gen_3dprim_type topology
)
225 const uint8_t cmd_len
= 2;
228 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
230 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
232 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_VF_TOPOLOGY
) | (cmd_len
- 2);
233 dw
[1] = topology
<< GEN8_TOPOLOGY_DW1_TYPE__SHIFT
;
237 gen8_3DSTATE_VF_INSTANCING(struct ilo_builder
*builder
,
238 const struct ilo_state_vf
*vf
,
241 const uint8_t cmd_len
= 3;
244 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
246 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
248 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_VF_INSTANCING
) | (cmd_len
- 2);
249 dw
[1] = attr
<< GEN8_INSTANCING_DW1_VE_INDEX__SHIFT
;
251 /* see vf_set_gen8_3DSTATE_VF_INSTANCING() */
252 if (attr
>= vf
->internal_ve_count
) {
253 attr
-= vf
->internal_ve_count
;
255 dw
[1] |= vf
->user_instancing
[attr
][0];
256 dw
[2] |= vf
->user_instancing
[attr
][1];
261 gen8_3DSTATE_VF_SGVS(struct ilo_builder
*builder
,
262 const struct ilo_state_vf
*vf
)
264 const uint8_t cmd_len
= 2;
267 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
269 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
271 dw
[0] = GEN8_RENDER_CMD(3D
, 3DSTATE_VF_SGVS
) | (cmd_len
- 2);
272 /* see vf_params_set_gen8_3DSTATE_VF_SGVS() */
277 gen6_3DSTATE_VERTEX_BUFFERS(struct ilo_builder
*builder
,
278 const struct ilo_state_vf
*vf
,
279 const struct ilo_state_vertex_buffer
*vb
,
286 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
289 * From the Sandy Bridge PRM, volume 2 part 1, page 82:
291 * "From 1 to 33 VBs can be specified..."
293 assert(vb_count
<= 33);
298 cmd_len
= 1 + 4 * vb_count
;
299 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
301 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_VERTEX_BUFFERS
) | (cmd_len
- 2);
305 for (i
= 0; i
< vb_count
; i
++) {
306 const struct ilo_state_vertex_buffer
*b
= &vb
[i
];
308 /* see vertex_buffer_set_gen8_vertex_buffer_state() */
310 i
<< GEN6_VB_DW0_INDEX__SHIFT
;
312 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8))
313 dw
[0] |= builder
->mocs
<< GEN8_VB_DW0_MOCS__SHIFT
;
315 dw
[0] |= builder
->mocs
<< GEN6_VB_DW0_MOCS__SHIFT
;
321 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) {
323 ilo_builder_batch_reloc64(builder
, pos
+ 1, b
->vma
->bo
,
324 b
->vma
->bo_offset
+ b
->vb
[1], 0);
329 const int8_t elem
= vf
->vb_to_first_elem
[i
];
331 /* see vf_set_gen6_vertex_buffer_state() */
333 dw
[0] |= vf
->user_instancing
[elem
][0];
334 dw
[3] |= vf
->user_instancing
[elem
][1];
338 ilo_builder_batch_reloc(builder
, pos
+ 1, b
->vma
->bo
,
339 b
->vma
->bo_offset
+ b
->vb
[1], 0);
340 ilo_builder_batch_reloc(builder
, pos
+ 2, b
->vma
->bo
,
341 b
->vma
->bo_offset
+ b
->vb
[2], 0);
350 /* the user vertex buffer must be uploaded with gen6_user_vertex_buffer() */
352 gen6_user_3DSTATE_VERTEX_BUFFERS(struct ilo_builder
*builder
,
353 uint32_t vb_begin
, uint32_t vb_end
,
356 const struct ilo_builder_writer
*bat
=
357 &builder
->writers
[ILO_BUILDER_WRITER_BATCH
];
358 const uint8_t cmd_len
= 1 + 4;
362 ILO_DEV_ASSERT(builder
->dev
, 6, 7.5);
364 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
366 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_VERTEX_BUFFERS
) | (cmd_len
- 2);
370 /* VERTEX_BUFFER_STATE */
371 dw
[0] = 0 << GEN6_VB_DW0_INDEX__SHIFT
|
372 GEN6_VB_DW0_ACCESS_VERTEXDATA
|
373 stride
<< GEN6_VB_DW0_PITCH__SHIFT
;
374 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7))
375 dw
[0] |= GEN7_VB_DW0_ADDR_MODIFIED
;
379 ilo_builder_batch_reloc(builder
, pos
+ 1, bat
->bo
, vb_begin
, 0);
380 ilo_builder_batch_reloc(builder
, pos
+ 2, bat
->bo
, vb_end
, 0);
384 gen6_3DSTATE_VERTEX_ELEMENTS(struct ilo_builder
*builder
,
385 const struct ilo_state_vf
*vf
)
390 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
392 cmd_len
= 1 + 2 * (vf
->internal_ve_count
+ vf
->user_ve_count
);
394 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
396 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_VERTEX_ELEMENTS
) | (cmd_len
- 2);
400 * see vf_params_set_gen6_internal_ve() and
401 * vf_set_gen6_3DSTATE_VERTEX_ELEMENTS()
403 if (vf
->internal_ve_count
) {
404 memcpy(dw
, vf
->internal_ve
,
405 sizeof(vf
->internal_ve
[0]) * vf
->internal_ve_count
);
406 dw
+= 2 * vf
->internal_ve_count
;
409 memcpy(dw
, vf
->user_ve
, sizeof(vf
->user_ve
[0]) * vf
->user_ve_count
);
413 gen6_3DSTATE_INDEX_BUFFER(struct ilo_builder
*builder
,
414 const struct ilo_state_vf
*vf
,
415 const struct ilo_state_index_buffer
*ib
)
417 const uint8_t cmd_len
= 3;
421 ILO_DEV_ASSERT(builder
->dev
, 6, 7.5);
423 dw0
= GEN6_RENDER_CMD(3D
, 3DSTATE_INDEX_BUFFER
) | (cmd_len
- 2) |
424 builder
->mocs
<< GEN6_IB_DW0_MOCS__SHIFT
;
427 * see index_buffer_set_gen8_3DSTATE_INDEX_BUFFER() and
428 * vf_params_set_gen6_3dstate_index_buffer()
431 if (ilo_dev_gen(builder
->dev
) <= ILO_GEN(7))
434 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
438 ilo_builder_batch_reloc(builder
, pos
+ 1, ib
->vma
->bo
,
439 ib
->vma
->bo_offset
+ ib
->ib
[1], 0);
440 ilo_builder_batch_reloc(builder
, pos
+ 2, ib
->vma
->bo
,
441 ib
->vma
->bo_offset
+ ib
->ib
[2], 0);
449 gen8_3DSTATE_INDEX_BUFFER(struct ilo_builder
*builder
,
450 const struct ilo_state_vf
*vf
,
451 const struct ilo_state_index_buffer
*ib
)
453 const uint8_t cmd_len
= 5;
457 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
459 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
461 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_INDEX_BUFFER
) | (cmd_len
- 2);
462 /* see index_buffer_set_gen8_3DSTATE_INDEX_BUFFER() */
464 builder
->mocs
<< GEN8_IB_DW1_MOCS__SHIFT
;
467 ilo_builder_batch_reloc64(builder
, pos
+ 2, ib
->vma
->bo
,
468 ib
->vma
->bo_offset
+ ib
->ib
[1], 0);
478 gen6_3DSTATE_VS(struct ilo_builder
*builder
,
479 const struct ilo_state_vs
*vs
,
480 uint32_t kernel_offset
,
481 struct intel_bo
*scratch_bo
)
483 const uint8_t cmd_len
= 6;
487 ILO_DEV_ASSERT(builder
->dev
, 6, 7.5);
489 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
491 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_VS
) | (cmd_len
- 2);
492 dw
[1] = kernel_offset
;
493 /* see vs_set_gen6_3DSTATE_VS() */
499 if (ilo_state_vs_get_scratch_size(vs
)) {
500 ilo_builder_batch_reloc(builder
, pos
+ 3, scratch_bo
,
506 gen8_3DSTATE_VS(struct ilo_builder
*builder
,
507 const struct ilo_state_vs
*vs
,
508 uint32_t kernel_offset
,
509 struct intel_bo
*scratch_bo
)
511 const uint8_t cmd_len
= 9;
515 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
517 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
519 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_VS
) | (cmd_len
- 2);
520 dw
[1] = kernel_offset
;
522 /* see vs_set_gen6_3DSTATE_VS() */
530 if (ilo_state_vs_get_scratch_size(vs
)) {
531 ilo_builder_batch_reloc64(builder
, pos
+ 4, scratch_bo
,
537 gen7_3DSTATE_HS(struct ilo_builder
*builder
,
538 const struct ilo_state_hs
*hs
,
539 uint32_t kernel_offset
,
540 struct intel_bo
*scratch_bo
)
542 const uint8_t cmd_len
= 7;
546 ILO_DEV_ASSERT(builder
->dev
, 7, 7.5);
548 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
550 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_HS
) | (cmd_len
- 2);
551 /* see hs_set_gen7_3DSTATE_HS() */
554 dw
[3] = kernel_offset
;
559 if (ilo_state_hs_get_scratch_size(hs
)) {
560 ilo_builder_batch_reloc(builder
, pos
+ 4, scratch_bo
,
566 gen8_3DSTATE_HS(struct ilo_builder
*builder
,
567 const struct ilo_state_hs
*hs
,
568 uint32_t kernel_offset
,
569 struct intel_bo
*scratch_bo
)
571 const uint8_t cmd_len
= 9;
575 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
577 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
579 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_HS
) | (cmd_len
- 2);
580 /* see hs_set_gen7_3DSTATE_HS() */
583 dw
[3] = kernel_offset
;
590 if (ilo_state_hs_get_scratch_size(hs
)) {
591 ilo_builder_batch_reloc64(builder
, pos
+ 5, scratch_bo
,
597 gen7_3DSTATE_TE(struct ilo_builder
*builder
,
598 const struct ilo_state_ds
*ds
)
600 const uint8_t cmd_len
= 4;
603 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
605 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
607 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_TE
) | (cmd_len
- 2);
608 /* see ds_set_gen7_3DSTATE_TE() */
615 gen7_3DSTATE_DS(struct ilo_builder
*builder
,
616 const struct ilo_state_ds
*ds
,
617 uint32_t kernel_offset
,
618 struct intel_bo
*scratch_bo
)
620 const uint8_t cmd_len
= 6;
624 ILO_DEV_ASSERT(builder
->dev
, 7, 7.5);
626 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
628 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_DS
) | (cmd_len
- 2);
629 /* see ds_set_gen7_3DSTATE_DS() */
630 dw
[1] = kernel_offset
;
636 if (ilo_state_ds_get_scratch_size(ds
)) {
637 ilo_builder_batch_reloc(builder
, pos
+ 3, scratch_bo
,
643 gen8_3DSTATE_DS(struct ilo_builder
*builder
,
644 const struct ilo_state_ds
*ds
,
645 uint32_t kernel_offset
,
646 struct intel_bo
*scratch_bo
)
648 const uint8_t cmd_len
= 9;
652 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
654 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
656 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_DS
) | (cmd_len
- 2);
657 /* see ds_set_gen7_3DSTATE_DS() */
658 dw
[1] = kernel_offset
;
667 if (ilo_state_ds_get_scratch_size(ds
)) {
668 ilo_builder_batch_reloc64(builder
, pos
+ 4, scratch_bo
,
674 gen6_3DSTATE_GS(struct ilo_builder
*builder
,
675 const struct ilo_state_gs
*gs
,
676 uint32_t kernel_offset
,
677 struct intel_bo
*scratch_bo
)
679 const uint8_t cmd_len
= 7;
683 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
685 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
687 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_GS
) | (cmd_len
- 2);
688 dw
[1] = kernel_offset
;
689 /* see gs_set_gen6_3DSTATE_GS() */
696 if (ilo_state_gs_get_scratch_size(gs
)) {
697 ilo_builder_batch_reloc(builder
, pos
+ 3, scratch_bo
,
703 gen6_3DSTATE_GS_SVB_INDEX(struct ilo_builder
*builder
,
704 int index
, unsigned svbi
,
706 bool load_vertex_count
)
708 const uint8_t cmd_len
= 4;
711 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
712 assert(index
>= 0 && index
< 4);
714 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
716 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_GS_SVB_INDEX
) | (cmd_len
- 2);
718 dw
[1] = index
<< GEN6_SVBI_DW1_INDEX__SHIFT
;
719 if (load_vertex_count
)
720 dw
[1] |= GEN6_SVBI_DW1_LOAD_INTERNAL_VERTEX_COUNT
;
727 gen7_3DSTATE_GS(struct ilo_builder
*builder
,
728 const struct ilo_state_gs
*gs
,
729 uint32_t kernel_offset
,
730 struct intel_bo
*scratch_bo
)
732 const uint8_t cmd_len
= 7;
736 ILO_DEV_ASSERT(builder
->dev
, 7, 7.5);
738 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
740 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_GS
) | (cmd_len
- 2);
741 dw
[1] = kernel_offset
;
742 /* see gs_set_gen7_3DSTATE_GS() */
749 if (ilo_state_gs_get_scratch_size(gs
)) {
750 ilo_builder_batch_reloc(builder
, pos
+ 3, scratch_bo
,
756 gen8_3DSTATE_GS(struct ilo_builder
*builder
,
757 const struct ilo_state_gs
*gs
,
758 uint32_t kernel_offset
,
759 struct intel_bo
*scratch_bo
)
761 const uint8_t cmd_len
= 10;
765 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
767 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
769 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_GS
) | (cmd_len
- 2);
770 dw
[1] = kernel_offset
;
772 /* see gs_set_gen7_3DSTATE_GS() */
781 if (ilo_state_gs_get_scratch_size(gs
)) {
782 ilo_builder_batch_reloc64(builder
, pos
+ 4, scratch_bo
,
788 gen7_3DSTATE_STREAMOUT(struct ilo_builder
*builder
,
789 const struct ilo_state_sol
*sol
)
791 const uint8_t cmd_len
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) ? 5 : 3;
794 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
796 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
798 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_STREAMOUT
) | (cmd_len
- 2);
799 /* see sol_set_gen7_3DSTATE_STREAMOUT() */
800 dw
[1] = sol
->streamout
[0];
801 dw
[2] = sol
->streamout
[1];
802 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) {
803 dw
[3] = sol
->strides
[1] << GEN8_SO_DW3_BUFFER1_PITCH__SHIFT
|
804 sol
->strides
[0] << GEN8_SO_DW3_BUFFER0_PITCH__SHIFT
;
805 dw
[4] = sol
->strides
[3] << GEN8_SO_DW4_BUFFER3_PITCH__SHIFT
|
806 sol
->strides
[2] << GEN8_SO_DW4_BUFFER2_PITCH__SHIFT
;
811 gen7_3DSTATE_SO_DECL_LIST(struct ilo_builder
*builder
,
812 const struct ilo_state_sol
*sol
)
815 * Note that "DWord Length" has 9 bits for this command and the type of
816 * cmd_len cannot be uint8_t.
822 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
824 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7.5)) {
825 cmd_decl_count
= sol
->decl_count
;
828 * From the Ivy Bridge PRM, volume 2 part 1, page 201:
830 * "Errata: All 128 decls for all four streams must be included
831 * whenever this command is issued. The "Num Entries [n]" fields
832 * still contain the actual numbers of valid decls."
834 cmd_decl_count
= 128;
837 cmd_len
= 3 + 2 * cmd_decl_count
;
839 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
841 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_SO_DECL_LIST
) | (cmd_len
- 2);
842 /* see sol_set_gen7_3DSTATE_SO_DECL_LIST() */
843 dw
[1] = sol
->so_decl
[0];
844 dw
[2] = sol
->so_decl
[1];
845 memcpy(&dw
[3], sol
->decl
, sizeof(sol
->decl
[0]) * sol
->decl_count
);
847 if (sol
->decl_count
< cmd_decl_count
) {
848 memset(&dw
[3 + 2 * sol
->decl_count
], 0, sizeof(sol
->decl
[0]) *
849 cmd_decl_count
- sol
->decl_count
);
854 gen7_3DSTATE_SO_BUFFER(struct ilo_builder
*builder
,
855 const struct ilo_state_sol
*sol
,
856 const struct ilo_state_sol_buffer
*sb
,
859 const uint8_t cmd_len
= 4;
863 ILO_DEV_ASSERT(builder
->dev
, 7, 7.5);
865 assert(buffer
< ILO_STATE_SOL_MAX_BUFFER_COUNT
);
867 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
869 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_SO_BUFFER
) | (cmd_len
- 2);
870 /* see sol_buffer_set_gen7_3dstate_so_buffer() */
871 dw
[1] = buffer
<< GEN7_SO_BUF_DW1_INDEX__SHIFT
|
872 builder
->mocs
<< GEN7_SO_BUF_DW1_MOCS__SHIFT
|
873 sol
->strides
[buffer
] << GEN7_SO_BUF_DW1_PITCH__SHIFT
;
876 ilo_builder_batch_reloc(builder
, pos
+ 2, sb
->vma
->bo
,
877 sb
->vma
->bo_offset
+ sb
->so_buf
[0], INTEL_RELOC_WRITE
);
878 ilo_builder_batch_reloc(builder
, pos
+ 3, sb
->vma
->bo
,
879 sb
->vma
->bo_offset
+ sb
->so_buf
[1], INTEL_RELOC_WRITE
);
887 gen8_3DSTATE_SO_BUFFER(struct ilo_builder
*builder
,
888 const struct ilo_state_sol
*sol
,
889 const struct ilo_state_sol_buffer
*sb
,
892 const uint8_t cmd_len
= 8;
896 ILO_DEV_ASSERT(builder
->dev
, 8, 8);
898 pos
= ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
900 dw
[0] = GEN7_RENDER_CMD(3D
, 3DSTATE_SO_BUFFER
) | (cmd_len
- 2);
901 /* see sol_buffer_set_gen8_3dstate_so_buffer() */
902 dw
[1] = sb
->so_buf
[0] |
903 buffer
<< GEN7_SO_BUF_DW1_INDEX__SHIFT
|
904 builder
->mocs
<< GEN8_SO_BUF_DW1_MOCS__SHIFT
;
907 ilo_builder_batch_reloc64(builder
, pos
+ 2, sb
->vma
->bo
,
908 sb
->vma
->bo_offset
+ sb
->so_buf
[1], INTEL_RELOC_WRITE
);
914 dw
[4] = sb
->so_buf
[2];
916 if (sb
->write_offset_vma
) {
917 ilo_builder_batch_reloc64(builder
, pos
+ 5, sb
->write_offset_vma
->bo
,
918 sb
->write_offset_vma
->bo_offset
+ sizeof(uint32_t) * buffer
,
925 dw
[7] = sb
->so_buf
[3];
929 gen6_3DSTATE_BINDING_TABLE_POINTERS(struct ilo_builder
*builder
,
930 uint32_t vs_binding_table
,
931 uint32_t gs_binding_table
,
932 uint32_t ps_binding_table
)
934 const uint8_t cmd_len
= 4;
937 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
939 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
941 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_BINDING_TABLE_POINTERS
) |
942 GEN6_BINDING_TABLE_PTR_DW0_VS_CHANGED
|
943 GEN6_BINDING_TABLE_PTR_DW0_GS_CHANGED
|
944 GEN6_BINDING_TABLE_PTR_DW0_PS_CHANGED
|
946 dw
[1] = vs_binding_table
;
947 dw
[2] = gs_binding_table
;
948 dw
[3] = ps_binding_table
;
952 gen6_3DSTATE_SAMPLER_STATE_POINTERS(struct ilo_builder
*builder
,
953 uint32_t vs_sampler_state
,
954 uint32_t gs_sampler_state
,
955 uint32_t ps_sampler_state
)
957 const uint8_t cmd_len
= 4;
960 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
962 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
964 dw
[0] = GEN6_RENDER_CMD(3D
, 3DSTATE_SAMPLER_STATE_POINTERS
) |
965 GEN6_SAMPLER_PTR_DW0_VS_CHANGED
|
966 GEN6_SAMPLER_PTR_DW0_GS_CHANGED
|
967 GEN6_SAMPLER_PTR_DW0_PS_CHANGED
|
969 dw
[1] = vs_sampler_state
;
970 dw
[2] = gs_sampler_state
;
971 dw
[3] = ps_sampler_state
;
975 gen7_3dstate_pointer(struct ilo_builder
*builder
,
976 int subop
, uint32_t pointer
)
978 const uint32_t cmd
= GEN6_RENDER_TYPE_RENDER
|
979 GEN6_RENDER_SUBTYPE_3D
|
981 const uint8_t cmd_len
= 2;
984 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
986 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
988 dw
[0] = cmd
| (cmd_len
- 2);
993 gen7_3DSTATE_BINDING_TABLE_POINTERS_VS(struct ilo_builder
*builder
,
994 uint32_t binding_table
)
996 gen7_3dstate_pointer(builder
,
997 GEN7_RENDER_OPCODE_3DSTATE_BINDING_TABLE_POINTERS_VS
,
1002 gen7_3DSTATE_BINDING_TABLE_POINTERS_HS(struct ilo_builder
*builder
,
1003 uint32_t binding_table
)
1005 gen7_3dstate_pointer(builder
,
1006 GEN7_RENDER_OPCODE_3DSTATE_BINDING_TABLE_POINTERS_HS
,
1011 gen7_3DSTATE_BINDING_TABLE_POINTERS_DS(struct ilo_builder
*builder
,
1012 uint32_t binding_table
)
1014 gen7_3dstate_pointer(builder
,
1015 GEN7_RENDER_OPCODE_3DSTATE_BINDING_TABLE_POINTERS_DS
,
1020 gen7_3DSTATE_BINDING_TABLE_POINTERS_GS(struct ilo_builder
*builder
,
1021 uint32_t binding_table
)
1023 gen7_3dstate_pointer(builder
,
1024 GEN7_RENDER_OPCODE_3DSTATE_BINDING_TABLE_POINTERS_GS
,
1029 gen7_3DSTATE_SAMPLER_STATE_POINTERS_VS(struct ilo_builder
*builder
,
1030 uint32_t sampler_state
)
1032 gen7_3dstate_pointer(builder
,
1033 GEN7_RENDER_OPCODE_3DSTATE_SAMPLER_STATE_POINTERS_VS
,
1038 gen7_3DSTATE_SAMPLER_STATE_POINTERS_HS(struct ilo_builder
*builder
,
1039 uint32_t sampler_state
)
1041 gen7_3dstate_pointer(builder
,
1042 GEN7_RENDER_OPCODE_3DSTATE_SAMPLER_STATE_POINTERS_HS
,
1047 gen7_3DSTATE_SAMPLER_STATE_POINTERS_DS(struct ilo_builder
*builder
,
1048 uint32_t sampler_state
)
1050 gen7_3dstate_pointer(builder
,
1051 GEN7_RENDER_OPCODE_3DSTATE_SAMPLER_STATE_POINTERS_DS
,
1056 gen7_3DSTATE_SAMPLER_STATE_POINTERS_GS(struct ilo_builder
*builder
,
1057 uint32_t sampler_state
)
1059 gen7_3dstate_pointer(builder
,
1060 GEN7_RENDER_OPCODE_3DSTATE_SAMPLER_STATE_POINTERS_GS
,
1065 gen6_3dstate_constant(struct ilo_builder
*builder
, int subop
,
1066 const uint32_t *bufs
, const int *sizes
,
1069 const uint32_t cmd
= GEN6_RENDER_TYPE_RENDER
|
1070 GEN6_RENDER_SUBTYPE_3D
|
1072 const uint8_t cmd_len
= 5;
1073 unsigned buf_enabled
= 0x0;
1074 uint32_t buf_dw
[4], *dw
;
1075 int max_read_length
, total_read_length
;
1078 ILO_DEV_ASSERT(builder
->dev
, 6, 6);
1080 assert(num_bufs
<= 4);
1083 * From the Sandy Bridge PRM, volume 2 part 1, page 138:
1085 * "(3DSTATE_CONSTANT_VS) The sum of all four read length fields (each
1086 * incremented to represent the actual read length) must be less than
1089 * From the Sandy Bridge PRM, volume 2 part 1, page 161:
1091 * "(3DSTATE_CONSTANT_GS) The sum of all four read length fields (each
1092 * incremented to represent the actual read length) must be less than
1095 * From the Sandy Bridge PRM, volume 2 part 1, page 287:
1097 * "(3DSTATE_CONSTANT_PS) The sum of all four read length fields (each
1098 * incremented to represent the actual read length) must be less than
1102 case GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_VS
:
1103 max_read_length
= 32;
1105 case GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_GS
:
1106 case GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_PS
:
1107 max_read_length
= 64;
1110 assert(!"unknown pcb subop");
1111 max_read_length
= 0;
1115 total_read_length
= 0;
1116 for (i
= 0; i
< 4; i
++) {
1117 if (i
< num_bufs
&& sizes
[i
]) {
1118 /* in 256-bit units */
1119 const int read_len
= (sizes
[i
] + 31) / 32;
1121 assert(bufs
[i
] % 32 == 0);
1122 assert(read_len
<= 32);
1124 buf_enabled
|= 1 << i
;
1125 buf_dw
[i
] = bufs
[i
] | (read_len
- 1);
1127 total_read_length
+= read_len
;
1133 assert(total_read_length
<= max_read_length
);
1135 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
1137 dw
[0] = cmd
| (cmd_len
- 2) |
1138 buf_enabled
<< GEN6_CONSTANT_DW0_BUFFER_ENABLES__SHIFT
|
1139 builder
->mocs
<< GEN6_CONSTANT_DW0_MOCS__SHIFT
;
1141 memcpy(&dw
[1], buf_dw
, sizeof(buf_dw
));
1145 gen6_3DSTATE_CONSTANT_VS(struct ilo_builder
*builder
,
1146 const uint32_t *bufs
, const int *sizes
,
1149 gen6_3dstate_constant(builder
, GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_VS
,
1150 bufs
, sizes
, num_bufs
);
1154 gen6_3DSTATE_CONSTANT_GS(struct ilo_builder
*builder
,
1155 const uint32_t *bufs
, const int *sizes
,
1158 gen6_3dstate_constant(builder
, GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_GS
,
1159 bufs
, sizes
, num_bufs
);
1163 gen7_3dstate_constant(struct ilo_builder
*builder
,
1165 const uint32_t *bufs
, const int *sizes
,
1168 const uint32_t cmd
= GEN6_RENDER_TYPE_RENDER
|
1169 GEN6_RENDER_SUBTYPE_3D
|
1171 const uint8_t cmd_len
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) ? 11 : 7;
1172 uint32_t payload
[6], *dw
;
1173 int total_read_length
, i
;
1175 ILO_DEV_ASSERT(builder
->dev
, 7, 8);
1177 /* VS, HS, DS, GS, and PS variants */
1178 assert(subop
>= GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_VS
&&
1179 subop
<= GEN7_RENDER_OPCODE_3DSTATE_CONSTANT_DS
&&
1180 subop
!= GEN6_RENDER_OPCODE_3DSTATE_SAMPLE_MASK
);
1182 assert(num_bufs
<= 4);
1187 total_read_length
= 0;
1188 for (i
= 0; i
< 4; i
++) {
1192 * From the Ivy Bridge PRM, volume 2 part 1, page 112:
1194 * "Constant buffers must be enabled in order from Constant Buffer 0
1195 * to Constant Buffer 3 within this command. For example, it is
1196 * not allowed to enable Constant Buffer 1 by programming a
1197 * non-zero value in the VS Constant Buffer 1 Read Length without a
1198 * non-zero value in VS Constant Buffer 0 Read Length."
1200 if (i
>= num_bufs
|| !sizes
[i
]) {
1201 for (; i
< 4; i
++) {
1202 assert(i
>= num_bufs
|| !sizes
[i
]);
1208 /* read lengths are in 256-bit units */
1209 read_len
= (sizes
[i
] + 31) / 32;
1210 /* the lower 5 bits are used for memory object control state */
1211 assert(bufs
[i
] % 32 == 0);
1213 payload
[i
/ 2] |= read_len
<< ((i
% 2) ? 16 : 0);
1214 payload
[2 + i
] = bufs
[i
];
1216 total_read_length
+= read_len
;
1220 * From the Ivy Bridge PRM, volume 2 part 1, page 113:
1222 * "The sum of all four read length fields must be less than or equal
1223 * to the size of 64"
1225 assert(total_read_length
<= 64);
1227 ilo_builder_batch_pointer(builder
, cmd_len
, &dw
);
1229 dw
[0] = cmd
| (cmd_len
- 2);
1230 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) {
1242 payload
[2] |= builder
->mocs
<< GEN7_CONSTANT_DW_ADDR_MOCS__SHIFT
;
1244 memcpy(&dw
[1], payload
, sizeof(payload
));
1249 gen7_3DSTATE_CONSTANT_VS(struct ilo_builder
*builder
,
1250 const uint32_t *bufs
, const int *sizes
,
1253 gen7_3dstate_constant(builder
, GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_VS
,
1254 bufs
, sizes
, num_bufs
);
1258 gen7_3DSTATE_CONSTANT_HS(struct ilo_builder
*builder
,
1259 const uint32_t *bufs
, const int *sizes
,
1262 gen7_3dstate_constant(builder
, GEN7_RENDER_OPCODE_3DSTATE_CONSTANT_HS
,
1263 bufs
, sizes
, num_bufs
);
1267 gen7_3DSTATE_CONSTANT_DS(struct ilo_builder
*builder
,
1268 const uint32_t *bufs
, const int *sizes
,
1271 gen7_3dstate_constant(builder
, GEN7_RENDER_OPCODE_3DSTATE_CONSTANT_DS
,
1272 bufs
, sizes
, num_bufs
);
1276 gen7_3DSTATE_CONSTANT_GS(struct ilo_builder
*builder
,
1277 const uint32_t *bufs
, const int *sizes
,
1280 gen7_3dstate_constant(builder
, GEN6_RENDER_OPCODE_3DSTATE_CONSTANT_GS
,
1281 bufs
, sizes
, num_bufs
);
1284 static inline uint32_t
1285 gen6_BINDING_TABLE_STATE(struct ilo_builder
*builder
,
1286 const uint32_t *surface_states
,
1287 int num_surface_states
)
1289 const int state_align
= 32;
1290 const int state_len
= num_surface_states
;
1291 uint32_t state_offset
, *dw
;
1293 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
1296 * From the Sandy Bridge PRM, volume 4 part 1, page 69:
1298 * "It is stored as an array of up to 256 elements..."
1300 assert(num_surface_states
<= 256);
1302 if (!num_surface_states
)
1305 state_offset
= ilo_builder_surface_pointer(builder
,
1306 ILO_BUILDER_ITEM_BINDING_TABLE
, state_align
, state_len
, &dw
);
1307 memcpy(dw
, surface_states
, state_len
<< 2);
1309 return state_offset
;
1312 static inline uint32_t
1313 gen6_SURFACE_STATE(struct ilo_builder
*builder
,
1314 const struct ilo_state_surface
*surf
)
1316 int state_align
, state_len
;
1317 uint32_t state_offset
, *dw
;
1319 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
1321 if (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) {
1325 state_offset
= ilo_builder_surface_pointer(builder
,
1326 ILO_BUILDER_ITEM_SURFACE
, state_align
, state_len
, &dw
);
1327 memcpy(dw
, surf
->surface
, state_len
<< 2);
1330 const uint32_t mocs
= (surf
->scanout
) ?
1331 (GEN8_MOCS_MT_PTE
| GEN8_MOCS_CT_L3
) : builder
->mocs
;
1333 dw
[1] |= mocs
<< GEN8_SURFACE_DW1_MOCS__SHIFT
;
1335 ilo_builder_surface_reloc64(builder
, state_offset
, 8, surf
->vma
->bo
,
1336 surf
->vma
->bo_offset
+ surf
->surface
[8],
1337 (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
->vma
->bo
,
1355 surf
->vma
->bo_offset
+ surf
->surface
[1],
1356 (surf
->readonly
) ? 0 : INTEL_RELOC_WRITE
);
1360 return state_offset
;
1363 static inline uint32_t
1364 gen6_SAMPLER_STATE(struct ilo_builder
*builder
,
1365 const struct ilo_state_sampler
*samplers
,
1366 const uint32_t *sampler_border_colors
,
1369 const int state_align
= 32;
1370 const int state_len
= 4 * sampler_count
;
1371 uint32_t state_offset
, *dw
;
1374 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
1377 * From the Sandy Bridge PRM, volume 4 part 1, page 101:
1379 * "The sampler state is stored as an array of up to 16 elements..."
1381 assert(sampler_count
<= 16);
1387 * From the Sandy Bridge PRM, volume 2 part 1, page 132:
1389 * "(Sampler Count of 3DSTATE_VS) Specifies how many samplers (in
1390 * multiples of 4) the vertex shader 0 kernel uses. Used only for
1391 * prefetching the associated sampler state entries.
1393 * It also applies to other shader stages.
1395 ilo_builder_dynamic_pad_top(builder
, 4 * (4 - (sampler_count
% 4)));
1397 state_offset
= ilo_builder_dynamic_pointer(builder
,
1398 ILO_BUILDER_ITEM_SAMPLER
, state_align
, state_len
, &dw
);
1400 for (i
= 0; i
< sampler_count
; i
++) {
1401 /* see sampler_set_gen6_SAMPLER_STATE() */
1402 dw
[0] = samplers
[i
].sampler
[0];
1403 dw
[1] = samplers
[i
].sampler
[1];
1404 dw
[3] = samplers
[i
].sampler
[2];
1406 assert(!(sampler_border_colors
[i
] & 0x1f));
1407 dw
[2] = sampler_border_colors
[i
];
1412 return state_offset
;
1415 static inline uint32_t
1416 gen6_SAMPLER_BORDER_COLOR_STATE(struct ilo_builder
*builder
,
1417 const struct ilo_state_sampler_border
*border
)
1419 const int state_align
=
1420 (ilo_dev_gen(builder
->dev
) >= ILO_GEN(8)) ? 64 : 32;
1421 const int state_len
= (ilo_dev_gen(builder
->dev
) >= ILO_GEN(7)) ? 4 : 12;
1423 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
1426 * see border_set_gen6_SAMPLER_BORDER_COLOR_STATE() and
1427 * border_set_gen7_SAMPLER_BORDER_COLOR_STATE()
1429 return ilo_builder_dynamic_write(builder
, ILO_BUILDER_ITEM_BLOB
,
1430 state_align
, state_len
, border
->color
);
1433 static inline uint32_t
1434 gen6_push_constant_buffer(struct ilo_builder
*builder
,
1435 int size
, void **pcb
)
1438 * For all VS, GS, FS, and CS push constant buffers, they must be aligned
1439 * to 32 bytes, and their sizes are specified in 256-bit units.
1441 const int state_align
= 32;
1442 const int state_len
= align(size
, 32) / 4;
1443 uint32_t state_offset
;
1446 ILO_DEV_ASSERT(builder
->dev
, 6, 8);
1448 state_offset
= ilo_builder_dynamic_pointer(builder
,
1449 ILO_BUILDER_ITEM_BLOB
, state_align
, state_len
, (uint32_t **) &buf
);
1451 /* zero out the unused range */
1452 if (size
< state_len
* 4)
1453 memset(&buf
[size
], 0, state_len
* 4 - size
);
1458 return state_offset
;
1461 static inline uint32_t
1462 gen6_user_vertex_buffer(struct ilo_builder
*builder
,
1463 int size
, const void *vertices
)
1465 const int state_align
= 8;
1466 const int state_len
= size
/ 4;
1468 ILO_DEV_ASSERT(builder
->dev
, 6, 7.5);
1470 assert(size
% 4 == 0);
1472 return ilo_builder_dynamic_write(builder
, ILO_BUILDER_ITEM_BLOB
,
1473 state_align
, state_len
, vertices
);
1476 #endif /* ILO_BUILDER_3D_TOP_H */