Documentation
¶
Overview ¶
Package raytracing provides core-level resource management for ray tracing acceleration structures (BLAS and TLAS).
This package is internal to wgpu and not intended for direct use by applications. The public API (core/ thin wrappers) will be added separately.
Architecture follows Rust wgpu-core resource.rs (Blas/Tlas structs) with compaction state tracking and build dependency ordering.
Index ¶
- func CompactionSavings(blas *Blas) uint64
- func CompleteCompaction(blas *Blas) error
- func RequestCompaction(blas *Blas) error
- func SetCompactedSize(blas *Blas, size uint64) error
- func ValidateBlasBuild(ctx DeviceContext, entry *BlasBuildEntry) error
- func ValidateBlasCreate(ctx DeviceContext, desc *gputypes.CreateBlasDescriptor, ...) error
- func ValidateTlasBuild(ctx DeviceContext, entry *TlasBuildEntry, blasMap map[uint64]*Blas) error
- func ValidateTlasCreate(ctx DeviceContext, desc *gputypes.CreateTlasDescriptor) error
- type Blas
- type BlasAction
- type BlasBuildEntry
- type BuildContext
- type CompactionState
- type DeviceContext
- type Tlas
- type TlasBuildEntry
- type ValidationError
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func CompactionSavings ¶
CompactionSavings returns the memory saved by compaction in bytes.
Returns 0 if the BLAS has not reached Ready or Compacted state, or if the compacted size is larger than the original (unlikely but possible for pathological geometry).
func CompleteCompaction ¶
CompleteCompaction marks compaction as done after a copy-compact operation.
Transitions: Ready -> Compacted. Returns an error if the BLAS is not in Ready state. After this call, no further compaction is possible.
The caller is responsible for performing the actual copy-compact via the HAL before calling this function.
func RequestCompaction ¶
RequestCompaction marks a BLAS for compaction query.
Transitions: Idle -> Waiting. Returns an error if the BLAS is not in Idle state or if it was not created with ASFlagAllowCompaction.
After this call, the caller should submit a compacted-size query to the GPU. When the query result is available, call SetCompactedSize.
Matches Rust wgpu-core Blas::prepare_compact (resource.rs:3382-3403).
func SetCompactedSize ¶
SetCompactedSize records the post-compaction size from GPU readback.
Transitions: Waiting -> Ready. Returns an error if the BLAS is not in Waiting state. The size is typically read from a query buffer after GPU execution.
Matches Rust wgpu-core Blas::on_pending_compact_resolve (resource.rs:3414-3451).
func ValidateBlasBuild ¶
func ValidateBlasBuild(ctx DeviceContext, entry *BlasBuildEntry) error
ValidateBlasBuild validates a BLAS build entry against device limits.
Checks:
- FeatureRayQuery must be enabled.
- Geometry count must not exceed MaxBlasGeometryCount.
- AABB geometries: stride >= AABBGeometryMinStride.
- Triangle geometries: transform buffer alignment.
Reference: Rust wgpu-core command/ray_tracing.rs iter_blas.
func ValidateBlasCreate ¶
func ValidateBlasCreate( ctx DeviceContext, desc *gputypes.CreateBlasDescriptor, sizes *gputypes.BlasGeometrySizeDescriptors, ) error
ValidateBlasCreate validates parameters for BLAS creation.
Checks:
- FeatureRayQuery must be enabled.
- Geometry count must not exceed MaxBlasGeometryCount.
- AABB stride must be >= AABBGeometryMinStride.
- Update mode PreferUpdate requires ASFlagAllowUpdate.
Reference: Rust wgpu-core device/resource.rs create_blas.
func ValidateTlasBuild ¶
func ValidateTlasBuild( ctx DeviceContext, entry *TlasBuildEntry, blasMap map[uint64]*Blas, ) error
ValidateTlasBuild validates a TLAS build entry.
Checks:
- FeatureRayQuery must be enabled.
- Instance count must not exceed MaxTlasInstanceCount.
- Instance count must not exceed TLAS MaxInstances.
- All referenced BLASes in blasMap must be built (BuiltIndex > 0).
Reference: Rust wgpu-core command/ray_tracing.rs tlas validation + ValidateAsActionsError (ray_tracing.rs:254-276).
func ValidateTlasCreate ¶
func ValidateTlasCreate( ctx DeviceContext, desc *gputypes.CreateTlasDescriptor, ) error
ValidateTlasCreate validates parameters for TLAS creation.
Checks:
- FeatureRayQuery must be enabled.
- MaxInstances must not exceed MaxTlasInstanceCount.
- MaxInstances must be > 0.
- Update mode PreferUpdate requires ASFlagAllowUpdate.
Reference: Rust wgpu-core device/resource.rs create_tlas.
Types ¶
type Blas ¶
type Blas struct {
// Label is the debug label from the creation descriptor.
Label string
// Raw is the underlying HAL acceleration structure handle.
// Nil if the BLAS is in an invalid state (e.g., creation failed).
Raw hal.AccelerationStructure
// SizeInfo contains the build/update/structure sizes returned by
// GetAccelerationStructureBuildSizes at creation time.
SizeInfo hal.AccelerationStructureBuildSizes
// Flags are the acceleration structure creation flags.
Flags gputypes.AccelerationStructureFlags
// UpdateMode determines whether this BLAS supports incremental updates.
UpdateMode gputypes.AccelerationStructureUpdateMode
// Compaction tracks the compaction lifecycle state.
// Matches Rust wgpu-core Blas.compacted_state (Mutex<BlasCompactState>).
Compaction CompactionState
// CompactedSize holds the compacted size in bytes, valid only when
// Compaction == CompactionReady.
CompactedSize uint64
// BuiltIndex is a monotonically increasing index assigned when this BLAS
// is built. Used for dependency ordering: a TLAS can only reference BLASes
// that were built before or in the same build command.
// Zero means not yet built.
// Matches Rust wgpu-core Blas.built_index (RwLock<Option<NonZeroU64>>).
BuiltIndex uint64
// GeometryCount is the number of geometries in this BLAS, stored at
// creation time for validation during build commands.
GeometryCount uint32
// Handle is the device address of this BLAS, used by TLAS instances
// to reference this structure. Set after the first successful build.
// Matches Rust wgpu-core Blas.handle (u64).
Handle uint64
}
Blas represents a bottom-level acceleration structure.
A BLAS contains geometry data (triangles or AABBs) and is referenced by TLAS instances. It owns a HAL AccelerationStructure handle and tracks compaction state for memory optimization.
Matches Rust wgpu-core resource.rs Blas struct (lines 3238-3252).
func (*Blas) AllowsCompaction ¶
AllowsCompaction returns true if this BLAS was created with the ASFlagAllowCompaction flag.
func (*Blas) AllowsUpdate ¶
AllowsUpdate returns true if this BLAS was created with the ASFlagAllowUpdate flag.
type BlasAction ¶
type BlasAction uint8
BlasAction describes what needs to happen to a BLAS during a build command.
const ( // BlasActionNone means no build action is required. BlasActionNone BlasAction = iota // BlasActionBuild means a full acceleration structure build is required. BlasActionBuild // BlasActionUpdate means an incremental update is sufficient (the BLAS // must have been previously built with ASFlagAllowUpdate). BlasActionUpdate )
func (BlasAction) String ¶
func (a BlasAction) String() string
String returns a human-readable name for the BLAS action.
type BlasBuildEntry ¶
type BlasBuildEntry struct {
// Blas is the acceleration structure to build or update.
Blas *Blas
// Geometries provides the geometry input for the build.
// Must match the geometry type (triangles or AABBs) used at creation.
Geometries *hal.AccelerationStructureEntries
}
BlasBuildEntry pairs a BLAS with the geometry data for building.
type BuildContext ¶
type BuildContext struct {
// contains filtered or unexported fields
}
BuildContext holds state for a single BuildAccelerationStructures call.
It tracks a monotonically increasing build index used for dependency ordering: a TLAS can only reference BLASes that were built in the same or an earlier build command (BuiltIndex > 0).
Matches Rust wgpu-core's build_acceleration_structures scratch size accumulation and built_index assignment.
func NewBuildContext ¶
func NewBuildContext(device DeviceContext, currentBuildIndex uint64) *BuildContext
NewBuildContext creates a build context with the given device and current build index. The build index should be incremented by the caller for each build command.
func (*BuildContext) PrepareBlasBuild ¶
func (bc *BuildContext) PrepareBlasBuild(entries []*BlasBuildEntry) (uint64, error)
PrepareBlasBuild validates and prepares BLAS entries for building.
It calculates the total scratch buffer size needed (aligned per adapter requirements) and assigns a BuiltIndex to each BLAS. The returned scratch size can be used to allocate a shared scratch buffer.
Reference: Rust wgpu-core command/ray_tracing.rs iter_blas().
func (*BuildContext) PrepareTlasBuild ¶
func (bc *BuildContext) PrepareTlasBuild(entries []*TlasBuildEntry) (uint64, error)
PrepareTlasBuild validates and prepares TLAS entries for building.
It verifies that all referenced BLASes have been built (BuiltIndex > 0) and calculates the total scratch buffer size. Each TLAS is assigned the current build index after successful preparation.
Reference: Rust wgpu-core command/ray_tracing.rs tlas loop (line 243-315).
type CompactionState ¶
type CompactionState uint8
CompactionState tracks the compaction lifecycle of a BLAS.
Transitions: Idle -> Waiting -> Ready -> Compacted.
Matches Rust wgpu-core BlasCompactState (resource.rs:3216-3225).
const ( // CompactionIdle means the BLAS has not been compacted and no compaction // has been requested. This is the initial state. CompactionIdle CompactionState = iota // CompactionWaiting means a compacted-size query has been submitted to // the GPU but the result is not yet available. CompactionWaiting // CompactionReady means the compacted size is available and the BLAS is // ready to be compacted via a copy operation. CompactionReady // CompactionCompacted means the BLAS has been compacted. No further // compaction is allowed (double-compaction is an error). CompactionCompacted )
func (CompactionState) String ¶
func (s CompactionState) String() string
String returns a human-readable name for the compaction state.
type DeviceContext ¶
type DeviceContext interface {
// CreateBuffer creates a GPU buffer for scratch or instance data.
CreateBuffer(desc *hal.BufferDescriptor) (hal.Buffer, error)
// DestroyBuffer releases a GPU buffer.
DestroyBuffer(buffer hal.Buffer)
// HALDevice returns the underlying HAL device for acceleration
// structure operations (create, destroy, build size queries).
HALDevice() hal.Device
// DeviceFeatures returns the features enabled on this device.
// Used to validate that RT features are present before operations.
DeviceFeatures() gputypes.Features
// DeviceLimits returns the resource limits of this device.
// Used to validate geometry counts, instance counts, etc.
DeviceLimits() gputypes.Limits
// DeviceAlignments returns the alignment requirements of this device.
// Used for scratch buffer alignment during AS builds.
DeviceAlignments() hal.Alignments
}
DeviceContext provides access to device-level operations needed by the ray tracing package. This interface breaks the import cycle between internal/raytracing/ and core/ — core.Device implements this interface and passes itself when calling RT functions.
Pattern: same as ssa.Frontend in Go compiler (internal package defines callback interface, parent implements it).
type Tlas ¶
type Tlas struct {
// Label is the debug label from the creation descriptor.
Label string
// Raw is the underlying HAL acceleration structure handle.
// Nil if the TLAS is in an invalid state.
Raw hal.AccelerationStructure
// SizeInfo contains the build/update/structure sizes returned by
// GetAccelerationStructureBuildSizes at creation time.
SizeInfo hal.AccelerationStructureBuildSizes
// Flags are the acceleration structure creation flags.
Flags gputypes.AccelerationStructureFlags
// UpdateMode determines whether this TLAS supports incremental updates.
UpdateMode gputypes.AccelerationStructureUpdateMode
// MaxInstances is the maximum number of BLAS instances this TLAS can
// hold, specified at creation time. Determines the instance buffer size.
// Matches Rust wgpu-core Tlas.max_instance_count.
MaxInstances uint32
// BuiltIndex is a monotonically increasing index assigned when this TLAS
// is built. Used for ordering builds within a single command.
// Zero means not yet built.
// Matches Rust wgpu-core Tlas.built_index (RwLock<Option<NonZeroU64>>).
BuiltIndex uint64
// InstanceBuffer is the persistent GPU buffer holding packed TlasInstance
// data (64 bytes per instance). Allocated at creation time and reused
// across rebuilds.
// Matches Rust wgpu-core TlasState.instance_buffer.
InstanceBuffer hal.Buffer
// Dependencies tracks the BLAS device addresses that this TLAS currently
// references. Updated on each build to reflect the active instance set.
// Used for validation: all referenced BLASes must be built before or in
// the same build command as this TLAS.
// Matches Rust wgpu-core Tlas.dependencies (RwLock<Vec<Arc<Blas>>>).
Dependencies []uint64
}
Tlas represents a top-level acceleration structure.
A TLAS contains instances that reference BLASes, forming the top of the two-level acceleration structure hierarchy used for ray tracing. It owns a HAL AccelerationStructure handle and a persistent GPU instance buffer.
Matches Rust wgpu-core resource.rs Tlas struct (lines 3474-3486).
func (*Tlas) AllowsUpdate ¶
AllowsUpdate returns true if this TLAS was created with the ASFlagAllowUpdate flag.
type TlasBuildEntry ¶
type TlasBuildEntry struct {
// Tlas is the acceleration structure to build or update.
Tlas *Tlas
// InstanceBuffer is the GPU buffer containing packed instance data.
InstanceBuffer hal.Buffer
// InstanceCount is the number of active instances in the buffer.
InstanceCount uint32
}
TlasBuildEntry pairs a TLAS with the instance buffer for building.
type ValidationError ¶
ValidationError represents a ray tracing validation failure.
Op identifies the operation that failed (e.g., "CreateBlas", "BuildTlas"). Message describes the specific validation rule that was violated.
func (*ValidationError) Error ¶
func (e *ValidationError) Error() string
Error implements the error interface.