xref: /aosp_15_r20/external/mesa3d/src/intel/vulkan/grl/gpu/build_leaf.grl (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1//
2// Copyright (C) 2009-2021 Intel Corporation
3//
4// SPDX-License-Identifier: MIT
5//
6//
7
8module leaf_builder;
9
10kernel_module leaf_kernels ("bvh_build_leaf.cl")
11{
12    links lsc_intrinsics;
13
14    kernel opencl_kernel_primref_to_quads                   < kernelFunction="primref_to_quads" >;
15    kernel opencl_kernel_primref_to_procedurals             < kernelFunction="primref_to_procedurals" >;
16    kernel opencl_kernel_create_HW_instance_nodes           < kernelFunction="create_HW_instance_nodes" >;
17    kernel opencl_kernel_create_HW_instance_nodes_pointers  < kernelFunction="create_HW_instance_nodes_pointers" >;
18}
19
20import struct MKBuilderState "structs.grl";
21import struct MKSizeEstimate "structs.grl";
22
23const Instances_GROUPSIZE = 16;
24
25metakernel buildLeafDXR_instances(
26            MKBuilderState state,
27            qword build_primref_index_buffers,
28            qword srcInstanceDescrArray,
29            dword stride,
30            dword offset,
31            dword numPrims)
32{
33    define num_groups (numPrims+Instances_GROUPSIZE-1)/Instances_GROUPSIZE;
34    dispatch opencl_kernel_create_HW_instance_nodes(num_groups,1,1) args(
35        state.build_globals,
36        build_primref_index_buffers,
37        state.build_primref_buffer,
38        state.bvh_buffer,
39        srcInstanceDescrArray,
40        stride,
41        offset);
42}
43
44metakernel buildLeafDXR_instances_indirect(
45            MKBuilderState state,
46            qword build_primref_index_buffers,
47            qword srcInstanceDescrArray,
48            qword indirectBuildRangeInfo,
49            dword stride,
50            dword offset)
51{
52    define num_groups  REG0;
53    define groupsize_1 REG1; // groupsize - 1
54    define C_4         REG2;
55
56    // init with primitiveCount
57    num_groups = load_dword(indirectBuildRangeInfo);
58    groupsize_1 = 15; // Instances_GROUPSIZE - 1
59    C_4 = 4;          // log_2(Instances_GROUPSIZE)
60
61    num_groups = num_groups + groupsize_1;
62    num_groups = num_groups >> C_4; // num_groups / Instances_GROUPSIZE;
63
64    DISPATCHDIM_X = num_groups.lo;
65    DISPATCHDIM_Y = 1;
66    DISPATCHDIM_Z = 1;
67
68    dispatch_indirect opencl_kernel_create_HW_instance_nodes args(
69        state.build_globals,
70        build_primref_index_buffers,
71        state.build_primref_buffer,
72        state.bvh_buffer,
73        srcInstanceDescrArray,
74        stride,
75        offset);
76}
77
78metakernel buildLeafDXR_instances_pointers(
79            MKBuilderState state,
80            qword build_primref_index_buffers,
81            qword srcInstanceDescrArrayPtr,
82            dword stride,
83            dword offset,
84            dword numPrims)
85{
86    define num_groups (numPrims+Instances_GROUPSIZE-1)/Instances_GROUPSIZE;
87    dispatch opencl_kernel_create_HW_instance_nodes_pointers(num_groups,1,1) args(
88        state.build_globals,
89        build_primref_index_buffers,
90        state.build_primref_buffer,
91        state.bvh_buffer,
92        srcInstanceDescrArrayPtr,
93        stride,
94        offset);
95}
96
97metakernel buildLeafDXR_instances_pointers_indirect(
98            MKBuilderState state,
99            qword build_primref_index_buffers,
100            qword srcInstanceDescrArrayPtr,
101            qword indirectBuildRangeInfo,
102            dword stride,
103            dword offset)
104{
105    define num_groups  REG0;
106    define groupsize_1 REG1; // groupsize - 1
107    define C_4         REG2;
108
109    // init with primitiveCount
110    num_groups = load_dword(indirectBuildRangeInfo);
111    groupsize_1 = 15; // Instances_GROUPSIZE - 1
112    C_4 = 4;          // log_2(Instances_GROUPSIZE)
113
114    num_groups = num_groups + groupsize_1;
115    num_groups = num_groups >> C_4; // num_groups / Instances_GROUPSIZE;
116
117    DISPATCHDIM_X = num_groups.lo;
118    DISPATCHDIM_Y = 1;
119    DISPATCHDIM_Z = 1;
120
121    dispatch_indirect opencl_kernel_create_HW_instance_nodes_pointers args(
122        state.build_globals,
123        build_primref_index_buffers,
124        state.build_primref_buffer,
125        state.bvh_buffer,
126        srcInstanceDescrArrayPtr,
127        stride,
128        offset);
129}
130
131metakernel buildLeafDXR_procedurals(
132            MKBuilderState state,
133            qword build_primref_index_buffers,
134            dword stride,
135            dword offset,
136            qword p_numPrimitives)
137{
138    define C_1                  REG0;
139    define REG_PRIMS_PER_WG     REG1;
140    define REG_PRIMS_PER_WG_SHR REG2;
141
142    C_1 = 1;
143    REG_PRIMS_PER_WG = 16;
144    REG_PRIMS_PER_WG_SHR = 4;// We cannot use div, so we use shift right instead (shift by 4 = div by 16 elements)
145
146    define reg_numPrimitives  REG3;
147    define reg_num_wgs        REG4;
148
149    reg_numPrimitives = load_dword(p_numPrimitives);
150    reg_num_wgs = reg_numPrimitives + REG_PRIMS_PER_WG;
151    reg_num_wgs = reg_num_wgs - C_1;
152    reg_num_wgs = reg_num_wgs >> REG_PRIMS_PER_WG_SHR;
153
154    DISPATCHDIM_X = reg_num_wgs;
155    DISPATCHDIM_Y = 1;
156    DISPATCHDIM_Z = 1;
157
158    dispatch_indirect opencl_kernel_primref_to_procedurals args(
159        state.build_globals,
160        state.build_primref_buffer,
161        build_primref_index_buffers,
162        state.bvh_buffer,
163        state.geomDesc_buffer,
164        stride,
165        offset);
166}
167
168metakernel buildLeafDXR_quads(
169            MKBuilderState state,
170            qword build_primref_index_buffers,
171            dword stride,
172            dword offset,
173            qword p_numPrimitives,
174            dword allow_update)
175{
176    define C_1                  REG0;
177    define REG_PRIMS_PER_WG     REG1;
178    define SHIFT                REG2;
179
180    C_1 = 1;
181    REG_PRIMS_PER_WG = 32;
182    SHIFT = 4;// We cannot use div, so we use shift right instead (shift by 4 = div by 16 elements)
183
184    define reg_numPrimitives  REG3;
185    define reg_num_wgs        REG4;
186
187    reg_numPrimitives = load_dword(p_numPrimitives);
188    reg_num_wgs = reg_numPrimitives + REG_PRIMS_PER_WG;
189    reg_num_wgs = reg_num_wgs - C_1;
190    reg_num_wgs = reg_num_wgs >> SHIFT;
191    reg_num_wgs = reg_num_wgs >> C_1;
192
193    DISPATCHDIM_X = reg_num_wgs;
194    DISPATCHDIM_Y = 1;
195    DISPATCHDIM_Z = 1;
196
197    dispatch_indirect opencl_kernel_primref_to_quads args(
198        state.build_globals,
199        state.build_primref_buffer,
200        build_primref_index_buffers,
201        state.bvh_buffer,
202        state.geomDesc_buffer,
203        stride,
204        offset,
205        allow_update);
206}
207