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