xref: /aosp_15_r20/external/mesa3d/src/intel/shaders/generate.cl (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker/* Copyright © 2023 Intel Corporation
2*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
3*61046927SAndroid Build Coastguard Worker */
4*61046927SAndroid Build Coastguard Worker
5*61046927SAndroid Build Coastguard Worker#include "libintel_shaders.h"
6*61046927SAndroid Build Coastguard Worker
7*61046927SAndroid Build Coastguard Workervoid genX(write_3DSTATE_VERTEX_BUFFERS)(global void *dst_ptr,
8*61046927SAndroid Build Coastguard Worker                                        uint32_t buffer_count)
9*61046927SAndroid Build Coastguard Worker{
10*61046927SAndroid Build Coastguard Worker   struct GENX(3DSTATE_VERTEX_BUFFERS) v = {
11*61046927SAndroid Build Coastguard Worker      GENX(3DSTATE_VERTEX_BUFFERS_header),
12*61046927SAndroid Build Coastguard Worker   };
13*61046927SAndroid Build Coastguard Worker   v.DWordLength = 1 + (buffer_count * 4) -
14*61046927SAndroid Build Coastguard Worker                   GENX(3DSTATE_VERTEX_BUFFERS_length_bias);
15*61046927SAndroid Build Coastguard Worker   GENX(3DSTATE_VERTEX_BUFFERS_pack)(dst_ptr, &v);
16*61046927SAndroid Build Coastguard Worker}
17*61046927SAndroid Build Coastguard Worker
18*61046927SAndroid Build Coastguard Workervoid genX(write_VERTEX_BUFFER_STATE)(global void *dst_ptr,
19*61046927SAndroid Build Coastguard Worker                                     uint32_t mocs,
20*61046927SAndroid Build Coastguard Worker                                     uint32_t buffer_idx,
21*61046927SAndroid Build Coastguard Worker                                     uint64_t address,
22*61046927SAndroid Build Coastguard Worker                                     uint32_t size,
23*61046927SAndroid Build Coastguard Worker                                     uint32_t stride)
24*61046927SAndroid Build Coastguard Worker{
25*61046927SAndroid Build Coastguard Worker   bool buffer_null = address == 0;
26*61046927SAndroid Build Coastguard Worker   struct GENX(VERTEX_BUFFER_STATE) v = {
27*61046927SAndroid Build Coastguard Worker      .BufferPitch = stride,
28*61046927SAndroid Build Coastguard Worker      .NullVertexBuffer = address == 0,
29*61046927SAndroid Build Coastguard Worker      .AddressModifyEnable = true,
30*61046927SAndroid Build Coastguard Worker      .MOCS = mocs,
31*61046927SAndroid Build Coastguard Worker#if GFX_VER >= 12
32*61046927SAndroid Build Coastguard Worker      .L3BypassDisable = true,
33*61046927SAndroid Build Coastguard Worker#endif
34*61046927SAndroid Build Coastguard Worker      .VertexBufferIndex = buffer_idx,
35*61046927SAndroid Build Coastguard Worker      .BufferStartingAddress = address,
36*61046927SAndroid Build Coastguard Worker      .BufferSize = size,
37*61046927SAndroid Build Coastguard Worker   };
38*61046927SAndroid Build Coastguard Worker   GENX(VERTEX_BUFFER_STATE_pack)(dst_ptr, &v);
39*61046927SAndroid Build Coastguard Worker}
40*61046927SAndroid Build Coastguard Worker
41*61046927SAndroid Build Coastguard Workervoid genX(write_3DPRIMITIVE)(global void *dst_ptr,
42*61046927SAndroid Build Coastguard Worker                             bool is_predicated,
43*61046927SAndroid Build Coastguard Worker                             bool is_indexed,
44*61046927SAndroid Build Coastguard Worker                             bool uses_tbimr,
45*61046927SAndroid Build Coastguard Worker                             uint32_t vertex_count_per_instance,
46*61046927SAndroid Build Coastguard Worker                             uint32_t start_vertex_location,
47*61046927SAndroid Build Coastguard Worker                             uint32_t instance_count,
48*61046927SAndroid Build Coastguard Worker                             uint32_t start_instance_location,
49*61046927SAndroid Build Coastguard Worker                             uint32_t base_vertex_location)
50*61046927SAndroid Build Coastguard Worker{
51*61046927SAndroid Build Coastguard Worker   struct GENX(3DPRIMITIVE) v = {
52*61046927SAndroid Build Coastguard Worker      GENX(3DPRIMITIVE_header),
53*61046927SAndroid Build Coastguard Worker#if GFX_VERx10 >= 125
54*61046927SAndroid Build Coastguard Worker      .TBIMREnable = uses_tbimr,
55*61046927SAndroid Build Coastguard Worker#endif
56*61046927SAndroid Build Coastguard Worker      .PredicateEnable = is_predicated,
57*61046927SAndroid Build Coastguard Worker      .VertexAccessType = is_indexed ? RANDOM : SEQUENTIAL,
58*61046927SAndroid Build Coastguard Worker      .VertexCountPerInstance = vertex_count_per_instance,
59*61046927SAndroid Build Coastguard Worker      .StartVertexLocation = start_vertex_location,
60*61046927SAndroid Build Coastguard Worker      .InstanceCount = instance_count,
61*61046927SAndroid Build Coastguard Worker      .StartInstanceLocation = start_instance_location,
62*61046927SAndroid Build Coastguard Worker      .BaseVertexLocation = base_vertex_location,
63*61046927SAndroid Build Coastguard Worker   };
64*61046927SAndroid Build Coastguard Worker   GENX(3DPRIMITIVE_pack)(dst_ptr, &v);
65*61046927SAndroid Build Coastguard Worker}
66*61046927SAndroid Build Coastguard Worker
67*61046927SAndroid Build Coastguard Worker#if GFX_VER >= 11
68*61046927SAndroid Build Coastguard Workervoid genX(write_3DPRIMITIVE_EXTENDED)(global void *dst_ptr,
69*61046927SAndroid Build Coastguard Worker                                      bool is_predicated,
70*61046927SAndroid Build Coastguard Worker                                      bool is_indexed,
71*61046927SAndroid Build Coastguard Worker                                      bool uses_tbimr,
72*61046927SAndroid Build Coastguard Worker                                      uint32_t vertex_count_per_instance,
73*61046927SAndroid Build Coastguard Worker                                      uint32_t start_vertex_location,
74*61046927SAndroid Build Coastguard Worker                                      uint32_t instance_count,
75*61046927SAndroid Build Coastguard Worker                                      uint32_t start_instance_location,
76*61046927SAndroid Build Coastguard Worker                                      uint32_t base_vertex_location,
77*61046927SAndroid Build Coastguard Worker                                      uint32_t param_base_vertex,
78*61046927SAndroid Build Coastguard Worker                                      uint32_t param_base_instance,
79*61046927SAndroid Build Coastguard Worker                                      uint32_t param_draw_id)
80*61046927SAndroid Build Coastguard Worker{
81*61046927SAndroid Build Coastguard Worker   struct GENX(3DPRIMITIVE_EXTENDED) v = {
82*61046927SAndroid Build Coastguard Worker      GENX(3DPRIMITIVE_EXTENDED_header),
83*61046927SAndroid Build Coastguard Worker#if GFX_VERx10 >= 125
84*61046927SAndroid Build Coastguard Worker      .TBIMREnable = uses_tbimr,
85*61046927SAndroid Build Coastguard Worker#endif
86*61046927SAndroid Build Coastguard Worker      .PredicateEnable = is_predicated,
87*61046927SAndroid Build Coastguard Worker      .VertexAccessType = is_indexed ? RANDOM : SEQUENTIAL,
88*61046927SAndroid Build Coastguard Worker      .VertexCountPerInstance = vertex_count_per_instance,
89*61046927SAndroid Build Coastguard Worker      .StartVertexLocation = start_vertex_location,
90*61046927SAndroid Build Coastguard Worker      .InstanceCount = instance_count,
91*61046927SAndroid Build Coastguard Worker      .StartInstanceLocation = start_instance_location,
92*61046927SAndroid Build Coastguard Worker      .BaseVertexLocation = base_vertex_location,
93*61046927SAndroid Build Coastguard Worker      .ExtendedParameter0 = param_base_vertex,
94*61046927SAndroid Build Coastguard Worker      .ExtendedParameter1 = param_base_instance,
95*61046927SAndroid Build Coastguard Worker      .ExtendedParameter2 = param_draw_id,
96*61046927SAndroid Build Coastguard Worker   };
97*61046927SAndroid Build Coastguard Worker   GENX(3DPRIMITIVE_EXTENDED_pack)(dst_ptr, &v);
98*61046927SAndroid Build Coastguard Worker}
99*61046927SAndroid Build Coastguard Worker#endif
100*61046927SAndroid Build Coastguard Worker
101*61046927SAndroid Build Coastguard Workervoid genX(write_MI_BATCH_BUFFER_START)(global void *dst_ptr, uint64_t addr)
102*61046927SAndroid Build Coastguard Worker{
103*61046927SAndroid Build Coastguard Worker   struct GENX(MI_BATCH_BUFFER_START) v = {
104*61046927SAndroid Build Coastguard Worker      GENX(MI_BATCH_BUFFER_START_header),
105*61046927SAndroid Build Coastguard Worker      .AddressSpaceIndicator = ASI_PPGTT,
106*61046927SAndroid Build Coastguard Worker      .BatchBufferStartAddress = addr,
107*61046927SAndroid Build Coastguard Worker   };
108*61046927SAndroid Build Coastguard Worker   GENX(MI_BATCH_BUFFER_START_pack)(dst_ptr, &v);
109*61046927SAndroid Build Coastguard Worker}
110*61046927SAndroid Build Coastguard Worker
111*61046927SAndroid Build Coastguard Workervoid genX(write_draw)(global uint32_t *dst_ptr,
112*61046927SAndroid Build Coastguard Worker                      global void *indirect_ptr,
113*61046927SAndroid Build Coastguard Worker                      global uint32_t *draw_id_ptr,
114*61046927SAndroid Build Coastguard Worker                      uint32_t draw_id,
115*61046927SAndroid Build Coastguard Worker                      uint32_t instance_multiplier,
116*61046927SAndroid Build Coastguard Worker                      bool is_indexed,
117*61046927SAndroid Build Coastguard Worker                      bool is_predicated,
118*61046927SAndroid Build Coastguard Worker                      bool uses_tbimr,
119*61046927SAndroid Build Coastguard Worker                      bool uses_base,
120*61046927SAndroid Build Coastguard Worker                      bool uses_drawid,
121*61046927SAndroid Build Coastguard Worker                      uint32_t mocs)
122*61046927SAndroid Build Coastguard Worker{
123*61046927SAndroid Build Coastguard Worker#if GFX_VER <= 9
124*61046927SAndroid Build Coastguard Worker   if (uses_base || uses_drawid) {
125*61046927SAndroid Build Coastguard Worker      uint32_t vertex_buffer_count =
126*61046927SAndroid Build Coastguard Worker         (uses_base ? 1 : 0) + (uses_drawid ? 1 : 0);
127*61046927SAndroid Build Coastguard Worker      genX(write_3DSTATE_VERTEX_BUFFERS)(dst_ptr, vertex_buffer_count);
128*61046927SAndroid Build Coastguard Worker      dst_ptr += 1; /* GENX(3DSTATE_VERTEX_BUFFERS_length); */
129*61046927SAndroid Build Coastguard Worker      if (uses_base) {
130*61046927SAndroid Build Coastguard Worker         uint64_t base_addr = (uint64_t)indirect_ptr + (is_indexed ? 12 : 8);
131*61046927SAndroid Build Coastguard Worker         genX(write_VERTEX_BUFFER_STATE)(dst_ptr, mocs, 31, base_addr, 8, 0);
132*61046927SAndroid Build Coastguard Worker         dst_ptr += GENX(VERTEX_BUFFER_STATE_length);
133*61046927SAndroid Build Coastguard Worker      }
134*61046927SAndroid Build Coastguard Worker      if (uses_drawid) {
135*61046927SAndroid Build Coastguard Worker         *draw_id_ptr = draw_id;
136*61046927SAndroid Build Coastguard Worker         genX(write_VERTEX_BUFFER_STATE)(dst_ptr, mocs, 32,
137*61046927SAndroid Build Coastguard Worker                                         (uint64_t)draw_id_ptr, 4, 0);
138*61046927SAndroid Build Coastguard Worker         dst_ptr += GENX(VERTEX_BUFFER_STATE_length);
139*61046927SAndroid Build Coastguard Worker      }
140*61046927SAndroid Build Coastguard Worker   }
141*61046927SAndroid Build Coastguard Worker
142*61046927SAndroid Build Coastguard Worker   if (is_indexed) {
143*61046927SAndroid Build Coastguard Worker      VkDrawIndexedIndirectCommand data =
144*61046927SAndroid Build Coastguard Worker         *((global VkDrawIndexedIndirectCommand *)indirect_ptr);
145*61046927SAndroid Build Coastguard Worker
146*61046927SAndroid Build Coastguard Worker      genX(write_3DPRIMITIVE)(dst_ptr,
147*61046927SAndroid Build Coastguard Worker                              is_predicated,
148*61046927SAndroid Build Coastguard Worker                              is_indexed,
149*61046927SAndroid Build Coastguard Worker                              uses_tbimr,
150*61046927SAndroid Build Coastguard Worker                              data.indexCount,
151*61046927SAndroid Build Coastguard Worker                              data.firstIndex,
152*61046927SAndroid Build Coastguard Worker                              data.instanceCount * instance_multiplier,
153*61046927SAndroid Build Coastguard Worker                              data.firstInstance,
154*61046927SAndroid Build Coastguard Worker                              data.vertexOffset);
155*61046927SAndroid Build Coastguard Worker   } else {
156*61046927SAndroid Build Coastguard Worker      VkDrawIndirectCommand data =
157*61046927SAndroid Build Coastguard Worker         *((global VkDrawIndirectCommand *)indirect_ptr);
158*61046927SAndroid Build Coastguard Worker
159*61046927SAndroid Build Coastguard Worker      genX(write_3DPRIMITIVE)(dst_ptr,
160*61046927SAndroid Build Coastguard Worker                              is_predicated,
161*61046927SAndroid Build Coastguard Worker                              is_indexed,
162*61046927SAndroid Build Coastguard Worker                              uses_tbimr,
163*61046927SAndroid Build Coastguard Worker                              data.vertexCount,
164*61046927SAndroid Build Coastguard Worker                              data.firstVertex,
165*61046927SAndroid Build Coastguard Worker                              data.instanceCount * instance_multiplier,
166*61046927SAndroid Build Coastguard Worker                              data.firstInstance,
167*61046927SAndroid Build Coastguard Worker                              0 /* base_vertex_location */);
168*61046927SAndroid Build Coastguard Worker   }
169*61046927SAndroid Build Coastguard Worker#else
170*61046927SAndroid Build Coastguard Worker   if (is_indexed) {
171*61046927SAndroid Build Coastguard Worker      VkDrawIndexedIndirectCommand data =
172*61046927SAndroid Build Coastguard Worker         *((global VkDrawIndexedIndirectCommand *)indirect_ptr);
173*61046927SAndroid Build Coastguard Worker
174*61046927SAndroid Build Coastguard Worker      genX(write_3DPRIMITIVE_EXTENDED)(dst_ptr,
175*61046927SAndroid Build Coastguard Worker                                       is_predicated,
176*61046927SAndroid Build Coastguard Worker                                       is_indexed,
177*61046927SAndroid Build Coastguard Worker                                       uses_tbimr,
178*61046927SAndroid Build Coastguard Worker                                       data.indexCount,
179*61046927SAndroid Build Coastguard Worker                                       data.firstIndex,
180*61046927SAndroid Build Coastguard Worker                                       data.instanceCount * instance_multiplier,
181*61046927SAndroid Build Coastguard Worker                                       data.firstInstance,
182*61046927SAndroid Build Coastguard Worker                                       data.vertexOffset,
183*61046927SAndroid Build Coastguard Worker                                       data.vertexOffset,
184*61046927SAndroid Build Coastguard Worker                                       data.firstInstance,
185*61046927SAndroid Build Coastguard Worker                                       draw_id);
186*61046927SAndroid Build Coastguard Worker   } else {
187*61046927SAndroid Build Coastguard Worker      VkDrawIndirectCommand data =
188*61046927SAndroid Build Coastguard Worker         *((global VkDrawIndirectCommand *)indirect_ptr);
189*61046927SAndroid Build Coastguard Worker
190*61046927SAndroid Build Coastguard Worker      genX(write_3DPRIMITIVE_EXTENDED)(dst_ptr,
191*61046927SAndroid Build Coastguard Worker                                       is_predicated,
192*61046927SAndroid Build Coastguard Worker                                       is_indexed,
193*61046927SAndroid Build Coastguard Worker                                       uses_tbimr,
194*61046927SAndroid Build Coastguard Worker                                       data.vertexCount,
195*61046927SAndroid Build Coastguard Worker                                       data.firstVertex,
196*61046927SAndroid Build Coastguard Worker                                       data.instanceCount * instance_multiplier,
197*61046927SAndroid Build Coastguard Worker                                       data.firstInstance,
198*61046927SAndroid Build Coastguard Worker                                       0 /* base_vertex_location */,
199*61046927SAndroid Build Coastguard Worker                                       data.firstVertex,
200*61046927SAndroid Build Coastguard Worker                                       data.firstInstance,
201*61046927SAndroid Build Coastguard Worker                                       draw_id);
202*61046927SAndroid Build Coastguard Worker   }
203*61046927SAndroid Build Coastguard Worker#endif
204*61046927SAndroid Build Coastguard Worker}
205