use crate::Device;
bitflags::bitflags! {
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct AccelerationStructureFlags: u8 {
const ALLOW_UPDATE = 1;
const PREFER_FAST_TRACE = 1 << 1;
const PREFER_FAST_BUILD = 1 << 2;
const LOW_MEMORY = 1 << 3;
}
}
bitflags::bitflags! {
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct AccelerationGeometryFlags: u8 {
const OPAQUE = 1;
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum AccelerationStructureUpdateMode {
#[default]
Build,
PreferUpdate,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum AccelerationIndexFormat {
Uint16,
Uint32,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct TriangleGeometrySize {
pub vertex_count: u32,
pub indices: Option<(AccelerationIndexFormat, u32)>,
pub flags: AccelerationGeometryFlags,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct AabbGeometrySize {
pub primitive_count: u32,
pub flags: AccelerationGeometryFlags,
}
#[derive(Clone, Copy, Debug)]
pub enum BlasGeometrySizes<'a> {
Triangles(&'a [TriangleGeometrySize]),
Aabbs(&'a [AabbGeometrySize]),
}
#[derive(Clone, Copy, Debug)]
pub struct BlasDesc<'a> {
pub label: &'static str,
pub flags: AccelerationStructureFlags,
pub update_mode: AccelerationStructureUpdateMode,
pub geometries: BlasGeometrySizes<'a>,
}
#[derive(Clone, Copy, Debug)]
pub struct TlasDesc {
pub label: &'static str,
pub max_instances: u32,
pub flags: AccelerationStructureFlags,
pub update_mode: AccelerationStructureUpdateMode,
}
#[derive(Clone, Copy, Debug)]
pub struct TriangleGeometry<'a, D: Device> {
pub size: &'a TriangleGeometrySize,
pub vertex_buffer: &'a D::Buffer,
pub first_vertex: u32,
pub vertex_stride: u64,
pub indices: Option<(&'a D::Buffer, u32, AccelerationIndexFormat)>,
}
#[derive(Clone, Copy, Debug)]
pub struct AabbGeometry<'a, D: Device> {
pub size: &'a AabbGeometrySize,
pub buffer: &'a D::Buffer,
pub offset: u32,
pub stride: u64,
}
#[derive(Clone, Copy, Debug)]
pub enum BlasGeometries<'a, D: Device> {
Triangles(&'a [TriangleGeometry<'a, D>]),
Aabbs(&'a [AabbGeometry<'a, D>]),
}
#[derive(Clone, Copy, Debug)]
pub struct BlasBuildDesc<'a, D: Device> {
pub blas: &'a D::Blas,
pub geometries: BlasGeometries<'a, D>,
}
#[derive(Clone, Copy, Debug)]
pub struct TlasInstance<'a, D: Device> {
pub blas: &'a D::Blas,
pub transform: [f32; 12],
pub custom_data: u32,
pub mask: u8,
}