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