use crate::dispatch;
use crate::{Buffer, Label};
use wgt::WasmNotSendSync;
pub type BlasTriangleGeometrySizeDescriptor = wgt::BlasTriangleGeometrySizeDescriptor;
static_assertions::assert_impl_all!(BlasTriangleGeometrySizeDescriptor: Send, Sync);
pub type BlasGeometrySizeDescriptors = wgt::BlasGeometrySizeDescriptors;
static_assertions::assert_impl_all!(BlasGeometrySizeDescriptors: Send, Sync);
pub type AccelerationStructureFlags = wgt::AccelerationStructureFlags;
static_assertions::assert_impl_all!(AccelerationStructureFlags: Send, Sync);
pub type AccelerationStructureGeometryFlags = wgt::AccelerationStructureGeometryFlags;
static_assertions::assert_impl_all!(AccelerationStructureGeometryFlags: Send, Sync);
pub type AccelerationStructureUpdateMode = wgt::AccelerationStructureUpdateMode;
static_assertions::assert_impl_all!(AccelerationStructureUpdateMode: Send, Sync);
pub type CreateBlasDescriptor<'a> = wgt::CreateBlasDescriptor<Label<'a>>;
static_assertions::assert_impl_all!(CreateBlasDescriptor<'_>: Send, Sync);
#[derive(Debug, Clone)]
pub struct TlasInstance {
pub(crate) blas: dispatch::DispatchBlas,
pub transform: [f32; 12],
pub custom_index: u32,
pub mask: u8,
}
impl TlasInstance {
pub fn new(blas: &Blas, transform: [f32; 12], custom_index: u32, mask: u8) -> Self {
Self {
blas: blas.inner.clone(),
transform,
custom_index,
mask,
}
}
pub fn set_blas(&mut self, blas: &Blas) {
self.blas = blas.inner.clone();
}
}
#[derive(Debug)]
pub struct BlasTriangleGeometry<'a> {
pub size: &'a BlasTriangleGeometrySizeDescriptor,
pub vertex_buffer: &'a Buffer,
pub first_vertex: u32,
pub vertex_stride: wgt::BufferAddress,
pub index_buffer: Option<&'a Buffer>,
pub first_index: Option<u32>,
pub transform_buffer: Option<&'a Buffer>,
pub transform_buffer_offset: Option<wgt::BufferAddress>,
}
static_assertions::assert_impl_all!(BlasTriangleGeometry<'_>: WasmNotSendSync);
pub enum BlasGeometries<'a> {
TriangleGeometries(Vec<BlasTriangleGeometry<'a>>),
}
static_assertions::assert_impl_all!(BlasGeometries<'_>: WasmNotSendSync);
pub struct BlasBuildEntry<'a> {
pub blas: &'a Blas,
pub geometry: BlasGeometries<'a>,
}
static_assertions::assert_impl_all!(BlasBuildEntry<'_>: WasmNotSendSync);
#[derive(Debug, Clone)]
pub struct Blas {
pub(crate) handle: Option<u64>,
pub(crate) inner: dispatch::DispatchBlas,
}
static_assertions::assert_impl_all!(Blas: WasmNotSendSync);
crate::cmp::impl_eq_ord_hash_proxy!(Blas => .inner);
impl Blas {
pub fn handle(&self) -> Option<u64> {
self.handle
}
}
pub struct ContextBlasTriangleGeometry<'a> {
#[expect(dead_code)]
pub(crate) size: &'a BlasTriangleGeometrySizeDescriptor,
#[expect(dead_code)]
pub(crate) vertex_buffer: &'a dispatch::DispatchBuffer,
#[expect(dead_code)]
pub(crate) index_buffer: Option<&'a dispatch::DispatchBuffer>,
#[expect(dead_code)]
pub(crate) transform_buffer: Option<&'a dispatch::DispatchBuffer>,
#[expect(dead_code)]
pub(crate) first_vertex: u32,
#[expect(dead_code)]
pub(crate) vertex_stride: wgt::BufferAddress,
#[expect(dead_code)]
pub(crate) index_buffer_offset: Option<wgt::BufferAddress>,
#[expect(dead_code)]
pub(crate) transform_buffer_offset: Option<wgt::BufferAddress>,
}
pub enum ContextBlasGeometries<'a> {
TriangleGeometries(Box<dyn Iterator<Item = ContextBlasTriangleGeometry<'a>> + 'a>),
}
pub struct ContextBlasBuildEntry<'a> {
#[expect(dead_code)]
pub(crate) blas: &'a dispatch::DispatchBlas,
#[expect(dead_code)]
pub(crate) geometries: ContextBlasGeometries<'a>,
}