xref: /aosp_15_r20/external/mesa3d/src/intel/vulkan/grl/gpu/traversal_shader.grl (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1//
2// Copyright (C) 2009-2021 Intel Corporation
3//
4// SPDX-License-Identifier: MIT
5//
6//
7
8module traversal_shader;
9
10kernel_module morton_kernels ("traversal_shader.cl")
11{
12    links lsc_intrinsics;
13
14    kernel TS_primrefs_from_instances       < kernelFunction = "TS_primrefs_from_instances" >;
15    kernel TS_primrefs_from_instances_indirect       < kernelFunction = "TS_primrefs_from_instances_indirect" >;
16    kernel TS_primrefs_from_instances_ptrs  < kernelFunction = "TS_primrefs_from_instances_pointers" >;
17    kernel TS_primrefs_from_instances_ptrs_indirect  < kernelFunction = "TS_primrefs_from_instances_pointers_indirect" >;
18    kernel TS_update_instance_leaves        < kernelFunction = "TS_update_instance_leaves" >;
19    kernel TS_Refit_per_one_startpoint_sg   < kernelFunction = "TS_Refit_per_one_startpoint_sg" >;
20    kernel TS_fixup_leaves                  < kernelFunction = "TS_fixup_leaves" >;
21}
22
23struct MKTSBuildArgs
24{
25    qword build_globals;
26    qword bvh_buffer;
27    qword instance_descs;
28    qword build_primref_buffer;
29    qword aabb_buffer;
30    qword is_procedural_buffer;
31    qword leaf_creation_index_buffer;
32    dword aabb_stride;
33    dword num_instances;
34    dword leaf_creation_index_stride;
35};
36
37const BUILD_PRIMREFS_GROUPSIZE = 16;
38
39
40metakernel TS_build_primrefs( MKTSBuildArgs build_state, dword allowUpdate )
41{
42    define num_groups((build_state.num_instances + BUILD_PRIMREFS_GROUPSIZE - 1) / BUILD_PRIMREFS_GROUPSIZE);
43    dispatch TS_primrefs_from_instances(num_groups, 1, 1) args(
44        build_state.build_globals,
45        build_state.bvh_buffer,
46        build_state.instance_descs,
47        build_state.num_instances,
48        build_state.build_primref_buffer,
49        build_state.aabb_buffer,
50        build_state.is_procedural_buffer,
51        build_state.aabb_stride,
52        allowUpdate
53    );
54
55}
56
57metakernel TS_build_primrefs_indirect(MKTSBuildArgs build_state, qword indirectBuildRangeInfo, dword allowUpdate)
58{
59    define num_groups  REG0;
60    define groupsize_1 REG1; // groupsize - 1
61    define C_4         REG2;
62
63    // init with primitiveCount
64    num_groups = load_dword(indirectBuildRangeInfo);
65    groupsize_1 = 15; // BUILD_PRIMREFS_GROUPSIZE - 1
66    C_4 = 4;          // log_2(BUILD_PRIMREFS_GROUPSIZE)
67
68    num_groups = num_groups + groupsize_1;
69    num_groups = num_groups >> C_4; // num_groups / BUILD_PRIMREFS_GROUPSIZE;
70
71    DISPATCHDIM_X = num_groups.lo;
72    DISPATCHDIM_Y = 1;
73    DISPATCHDIM_Z = 1;
74
75    dispatch_indirect TS_primrefs_from_instances_indirect args(
76        build_state.build_globals,
77        build_state.bvh_buffer,
78        build_state.instance_descs,
79        build_state.build_primref_buffer,
80        build_state.aabb_buffer,
81        build_state.is_procedural_buffer,
82        build_state.aabb_stride,
83        allowUpdate,
84        indirectBuildRangeInfo
85    );
86
87}
88
89metakernel TS_build_primrefs_array_of_pointers( MKTSBuildArgs build_state, dword allowUpdate )
90{
91    define num_groups((build_state.num_instances + BUILD_PRIMREFS_GROUPSIZE - 1) / BUILD_PRIMREFS_GROUPSIZE);
92    dispatch TS_primrefs_from_instances_ptrs(num_groups, 1, 1) args(
93        build_state.build_globals,
94        build_state.bvh_buffer,
95        build_state.instance_descs,
96        build_state.num_instances,
97        build_state.build_primref_buffer,
98        build_state.aabb_buffer,
99        build_state.is_procedural_buffer,
100        build_state.aabb_stride,
101        allowUpdate
102    );
103}
104
105metakernel
106TS_build_primrefs_array_of_pointers_indirect(MKTSBuildArgs build_state, qword indirectBuildRangeInfo, dword allowUpdate)
107{
108    define num_groups  REG0;
109    define groupsize_1 REG1; // groupsize - 1
110    define C_4         REG2;
111
112    // init with primitiveCount
113    num_groups = load_dword(indirectBuildRangeInfo);
114    groupsize_1 = 15; // BUILD_PRIMREFS_GROUPSIZE - 1
115    C_4 = 4;          // log_2(BUILD_PRIMREFS_GROUPSIZE)
116
117    num_groups = num_groups + groupsize_1;
118    num_groups = num_groups >> C_4; // num_groups / BUILD_PRIMREFS_GROUPSIZE;
119
120    DISPATCHDIM_X = num_groups.lo;
121    DISPATCHDIM_Y = 1;
122    DISPATCHDIM_Z = 1;
123
124    dispatch_indirect TS_primrefs_from_instances_ptrs_indirect args(
125        build_state.build_globals,
126        build_state.bvh_buffer,
127        build_state.instance_descs,
128        build_state.build_primref_buffer,
129        build_state.aabb_buffer,
130        build_state.is_procedural_buffer,
131        build_state.aabb_stride,
132        allowUpdate,
133        indirectBuildRangeInfo
134    );
135}
136
137
138
139
140const UPDATE_INSTANCE_LEAVES_GROUPSIZE = 16;
141
142struct MKTSUpdateArgs
143{
144    qword bvh_buffer;
145    qword instance_descs;
146    qword instance_descs_ptrs;
147    qword aabb_buffer;
148    qword is_procedural_buffer;
149    qword refit_scratch;
150    dword aabb_stride;
151    dword num_instances;
152};
153
154metakernel TS_update_instance_leaves( MKTSUpdateArgs update_state )
155{
156    define num_groups((update_state.num_instances + UPDATE_INSTANCE_LEAVES_GROUPSIZE - 1) / UPDATE_INSTANCE_LEAVES_GROUPSIZE);
157    dispatch TS_update_instance_leaves(num_groups, 1, 1) args(
158        update_state.bvh_buffer,
159        update_state.instance_descs,
160        update_state.instance_descs_ptrs,
161        update_state.refit_scratch,
162        update_state.aabb_buffer,
163        update_state.is_procedural_buffer,
164        update_state.aabb_stride
165    );
166}
167
168metakernel TS_update_instance_leaves_indirect( MKTSUpdateArgs update_state, qword indirectBuildRangeInfo )
169{
170    define num_groups  REG0;
171    define groupsize_1 REG1; // groupsize - 1
172    define C_4         REG2;
173
174    // init with primitiveCount
175    num_groups = load_dword(indirectBuildRangeInfo);
176    groupsize_1 = 15; // UPDATE_INSTANCE_LEAVES_GROUPSIZE - 1
177    C_4 = 4;          // log_2(UPDATE_INSTANCE_LEAVES_GROUPSIZE)
178
179    num_groups = num_groups + groupsize_1;
180    num_groups = num_groups >> C_4; // num_groups / UPDATE_INSTANCE_LEAVES_GROUPSIZE;
181
182    DISPATCHDIM_X = num_groups.lo;
183    DISPATCHDIM_Y = 1;
184    DISPATCHDIM_Z = 1;
185
186    // need to add indirect offset?
187    dispatch_indirect TS_update_instance_leaves args(
188        update_state.bvh_buffer,
189        update_state.instance_descs,
190        update_state.instance_descs_ptrs,
191        update_state.refit_scratch,
192        update_state.aabb_buffer,
193        update_state.is_procedural_buffer,
194        update_state.aabb_stride
195    );
196}
197
198metakernel TS_refit(MKTSUpdateArgs update_state, qword bvh_inner_nodes_start_value, qword bvh_inner_nodes_end )
199{
200    REG0 = bvh_inner_nodes_start_value;
201    REG1.lo = load_dword(bvh_inner_nodes_end);
202    REG1.hi = 0;
203    REG2 = REG1 - REG0;
204
205    DISPATCHDIM_X = REG2.lo;
206    DISPATCHDIM_Y = 1;
207    DISPATCHDIM_Z = 1;
208
209    dispatch_indirect TS_Refit_per_one_startpoint_sg
210    args(
211        update_state.bvh_buffer,
212        update_state.refit_scratch,
213        update_state.is_procedural_buffer
214    );
215}
216
217
218const FIXUP_LEAVES_NODES_PER_GROUP = 2;
219
220metakernel TS_fixup_leaves(MKTSBuildArgs build_state, qword bvh_inner_nodes_start_value, qword bvh_inner_nodes_end )
221{
222    define ONE REG3;
223
224    ONE = 1;
225    REG0 = bvh_inner_nodes_start_value;
226    REG1.lo = load_dword(bvh_inner_nodes_end);
227    REG1.hi = 0;
228    REG2 = REG1 - REG0;
229    REG2 = REG2 + ONE;
230    REG2 = REG2 >> ONE;
231
232    DISPATCHDIM_X = REG2.lo;
233    DISPATCHDIM_Y = 1;
234    DISPATCHDIM_Z = 1;
235
236    dispatch_indirect TS_fixup_leaves
237        args(
238            build_state.bvh_buffer,
239            build_state.leaf_creation_index_buffer,
240            build_state.build_primref_buffer,
241            build_state.leaf_creation_index_stride
242        );
243
244}
245