use alloc::vec::Vec;
#[cfg(any(feature = "serde", test))]
use serde::{Deserialize, Serialize};
#[cfg(doc)]
use crate::{Features, VertexFormat};
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct BlasTriangleGeometrySizeDescriptor {
pub vertex_format: crate::VertexFormat,
pub vertex_count: u32,
pub index_format: Option<crate::IndexFormat>,
pub index_count: Option<u32>,
pub flags: AccelerationStructureGeometryFlags,
}
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct BlasAABBGeometrySizeDescriptor {
pub primitive_count: u32,
pub flags: AccelerationStructureGeometryFlags,
}
pub const AABB_GEOMETRY_MIN_STRIDE: crate::BufferAddress = 24;
#[derive(Clone, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum BlasGeometrySizeDescriptors {
Triangles {
descriptors: Vec<BlasTriangleGeometrySizeDescriptor>,
},
AABBs {
descriptors: Vec<BlasAABBGeometrySizeDescriptor>,
},
}
#[repr(u8)]
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum AccelerationStructureUpdateMode {
Build,
PreferUpdate,
}
#[repr(C)]
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct CreateBlasDescriptor<L> {
pub label: L,
pub flags: AccelerationStructureFlags,
pub update_mode: AccelerationStructureUpdateMode,
}
impl<L> CreateBlasDescriptor<L> {
pub fn map_label<'a, K>(&'a self, fun: impl FnOnce(&'a L) -> K) -> CreateBlasDescriptor<K> {
CreateBlasDescriptor {
label: fun(&self.label),
flags: self.flags,
update_mode: self.update_mode,
}
}
}
#[repr(C)]
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct CreateTlasDescriptor<L> {
pub label: L,
pub max_instances: u32,
pub flags: AccelerationStructureFlags,
pub update_mode: AccelerationStructureUpdateMode,
}
impl<L> CreateTlasDescriptor<L> {
pub fn map_label<'a, K>(&'a self, fun: impl FnOnce(&'a L) -> K) -> CreateTlasDescriptor<K> {
CreateTlasDescriptor {
label: fun(&self.label),
flags: self.flags,
update_mode: self.update_mode,
max_instances: self.max_instances,
}
}
}
bitflags::bitflags!(
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serde", serde(transparent))]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub struct AccelerationStructureFlags: u8 {
const ALLOW_UPDATE = 1 << 0;
const ALLOW_COMPACTION = 1 << 1;
const PREFER_FAST_TRACE = 1 << 2;
const PREFER_FAST_BUILD = 1 << 3;
const LOW_MEMORY = 1 << 4;
const USE_TRANSFORM = 1 << 5;
const ALLOW_RAY_HIT_VERTEX_RETURN = 1 << 6;
}
);
bitflags::bitflags!(
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serde", serde(transparent))]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub struct AccelerationStructureGeometryFlags: u8 {
const OPAQUE = 1 << 0;
const NO_DUPLICATE_ANY_HIT_INVOCATION = 1 << 1;
}
);
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum AccelerationStructureCopy {
Clone,
Compact,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum AccelerationStructureType {
Triangles,
AABBs,
Instances,
}
pub const TRANSFORM_BUFFER_ALIGNMENT: crate::BufferAddress = 16;
pub const INSTANCE_BUFFER_ALIGNMENT: crate::BufferAddress = 16;