// // Copyright (C) 2009-2021 Intel Corporation // // SPDX-License-Identifier: MIT // // module build_primref; kernel_module primref_kernels ("bvh_build_primref.cl") { links lsc_intrinsics; kernel opencl_kernel_primrefs_from_DXR_instances < kernelFunction="primrefs_from_DXR_instances" >; kernel opencl_kernel_primrefs_from_DXR_instances_indirect < kernelFunction="primrefs_from_DXR_instances_indirect" >; kernel opencl_kernel_primrefs_from_DXR_instances_pointers < kernelFunction="primrefs_from_DXR_instances_pointers" >; kernel opencl_kernel_primrefs_from_DXR_instances_pointers_indirect < kernelFunction="primrefs_from_DXR_instances_pointers_indirect" >; kernel opencl_kernel_triangles_to_primrefs < kernelFunction="triangles_to_primrefs" >; kernel opencl_kernel_triangles_to_primrefs_indirect < kernelFunction="triangles_to_primrefs_indirect" >; kernel opencl_kernel_procedurals_to_primrefs < kernelFunction="procedurals_to_primrefs" >; kernel opencl_kernel_procedurals_to_primrefs_indirect < kernelFunction="procedurals_to_primrefs_indirect" >; } import struct MKBuilderState "structs.grl"; import struct MKSizeEstimate "structs.grl"; const PrimirefsFromInstances_GROUPSIZE = 16; metakernel buildPrimirefsFromInstances( qword instanceDescBuff, MKSizeEstimate estimate, MKBuilderState build_state, dword allowUpdate) { define num_groups ((estimate.numPrimitives + PrimirefsFromInstances_GROUPSIZE-1)/PrimirefsFromInstances_GROUPSIZE); dispatch opencl_kernel_primrefs_from_DXR_instances(num_groups,1,1) args( build_state.build_globals, build_state.bvh_buffer, instanceDescBuff, estimate.numPrimitives, build_state.build_primref_buffer, allowUpdate); } metakernel buildPrimirefsFromInstancesIndirect( qword instanceDescBuff, qword indirectBuildRangeInfo, MKBuilderState build_state, dword allowUpdate) { define num_groups REG0; define groupsize_1 REG1; // groupsize - 1 define C_4 REG2; // init with primitiveCount num_groups = load_dword(indirectBuildRangeInfo); groupsize_1 = 15; // PrimirefsFromInstances_GROUPSIZE - 1 C_4 = 4; // log_2(PrimirefsFromInstances_GROUPSIZE) num_groups = num_groups + groupsize_1; num_groups = num_groups >> C_4; // num_groups / PrimirefsFromInstances_GROUPSIZE; DISPATCHDIM_X = num_groups.lo; DISPATCHDIM_Y = 1; DISPATCHDIM_Z = 1; dispatch_indirect opencl_kernel_primrefs_from_DXR_instances_indirect args( build_state.build_globals, build_state.bvh_buffer, instanceDescBuff, indirectBuildRangeInfo, build_state.build_primref_buffer, allowUpdate); } metakernel buildPrimirefsFromInstancesArrOfPtrs( qword instanceDescPtrArrayBuff, MKSizeEstimate estimate, MKBuilderState build_state, dword allowUpdate) { define num_groups ((estimate.numPrimitives + PrimirefsFromInstances_GROUPSIZE-1)/PrimirefsFromInstances_GROUPSIZE); dispatch opencl_kernel_primrefs_from_DXR_instances_pointers(num_groups,1,1) args( build_state.build_globals, build_state.bvh_buffer, instanceDescPtrArrayBuff, estimate.numPrimitives, build_state.build_primref_buffer, allowUpdate); } metakernel buildPrimirefsFromInstancesArrOfPtrsIndirect( qword instanceDescPtrArrayBuff, qword indirectBuildRangeInfo, MKSizeEstimate estimate, MKBuilderState build_state, dword allowUpdate) { define num_groups REG0; define groupsize_1 REG1; // groupsize - 1 define C_4 REG2; // init with primitiveCount num_groups = load_dword(indirectBuildRangeInfo); groupsize_1 = 15; // PrimirefsFromInstances_GROUPSIZE - 1 C_4 = 4; // log_2(PrimirefsFromInstances_GROUPSIZE) num_groups = num_groups + groupsize_1; num_groups = num_groups >> C_4; // num_groups / PrimirefsFromInstances_GROUPSIZE; DISPATCHDIM_X = num_groups.lo; DISPATCHDIM_Y = 1; DISPATCHDIM_Z = 1; dispatch_indirect opencl_kernel_primrefs_from_DXR_instances_pointers_indirect args( build_state.build_globals, build_state.bvh_buffer, instanceDescPtrArrayBuff, build_state.build_primref_buffer, indirectBuildRangeInfo, allowUpdate); } metakernel primrefs_from_tris( MKBuilderState build_state, MKSizeEstimate estimate, qword geo_ptr, dword geom_id, dword geom_flags, dword num_prims) { define num_threads ((num_prims+15)/16); dispatch opencl_kernel_triangles_to_primrefs(num_threads,1,1) args( build_state.build_globals, build_state.bvh_buffer, build_state.build_primref_buffer, geo_ptr, (geom_id & 0x00ffffff) + (geom_flags<<24), num_prims); } metakernel primrefs_from_tris_indirect( MKBuilderState build_state, MKSizeEstimate estimate, qword geo_ptr, qword indirectBuildRangeInfo, dword geom_id, dword geom_flags) { define num_groups REG0; define groupsize_1 REG1; // groupsize - 1 define C_4 REG2; // init with primitiveCount num_groups = load_dword(indirectBuildRangeInfo); groupsize_1 = 15; // PrimirefsFromInstances_GROUPSIZE - 1 C_4 = 4; // log_2(PrimirefsFromInstances_GROUPSIZE) num_groups = num_groups + groupsize_1; num_groups = num_groups >> C_4; // num_groups / PrimirefsFromInstances_GROUPSIZE; DISPATCHDIM_X = num_groups.lo; DISPATCHDIM_Y = 1; DISPATCHDIM_Z = 1; dispatch_indirect opencl_kernel_triangles_to_primrefs_indirect args( build_state.build_globals, build_state.bvh_buffer, build_state.build_primref_buffer, geo_ptr, indirectBuildRangeInfo, (geom_id & 0x00ffffff) + (geom_flags << 24)); } metakernel primrefs_from_proc( MKBuilderState build_state, MKSizeEstimate estimate, qword geo_ptr, dword geom_id, dword geom_flags, dword num_prims) { define num_threads ((num_prims+15)/16); dispatch opencl_kernel_procedurals_to_primrefs(num_threads,1,1) args( build_state.build_globals, build_state.bvh_buffer, build_state.build_primref_buffer, geo_ptr, (geom_id & 0x00ffffff) + (geom_flags<<24), num_prims); } metakernel primrefs_from_proc_indirect( MKBuilderState build_state, MKSizeEstimate estimate, qword geo_ptr, qword indirectBuildRangeInfo, dword geom_id, dword geom_flags) { define num_groups REG0; define groupsize_1 REG1; // groupsize - 1 define C_4 REG2; // init with primitiveCount num_groups = load_dword(indirectBuildRangeInfo); groupsize_1 = 15; // PrimirefsFromInstances_GROUPSIZE - 1 C_4 = 4; // log_2(PrimirefsFromInstances_GROUPSIZE) num_groups = num_groups + groupsize_1; num_groups = num_groups >> C_4; // num_groups / PrimirefsFromInstances_GROUPSIZE; DISPATCHDIM_X = num_groups.lo; DISPATCHDIM_Y = 1; DISPATCHDIM_Z = 1; dispatch_indirect opencl_kernel_procedurals_to_primrefs_indirect args( build_state.build_globals, build_state.bvh_buffer, build_state.build_primref_buffer, geo_ptr, indirectBuildRangeInfo, (geom_id & 0x00ffffff) + (geom_flags<<24)); }