98 lines
3.1 KiB
Rust

use std::mem;
use wgpu::util::BufferInitDescriptor;
use wgpu::{
util::DeviceExt, Blas, BlasBuildEntry, BlasGeometries, BlasGeometrySizeDescriptors,
BlasTriangleGeometry, BlasTriangleGeometrySizeDescriptor, Buffer, CreateBlasDescriptor,
CreateTlasDescriptor, TlasInstance, TlasPackage,
};
use wgpu::{
AccelerationStructureFlags, AccelerationStructureGeometryFlags,
AccelerationStructureUpdateMode, BufferAddress, BufferUsages, VertexFormat,
};
use wgpu_test::TestingContext;
mod as_build;
mod as_create;
mod as_use_after_free;
mod scene;
mod shader;
pub struct AsBuildContext {
vertices: Buffer,
blas_size: BlasTriangleGeometrySizeDescriptor,
blas: Blas,
// Putting this last, forces the BLAS to die before the TLAS.
tlas_package: TlasPackage,
}
impl AsBuildContext {
pub fn new(
ctx: &TestingContext,
additional_blas_flags: AccelerationStructureFlags,
additional_tlas_flags: AccelerationStructureFlags,
) -> Self {
let vertices = ctx.device.create_buffer_init(&BufferInitDescriptor {
label: None,
contents: &[0; mem::size_of::<[[f32; 3]; 3]>()],
usage: BufferUsages::BLAS_INPUT,
});
let blas_size = BlasTriangleGeometrySizeDescriptor {
vertex_format: VertexFormat::Float32x3,
vertex_count: 3,
index_format: None,
index_count: None,
flags: AccelerationStructureGeometryFlags::empty(),
};
let blas = ctx.device.create_blas(
&CreateBlasDescriptor {
label: Some("BLAS"),
flags: AccelerationStructureFlags::PREFER_FAST_TRACE | additional_blas_flags,
update_mode: AccelerationStructureUpdateMode::Build,
},
BlasGeometrySizeDescriptors::Triangles {
descriptors: vec![blas_size.clone()],
},
);
let tlas = ctx.device.create_tlas(&CreateTlasDescriptor {
label: Some("TLAS"),
max_instances: 1,
flags: AccelerationStructureFlags::PREFER_FAST_TRACE | additional_tlas_flags,
update_mode: AccelerationStructureUpdateMode::Build,
});
let mut tlas_package = TlasPackage::new(tlas);
tlas_package[0] = Some(TlasInstance::new(
&blas,
[1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0],
0,
0xFF,
));
Self {
vertices,
blas_size,
blas,
tlas_package,
}
}
pub fn blas_build_entry(&self) -> BlasBuildEntry {
BlasBuildEntry {
blas: &self.blas,
geometry: BlasGeometries::TriangleGeometries(vec![BlasTriangleGeometry {
size: &self.blas_size,
vertex_buffer: &self.vertices,
first_vertex: 0,
vertex_stride: mem::size_of::<[f32; 3]>() as BufferAddress,
index_buffer: None,
first_index: None,
transform_buffer: None,
transform_buffer_offset: None,
}]),
}
}
}