xref: /aosp_15_r20/external/mesa3d/src/intel/vulkan/grl/gpu/rebraid.grl (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1//
2// Copyright (C) 2009-2021 Intel Corporation
3//
4// SPDX-License-Identifier: MIT
5//
6//
7
8module rebraid;
9
10kernel init_scratch             < source="bvh_rebraid.cl", kernelFunction="rebraid_init_scratch"                        >
11kernel chase_instance_ptrs      < source="bvh_rebraid.cl", kernelFunction="rebraid_chase_instance_pointers"             >
12kernel calc_aabb                < source="bvh_rebraid.cl", kernelFunction="rebraid_computeAABB_DXR_instances"           >
13kernel calc_aabb_indirect                < source="bvh_rebraid.cl", kernelFunction="rebraid_computeAABB_DXR_instances_indirect"           >
14kernel calc_aabb_ptr            < source="bvh_rebraid.cl", kernelFunction="rebraid_computeAABB_DXR_instances_pointers"  >
15kernel calc_aabb_ptr_indirect            < source="bvh_rebraid.cl", kernelFunction="rebraid_computeAABB_DXR_instances_pointers_indirect"  >
16kernel count_splits             < source="bvh_rebraid.cl", kernelFunction="rebraid_count_splits"          >
17kernel count_splits_SG          < source="bvh_rebraid.cl", kernelFunction="rebraid_count_splits_SG"       >
18kernel count_splits_SG_indirect          < source="bvh_rebraid.cl", kernelFunction="rebraid_count_splits_SG_indirect"       >
19kernel build_primrefs           < source="bvh_rebraid.cl", kernelFunction="rebraid_build_primrefs"        >
20kernel build_primrefs_indirect           < source="bvh_rebraid.cl", kernelFunction="rebraid_build_primrefs_indirect"        >
21
22//kernel ISA_TEST < source="bvh_rebraid.cl", kernelFunction="ISA_TEST" >
23//kernel DEBUG_PRINT < source="bvh_rebraid.cl", kernelFunction="DEBUG_PRINT" >
24
25
26const PRIMREF_GROUP_SIZE = 256;
27
28const COUNT_SPLITS_GROUP_SIZE = 16;
29
30struct MKRebraidArgs
31{
32  qword bvh_buffer;
33  qword primref_buffer;
34  qword global_buffer;
35  qword instances_buffer;
36  qword rebraid_scratch;
37  qword flat_instances_buffer;
38  dword num_instances;
39  dword num_extra_primrefs;
40};
41
42metakernel rebraid(
43    MKRebraidArgs Args
44  )
45{
46  dispatch init_scratch(1,1,1) args( Args.rebraid_scratch );
47  dispatch calc_aabb(Args.num_instances,1,1) args( Args.bvh_buffer, Args.instances_buffer );
48  control( wait_idle );
49
50  //define num_count_groups ((Args.num_instances + (COUNT_SPLITS_GROUP_SIZE-1)) / COUNT_SPLITS_GROUP_SIZE);
51  //dispatch count_splits(num_count_groups,1,1) args( Args.bvh_buffer, Args.instances_buffer, Args.rebraid_scratch, Args.num_instances );
52
53  dispatch count_splits_SG(Args.num_instances,1,1) args( Args.bvh_buffer, Args.instances_buffer, Args.rebraid_scratch );
54  control( wait_idle );
55
56  define num_primref_groups ((Args.num_instances + (PRIMREF_GROUP_SIZE-1)) / PRIMREF_GROUP_SIZE);
57
58  dispatch build_primrefs(num_primref_groups,1,1) args( Args.global_buffer, Args.bvh_buffer, Args.instances_buffer, Args.rebraid_scratch, Args.primref_buffer, Args.num_extra_primrefs, Args.num_instances );
59  control( wait_idle );
60
61  //dispatch DEBUG_PRINT(1,1,1) args( Args.global_buffer, Args.instances_buffer, Args.rebraid_scratch, Args.primref_buffer, Args.num_extra_primrefs, Args.num_instances );
62}
63
64metakernel rebraid_indirect(MKRebraidArgs Args, qword indirectBuildRangeInfo)
65{
66
67    dispatch init_scratch(1, 1, 1) args(Args.rebraid_scratch);
68
69    define num_groups  REG0;
70    num_groups = load_dword(indirectBuildRangeInfo);
71    DISPATCHDIM_X = num_groups.lo;
72    DISPATCHDIM_Y = 1;
73    DISPATCHDIM_Z = 1;
74
75    dispatch_indirect calc_aabb_indirect args(Args.bvh_buffer, Args.instances_buffer, indirectBuildRangeInfo);
76    control(wait_idle);
77
78    dispatch_indirect count_splits_SG_indirect
79        args(Args.bvh_buffer, Args.instances_buffer, Args.rebraid_scratch, indirectBuildRangeInfo);
80
81    define groupsize_1 REG1; // groupsize - 1
82    define C_8         REG2;
83
84    groupsize_1 = 255; // PRIMREF_GROUP_SIZE - 1
85    C_8 = 8;          // log_2(PRIMREF_GROUP_SIZE)
86
87    num_groups = num_groups + groupsize_1;
88    num_groups = num_groups >> C_8; // num_groups / PRIMREF_GROUP_SIZE;
89    DISPATCHDIM_X = num_groups.lo;
90
91    control(wait_idle);
92
93    dispatch_indirect build_primrefs_indirect args(
94        Args.global_buffer,
95        Args.bvh_buffer,
96        Args.instances_buffer,
97        Args.rebraid_scratch,
98        Args.primref_buffer,
99        indirectBuildRangeInfo,
100        Args.num_extra_primrefs);
101    control(wait_idle);
102}
103
104metakernel rebraid_ptrs(
105    MKRebraidArgs Args
106  )
107{
108  dispatch init_scratch(1,1,1) args( Args.rebraid_scratch );
109  dispatch chase_instance_ptrs( Args.num_instances, 1, 1)   args( Args.instances_buffer, Args.flat_instances_buffer );
110  dispatch calc_aabb_ptr(Args.num_instances,1,1) args( Args.bvh_buffer, Args.instances_buffer );
111  control( wait_idle );
112
113  //define num_count_groups ((Args.num_instances + (COUNT_SPLITS_GROUP_SIZE-1)) / COUNT_SPLITS_GROUP_SIZE);
114  //dispatch count_splits(num_count_groups,1,1) args( Args.bvh_buffer, Args.instances_buffer, Args.rebraid_scratch );
115
116  dispatch count_splits_SG(Args.num_instances,1,1) args( Args.bvh_buffer, Args.flat_instances_buffer, Args.rebraid_scratch );
117  control( wait_idle );
118
119  define num_primref_groups ((Args.num_instances + (PRIMREF_GROUP_SIZE-1)) / PRIMREF_GROUP_SIZE);
120
121
122  dispatch build_primrefs(num_primref_groups,1,1) args( Args.global_buffer, Args.bvh_buffer, Args.flat_instances_buffer, Args.rebraid_scratch,  Args.primref_buffer, Args.num_extra_primrefs, Args.num_instances );
123  control( wait_idle );
124
125}
126
127metakernel rebraid_ptrs_indirect(MKRebraidArgs Args, qword indirectBuildRangeInfo)
128{
129    dispatch init_scratch(1, 1, 1) args(Args.rebraid_scratch);
130
131    define num_groups  REG0;
132    num_groups = load_dword(indirectBuildRangeInfo);
133    DISPATCHDIM_X = num_groups.lo;
134    DISPATCHDIM_Y = 1;
135    DISPATCHDIM_Z = 1;
136
137    dispatch_indirect chase_instance_ptrs
138             args(Args.instances_buffer, Args.flat_instances_buffer, indirectBuildRangeInfo);
139    dispatch_indirect calc_aabb_ptr_indirect args(Args.bvh_buffer, Args.instances_buffer, indirectBuildRangeInfo);
140    control(wait_idle);
141
142    dispatch_indirect count_splits_SG_indirect
143        args(Args.bvh_buffer, Args.flat_instances_buffer, Args.rebraid_scratch, indirectBuildRangeInfo);
144
145    define groupsize_1 REG1; // groupsize - 1
146    define C_8         REG2;
147
148    groupsize_1 = 255; // PRIMREF_GROUP_SIZE - 1
149    C_8 = 8;          // log_2(PRIMREF_GROUP_SIZE)
150
151    num_groups = num_groups + groupsize_1;
152    num_groups = num_groups >> C_8; // num_groups / PRIMREF_GROUP_SIZE;
153    DISPATCHDIM_X = num_groups.lo;
154
155    control(wait_idle);
156
157    dispatch_indirect build_primrefs_indirect args(
158        Args.global_buffer,
159        Args.bvh_buffer,
160        Args.flat_instances_buffer,
161        Args.rebraid_scratch,
162        Args.primref_buffer,
163        Args.num_extra_primrefs,
164        indirectBuildRangeInfo,
165        Args.num_instances);
166    control(wait_idle);
167}
168