1// 2// Copyright (C) 2009-2021 Intel Corporation 3// 4// SPDX-License-Identifier: MIT 5// 6// 7 8module leaf_builder; 9 10kernel_module leaf_kernels ("bvh_build_leaf.cl") 11{ 12 links lsc_intrinsics; 13 14 kernel opencl_kernel_primref_to_quads < kernelFunction="primref_to_quads" >; 15 kernel opencl_kernel_primref_to_procedurals < kernelFunction="primref_to_procedurals" >; 16 kernel opencl_kernel_create_HW_instance_nodes < kernelFunction="create_HW_instance_nodes" >; 17 kernel opencl_kernel_create_HW_instance_nodes_pointers < kernelFunction="create_HW_instance_nodes_pointers" >; 18} 19 20import struct MKBuilderState "structs.grl"; 21import struct MKSizeEstimate "structs.grl"; 22 23const Instances_GROUPSIZE = 16; 24 25metakernel buildLeafDXR_instances( 26 MKBuilderState state, 27 qword build_primref_index_buffers, 28 qword srcInstanceDescrArray, 29 dword stride, 30 dword offset, 31 dword numPrims) 32{ 33 define num_groups (numPrims+Instances_GROUPSIZE-1)/Instances_GROUPSIZE; 34 dispatch opencl_kernel_create_HW_instance_nodes(num_groups,1,1) args( 35 state.build_globals, 36 build_primref_index_buffers, 37 state.build_primref_buffer, 38 state.bvh_buffer, 39 srcInstanceDescrArray, 40 stride, 41 offset); 42} 43 44metakernel buildLeafDXR_instances_indirect( 45 MKBuilderState state, 46 qword build_primref_index_buffers, 47 qword srcInstanceDescrArray, 48 qword indirectBuildRangeInfo, 49 dword stride, 50 dword offset) 51{ 52 define num_groups REG0; 53 define groupsize_1 REG1; // groupsize - 1 54 define C_4 REG2; 55 56 // init with primitiveCount 57 num_groups = load_dword(indirectBuildRangeInfo); 58 groupsize_1 = 15; // Instances_GROUPSIZE - 1 59 C_4 = 4; // log_2(Instances_GROUPSIZE) 60 61 num_groups = num_groups + groupsize_1; 62 num_groups = num_groups >> C_4; // num_groups / Instances_GROUPSIZE; 63 64 DISPATCHDIM_X = num_groups.lo; 65 DISPATCHDIM_Y = 1; 66 DISPATCHDIM_Z = 1; 67 68 dispatch_indirect opencl_kernel_create_HW_instance_nodes args( 69 state.build_globals, 70 build_primref_index_buffers, 71 state.build_primref_buffer, 72 state.bvh_buffer, 73 srcInstanceDescrArray, 74 stride, 75 offset); 76} 77 78metakernel buildLeafDXR_instances_pointers( 79 MKBuilderState state, 80 qword build_primref_index_buffers, 81 qword srcInstanceDescrArrayPtr, 82 dword stride, 83 dword offset, 84 dword numPrims) 85{ 86 define num_groups (numPrims+Instances_GROUPSIZE-1)/Instances_GROUPSIZE; 87 dispatch opencl_kernel_create_HW_instance_nodes_pointers(num_groups,1,1) args( 88 state.build_globals, 89 build_primref_index_buffers, 90 state.build_primref_buffer, 91 state.bvh_buffer, 92 srcInstanceDescrArrayPtr, 93 stride, 94 offset); 95} 96 97metakernel buildLeafDXR_instances_pointers_indirect( 98 MKBuilderState state, 99 qword build_primref_index_buffers, 100 qword srcInstanceDescrArrayPtr, 101 qword indirectBuildRangeInfo, 102 dword stride, 103 dword offset) 104{ 105 define num_groups REG0; 106 define groupsize_1 REG1; // groupsize - 1 107 define C_4 REG2; 108 109 // init with primitiveCount 110 num_groups = load_dword(indirectBuildRangeInfo); 111 groupsize_1 = 15; // Instances_GROUPSIZE - 1 112 C_4 = 4; // log_2(Instances_GROUPSIZE) 113 114 num_groups = num_groups + groupsize_1; 115 num_groups = num_groups >> C_4; // num_groups / Instances_GROUPSIZE; 116 117 DISPATCHDIM_X = num_groups.lo; 118 DISPATCHDIM_Y = 1; 119 DISPATCHDIM_Z = 1; 120 121 dispatch_indirect opencl_kernel_create_HW_instance_nodes_pointers args( 122 state.build_globals, 123 build_primref_index_buffers, 124 state.build_primref_buffer, 125 state.bvh_buffer, 126 srcInstanceDescrArrayPtr, 127 stride, 128 offset); 129} 130 131metakernel buildLeafDXR_procedurals( 132 MKBuilderState state, 133 qword build_primref_index_buffers, 134 dword stride, 135 dword offset, 136 qword p_numPrimitives) 137{ 138 define C_1 REG0; 139 define REG_PRIMS_PER_WG REG1; 140 define REG_PRIMS_PER_WG_SHR REG2; 141 142 C_1 = 1; 143 REG_PRIMS_PER_WG = 16; 144 REG_PRIMS_PER_WG_SHR = 4;// We cannot use div, so we use shift right instead (shift by 4 = div by 16 elements) 145 146 define reg_numPrimitives REG3; 147 define reg_num_wgs REG4; 148 149 reg_numPrimitives = load_dword(p_numPrimitives); 150 reg_num_wgs = reg_numPrimitives + REG_PRIMS_PER_WG; 151 reg_num_wgs = reg_num_wgs - C_1; 152 reg_num_wgs = reg_num_wgs >> REG_PRIMS_PER_WG_SHR; 153 154 DISPATCHDIM_X = reg_num_wgs; 155 DISPATCHDIM_Y = 1; 156 DISPATCHDIM_Z = 1; 157 158 dispatch_indirect opencl_kernel_primref_to_procedurals args( 159 state.build_globals, 160 state.build_primref_buffer, 161 build_primref_index_buffers, 162 state.bvh_buffer, 163 state.geomDesc_buffer, 164 stride, 165 offset); 166} 167 168metakernel buildLeafDXR_quads( 169 MKBuilderState state, 170 qword build_primref_index_buffers, 171 dword stride, 172 dword offset, 173 qword p_numPrimitives, 174 dword allow_update) 175{ 176 define C_1 REG0; 177 define REG_PRIMS_PER_WG REG1; 178 define SHIFT REG2; 179 180 C_1 = 1; 181 REG_PRIMS_PER_WG = 32; 182 SHIFT = 4;// We cannot use div, so we use shift right instead (shift by 4 = div by 16 elements) 183 184 define reg_numPrimitives REG3; 185 define reg_num_wgs REG4; 186 187 reg_numPrimitives = load_dword(p_numPrimitives); 188 reg_num_wgs = reg_numPrimitives + REG_PRIMS_PER_WG; 189 reg_num_wgs = reg_num_wgs - C_1; 190 reg_num_wgs = reg_num_wgs >> SHIFT; 191 reg_num_wgs = reg_num_wgs >> C_1; 192 193 DISPATCHDIM_X = reg_num_wgs; 194 DISPATCHDIM_Y = 1; 195 DISPATCHDIM_Z = 1; 196 197 dispatch_indirect opencl_kernel_primref_to_quads args( 198 state.build_globals, 199 state.build_primref_buffer, 200 build_primref_index_buffers, 201 state.bvh_buffer, 202 state.geomDesc_buffer, 203 stride, 204 offset, 205 allow_update); 206} 207