// Ray tracing // Major missing optimizations (no api surface changes needed): // - use custom tracker to track build state // - no forced rebuilt (build mode deduction) // - lazy instance buffer allocation // - maybe share scratch and instance staging buffer allocation // - partial instance buffer uploads (api surface already designed with this in mind) // - Batch BLAS read-backs (if it shows up in performance). // - ([non performance] extract function in build (rust function extraction with guards is a pain))
use alloc::{boxed::Box, sync::Arc, vec::Vec};
#[cfg(feature = "serde")] use macro_rules_attribute::apply; use thiserror::Error; use wgt::{
error::{ErrorType, WebGpuError},
AccelerationStructureGeometryFlags, BufferAddress, IndexFormat, VertexFormat,
};
#[derive(Clone, Debug, Error)] pubenum CreateBlasError { #[error(transparent)]
Device(#[from] DeviceError), #[error(transparent)]
MissingFeatures(#[from] MissingFeatures), #[error( "Only one of 'index_count' and 'index_format' was provided (either provide both or none)"
)]
MissingIndexData, #[error("Provided format was not within allowed formats. Provided format: {0:?}. Allowed formats: {1:?}")]
InvalidVertexFormat(VertexFormat, Vec<VertexFormat>), #[error("Limit `max_blas_geometry_count` is {0}, but the BLAS had {1} geometries")]
TooManyGeometries(u32, u32), #[error( "Limit `max_blas_primitive_count` is {0}, but the BLAS had a maximum of {1} primitives"
)]
TooManyPrimitives(u32, u32), #[error("AABB geometry stride {0} is invalid (must be >= {1} and a multiple of 8)")]
InvalidAabbStride(BufferAddress, BufferAddress),
}
#[derive(Clone, Debug, Error)] pubenum CreateTlasError { #[error(transparent)]
Device(#[from] DeviceError), #[error(transparent)]
MissingFeatures(#[from] MissingFeatures), #[error("Flag {0:?} is not allowed on a TLAS")]
DisallowedFlag(wgt::AccelerationStructureFlags), #[error("Limit `max_tlas_instance_count` is {0}, but the TLAS had a maximum of {1} instances")]
TooManyInstances(u32, u32),
}
/// Error encountered while attempting to do a copy on a command encoder. #[derive(Clone, Debug, Error)] pubenum BuildAccelerationStructureError { #[error(transparent)]
EncoderState(#[from] EncoderStateError),
#[error( "Data range of {region_size} B starting at offset {offset} would overrun the size {buffer_size} of buffer {buffer_ident:?}"
)]
InsufficientBufferSize {
buffer_ident: ResourceErrorIdent,
offset: BufferAddress,
region_size: BufferAddress,
buffer_size: BufferAddress,
},
#[error( "Offset {offset}, computed as {count} times {stride} B, exceeds the maximum addressable offset 2^32 - 1 within buffer {buffer_ident:?}"
)]
OffsetLimitedTo4GB {
buffer_ident: ResourceErrorIdent,
offset: BufferAddress,
count: BufferAddress,
stride: BufferAddress,
},
#[error("Buffer {0:?} associated offset doesn't align with the index type")]
UnalignedIndexBufferOffset(ResourceErrorIdent),
#[error("Buffer {0:?} associated offset is unaligned")]
UnalignedTransformBufferOffset(ResourceErrorIdent),
#[error("Buffer {0:?} associated index count not divisible by 3 (count: {1}")]
InvalidIndexCount(ResourceErrorIdent, u32),
#[error("Buffer {0:?} associated data contains None")]
MissingAssociatedData(ResourceErrorIdent),
#[error( "Blas {0:?} build sizes to may be greater than the descriptor at build time specified"
)]
IncompatibleBlasBuildSizes(ResourceErrorIdent),
#[error("Blas {0:?} build vertex count is greater than creation count (needs to be less than or equal to), creation: {1:?}, build: {2:?}")]
IncompatibleBlasVertexCount(ResourceErrorIdent, u32, u32),
#[error("Blas {0:?} stride was required to be at least {1} but stride given was {2}")]
VertexStrideTooSmall(ResourceErrorIdent, u64, u64),
#[error("Blas {0:?} stride was required to be a multiple of {1} but stride given was {2}")]
VertexStrideUnaligned(ResourceErrorIdent, u64, u64),
#[error("Blas {0:?} index count was provided at creation or building, but not the other")]
BlasIndexCountProvidedMismatch(ResourceErrorIdent),
#[error("Blas {0:?} build index count is greater than creation count (needs to be less than or equal to), creation: {1:?}, build: {2:?}")]
IncompatibleBlasIndexCount(ResourceErrorIdent, u32, u32),
#[error("Blas {0:?} index formats are different, creation format: {1:?}, provided: {2:?}")]
DifferentBlasIndexFormats(ResourceErrorIdent, Option<IndexFormat>, Option<IndexFormat>),
#[error("Blas {0:?} is compacted and so cannot be built")]
CompactedBlas(ResourceErrorIdent),
#[error("Blas {0:?} build sizes require index buffer but none was provided")]
MissingIndexBuffer(ResourceErrorIdent),
#[error( "Tlas {0:?} an associated instances contains an invalid custom index (more than 24bits)"
)]
TlasInvalidCustomIndex(ResourceErrorIdent),
#[error( "Tlas {0:?} has {1} active instances but only {2} are allowed as specified by the descriptor at creation"
)]
TlasInstanceCountExceeded(ResourceErrorIdent, u32, u32),
#[error("Blas {0:?} has flag USE_TRANSFORM but the transform buffer is missing")]
TransformMissing(ResourceErrorIdent),
#[error("Blas {0:?} is missing the flag USE_TRANSFORM but the transform buffer is set")]
UseTransformMissing(ResourceErrorIdent), #[error( "Tlas {0:?} dependent {1:?} is missing AccelerationStructureFlags::ALLOW_RAY_HIT_VERTEX_RETURN"
)]
TlasDependentMissingVertexReturn(ResourceErrorIdent, ResourceErrorIdent),
#[error("Blas {0:?} geometry kind at creation does not match build (triangles vs AABBs)")]
BlasGeometryKindMismatch(ResourceErrorIdent),
#[error( "Blas {0:?} build AABB primitive count is greater than creation count (creation: {1}, build: {2})"
)]
IncompatibleBlasAabbPrimitiveCount(ResourceErrorIdent, u32, u32),
#[error("Blas {0:?} AABB primitive offset must be a multiple of 8")]
UnalignedAabbPrimitiveOffset(ResourceErrorIdent),
#[error("Blas {0:?} AABB stride is invalid (must be >= {1} and a multiple of 8)")]
InvalidAabbStride(ResourceErrorIdent, BufferAddress),
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.