mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-28 23:20:08 +01:00
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>
229 lines
7.5 KiB
Text
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));
|
|
}
|