xref: /aosp_15_r20/external/mesa3d/src/intel/vulkan/grl/gpu/build_primref.grl (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1//
2// Copyright (C) 2009-2021 Intel Corporation
3//
4// SPDX-License-Identifier: MIT
5//
6//
7
8module build_primref;
9
10kernel_module primref_kernels ("bvh_build_primref.cl")
11{
12    links lsc_intrinsics;
13
14    kernel opencl_kernel_primrefs_from_DXR_instances          < kernelFunction="primrefs_from_DXR_instances" >;
15    kernel opencl_kernel_primrefs_from_DXR_instances_indirect < kernelFunction="primrefs_from_DXR_instances_indirect" >;
16    kernel opencl_kernel_primrefs_from_DXR_instances_pointers < kernelFunction="primrefs_from_DXR_instances_pointers" >;
17    kernel opencl_kernel_primrefs_from_DXR_instances_pointers_indirect < kernelFunction="primrefs_from_DXR_instances_pointers_indirect" >;
18
19    kernel opencl_kernel_triangles_to_primrefs            < kernelFunction="triangles_to_primrefs" >;
20    kernel opencl_kernel_triangles_to_primrefs_indirect   < kernelFunction="triangles_to_primrefs_indirect" >;
21    kernel opencl_kernel_procedurals_to_primrefs          < kernelFunction="procedurals_to_primrefs" >;
22    kernel opencl_kernel_procedurals_to_primrefs_indirect < kernelFunction="procedurals_to_primrefs_indirect" >;
23}
24
25import struct MKBuilderState "structs.grl";
26import struct MKSizeEstimate "structs.grl";
27
28
29const PrimirefsFromInstances_GROUPSIZE = 16;
30
31metakernel buildPrimirefsFromInstances(
32            qword instanceDescBuff,
33            MKSizeEstimate estimate,
34            MKBuilderState build_state,
35            dword allowUpdate)
36{
37  define num_groups ((estimate.numPrimitives + PrimirefsFromInstances_GROUPSIZE-1)/PrimirefsFromInstances_GROUPSIZE);
38  dispatch opencl_kernel_primrefs_from_DXR_instances(num_groups,1,1) args(
39    build_state.build_globals,
40    build_state.bvh_buffer,
41    instanceDescBuff,
42    estimate.numPrimitives,
43    build_state.build_primref_buffer,
44    allowUpdate);
45}
46
47metakernel buildPrimirefsFromInstancesIndirect(
48            qword instanceDescBuff,
49            qword indirectBuildRangeInfo,
50            MKBuilderState build_state,
51            dword allowUpdate)
52{
53    define num_groups  REG0;
54    define groupsize_1 REG1; // groupsize - 1
55    define C_4         REG2;
56
57    // init with primitiveCount
58    num_groups = load_dword(indirectBuildRangeInfo);
59    groupsize_1 = 15; // PrimirefsFromInstances_GROUPSIZE - 1
60    C_4 = 4;          // log_2(PrimirefsFromInstances_GROUPSIZE)
61
62    num_groups = num_groups + groupsize_1;
63    num_groups = num_groups >> C_4; // num_groups / PrimirefsFromInstances_GROUPSIZE;
64
65    DISPATCHDIM_X = num_groups.lo;
66    DISPATCHDIM_Y = 1;
67    DISPATCHDIM_Z = 1;
68
69    dispatch_indirect opencl_kernel_primrefs_from_DXR_instances_indirect args(
70        build_state.build_globals,
71        build_state.bvh_buffer,
72        instanceDescBuff,
73        indirectBuildRangeInfo,
74        build_state.build_primref_buffer,
75        allowUpdate);
76}
77
78metakernel buildPrimirefsFromInstancesArrOfPtrs(
79            qword instanceDescPtrArrayBuff,
80            MKSizeEstimate estimate,
81            MKBuilderState build_state,
82            dword allowUpdate)
83{
84  define num_groups ((estimate.numPrimitives + PrimirefsFromInstances_GROUPSIZE-1)/PrimirefsFromInstances_GROUPSIZE);
85  dispatch opencl_kernel_primrefs_from_DXR_instances_pointers(num_groups,1,1) args(
86    build_state.build_globals,
87    build_state.bvh_buffer,
88    instanceDescPtrArrayBuff,
89    estimate.numPrimitives,
90    build_state.build_primref_buffer,
91    allowUpdate);
92}
93
94metakernel buildPrimirefsFromInstancesArrOfPtrsIndirect(
95            qword instanceDescPtrArrayBuff,
96            qword indirectBuildRangeInfo,
97            MKSizeEstimate estimate,
98            MKBuilderState build_state,
99            dword allowUpdate)
100{
101    define num_groups  REG0;
102    define groupsize_1 REG1; // groupsize - 1
103    define C_4         REG2;
104
105    // init with primitiveCount
106    num_groups = load_dword(indirectBuildRangeInfo);
107    groupsize_1 = 15; // PrimirefsFromInstances_GROUPSIZE - 1
108    C_4 = 4;          // log_2(PrimirefsFromInstances_GROUPSIZE)
109
110    num_groups = num_groups + groupsize_1;
111    num_groups = num_groups >> C_4; // num_groups / PrimirefsFromInstances_GROUPSIZE;
112
113    DISPATCHDIM_X = num_groups.lo;
114    DISPATCHDIM_Y = 1;
115    DISPATCHDIM_Z = 1;
116
117    dispatch_indirect opencl_kernel_primrefs_from_DXR_instances_pointers_indirect args(
118        build_state.build_globals,
119        build_state.bvh_buffer,
120        instanceDescPtrArrayBuff,
121        build_state.build_primref_buffer,
122        indirectBuildRangeInfo,
123        allowUpdate);
124}
125
126
127
128
129metakernel primrefs_from_tris(
130            MKBuilderState build_state,
131            MKSizeEstimate estimate,
132            qword geo_ptr,
133            dword geom_id,
134            dword geom_flags,
135            dword num_prims)
136{
137    define num_threads ((num_prims+15)/16);
138    dispatch opencl_kernel_triangles_to_primrefs(num_threads,1,1) args(
139        build_state.build_globals,
140        build_state.bvh_buffer,
141        build_state.build_primref_buffer,
142        geo_ptr,
143        (geom_id & 0x00ffffff) + (geom_flags<<24),
144        num_prims);
145}
146
147metakernel primrefs_from_tris_indirect(
148            MKBuilderState build_state,
149            MKSizeEstimate estimate,
150            qword geo_ptr,
151            qword indirectBuildRangeInfo,
152            dword geom_id,
153            dword geom_flags)
154{
155    define num_groups  REG0;
156    define groupsize_1 REG1; // groupsize - 1
157    define C_4         REG2;
158
159    // init with primitiveCount
160    num_groups  = load_dword(indirectBuildRangeInfo);
161    groupsize_1 = 15; // PrimirefsFromInstances_GROUPSIZE - 1
162    C_4         = 4;  // log_2(PrimirefsFromInstances_GROUPSIZE)
163
164    num_groups = num_groups + groupsize_1;
165    num_groups = num_groups >> C_4; // num_groups / PrimirefsFromInstances_GROUPSIZE;
166
167    DISPATCHDIM_X = num_groups.lo;
168    DISPATCHDIM_Y = 1;
169    DISPATCHDIM_Z = 1;
170
171    dispatch_indirect opencl_kernel_triangles_to_primrefs_indirect args(
172        build_state.build_globals,
173        build_state.bvh_buffer,
174        build_state.build_primref_buffer,
175        geo_ptr,
176        indirectBuildRangeInfo,
177        (geom_id & 0x00ffffff) + (geom_flags << 24));
178}
179
180metakernel primrefs_from_proc(
181            MKBuilderState build_state,
182            MKSizeEstimate estimate,
183            qword geo_ptr,
184            dword geom_id,
185            dword geom_flags,
186            dword num_prims)
187{
188    define num_threads ((num_prims+15)/16);
189    dispatch opencl_kernel_procedurals_to_primrefs(num_threads,1,1) args(
190        build_state.build_globals,
191        build_state.bvh_buffer,
192        build_state.build_primref_buffer,
193        geo_ptr,
194        (geom_id & 0x00ffffff) + (geom_flags<<24),
195        num_prims);
196}
197
198metakernel primrefs_from_proc_indirect(
199            MKBuilderState build_state,
200            MKSizeEstimate estimate,
201            qword geo_ptr,
202            qword indirectBuildRangeInfo,
203            dword geom_id,
204            dword geom_flags)
205{
206    define num_groups  REG0;
207    define groupsize_1 REG1; // groupsize - 1
208    define C_4         REG2;
209
210    // init with primitiveCount
211    num_groups  = load_dword(indirectBuildRangeInfo);
212    groupsize_1 = 15; // PrimirefsFromInstances_GROUPSIZE - 1
213    C_4         = 4;  // log_2(PrimirefsFromInstances_GROUPSIZE)
214
215    num_groups = num_groups + groupsize_1;
216    num_groups = num_groups >> C_4; // num_groups / PrimirefsFromInstances_GROUPSIZE;
217
218    DISPATCHDIM_X = num_groups.lo;
219    DISPATCHDIM_Y = 1;
220    DISPATCHDIM_Z = 1;
221
222    dispatch_indirect opencl_kernel_procedurals_to_primrefs_indirect args(
223        build_state.build_globals,
224        build_state.bvh_buffer,
225        build_state.build_primref_buffer,
226        geo_ptr,
227        indirectBuildRangeInfo,
228        (geom_id & 0x00ffffff) + (geom_flags<<24));
229}
230