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