mesa/src/intel/vulkan/grl/gpu/build_primref.grl
Jason Ekstrand 5f948503e4 anv: Import GRL
GRL, or Graphics Library for Ray-tracing is a library we share with the
Windows drivers for doing BVH builds on the GPU.  It consists of a few
headers shared between CL and C code, a bunch of CL kernels, and some
GRL meta-kernels in their own format.

Acked-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Acked-by: Caio Oliveira <caio.oliveira@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16970>
2022-09-28 05:38:37 +00:00

229 lines
7.5 KiB
Text

//
// 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));
}