[core] Add RawResourceAccess trait

This commit is contained in:
Connor Fitzgerald 2025-06-26 18:13:29 -04:00
parent 795fe3bf27
commit a248b8caf3
17 changed files with 80 additions and 85 deletions

View File

@ -5,7 +5,7 @@ use crate::{
AdapterId, BlasId, BufferId, CommandEncoderId, DeviceId, QueueId, SurfaceId, TextureId,
TextureViewId, TlasId,
},
resource::AccelerationStructure,
resource::RawResourceAccess,
};
impl Global {

View File

@ -26,7 +26,8 @@ use crate::{
pipeline::{ComputePipeline, RenderPipeline},
resource::{
Buffer, DestroyedResourceError, InvalidResourceError, Labeled, MissingBufferUsageError,
MissingTextureUsageError, ResourceErrorIdent, Sampler, TextureView, Tlas, TrackingData,
MissingTextureUsageError, RawResourceAccess, ResourceErrorIdent, Sampler, TextureView,
Tlas, TrackingData,
},
resource_log,
snatch::{SnatchGuard, Snatchable},

View File

@ -111,7 +111,7 @@ use crate::{
pipeline::{PipelineFlags, RenderPipeline, VertexStep},
resource::{
Buffer, DestroyedResourceError, Fallible, InvalidResourceError, Labeled, ParentDevice,
TrackingData,
RawResourceAccess, TrackingData,
},
resource_log,
snatch::SnatchGuard,

View File

@ -13,7 +13,7 @@ use crate::{
init_tracker::{MemoryInitKind, TextureInitRange},
resource::{
DestroyedResourceError, InvalidResourceError, Labeled, MissingBufferUsageError,
ParentDevice, ResourceErrorIdent, Texture, TextureClearMode,
ParentDevice, RawResourceAccess, ResourceErrorIdent, Texture, TextureClearMode,
},
snatch::SnatchGuard,
track::TextureTrackerSetSingle,

View File

@ -7,9 +7,9 @@ use wgt::{
use alloc::{borrow::Cow, boxed::Box, sync::Arc, vec::Vec};
use core::{fmt, str};
use crate::binding_model::BindError;
use crate::command::{pass, EncoderStateError, PassStateError, TimestampWritesError};
use crate::resource::DestroyedResourceError;
use crate::{binding_model::BindError, resource::RawResourceAccess};
use crate::{
binding_model::{LateMinBufferBindingSizeMismatch, PushConstantUploadError},
command::{

View File

@ -9,7 +9,7 @@ use hashbrown::hash_map::Entry;
use crate::{
device::Device,
init_tracker::*,
resource::{DestroyedResourceError, ParentDevice, Texture, Trackable},
resource::{DestroyedResourceError, ParentDevice, RawResourceAccess, Texture, Trackable},
snatch::SnatchGuard,
track::{DeviceTracker, TextureTracker},
FastHashMap,

View File

@ -11,7 +11,7 @@ use crate::{
init_tracker::MemoryInitKind,
resource::{
DestroyedResourceError, InvalidResourceError, MissingBufferUsageError, ParentDevice,
QuerySet, Trackable,
QuerySet, RawResourceAccess, Trackable,
},
track::{StatelessTracker, TrackerIndex},
FastHashMap,

View File

@ -7,7 +7,6 @@ use core::{
use wgt::{math::align_to, BufferUsages, BufferUses, Features};
use crate::lock::RwLockWriteGuard;
use crate::ray_tracing::{AsAction, AsBuild, TlasBuild, ValidateAsActionsError};
use crate::{
command::CommandBufferMutable,
@ -21,14 +20,13 @@ use crate::{
TlasInstance, TlasPackage, TraceBlasBuildEntry, TraceBlasGeometries,
TraceBlasTriangleGeometry, TraceTlasInstance, TraceTlasPackage,
},
resource::{
AccelerationStructure, Blas, BlasCompactState, Buffer, Labeled, StagingBuffer, Tlas,
},
resource::{Blas, BlasCompactState, Buffer, Labeled, StagingBuffer, Tlas},
scratch::ScratchBuffer,
snatch::SnatchGuard,
track::PendingTransition,
};
use crate::{command::EncoderStateError, device::resource::CommandIndices};
use crate::{lock::RwLockWriteGuard, resource::RawResourceAccess};
use crate::id::{BlasId, TlasId};

View File

@ -15,6 +15,7 @@ use crate::command::{
TimestampWritesError,
};
use crate::pipeline::{RenderPipeline, VertexStep};
use crate::resource::RawResourceAccess;
use crate::resource::{InvalidResourceError, ResourceErrorIdent};
use crate::snatch::SnatchGuard;
use crate::{

View File

@ -22,8 +22,8 @@ use crate::{
TextureInitTrackerAction,
},
resource::{
MissingBufferUsageError, MissingTextureUsageError, ParentDevice, Texture,
TextureErrorDimension,
MissingBufferUsageError, MissingTextureUsageError, ParentDevice, RawResourceAccess,
Texture, TextureErrorDimension,
},
snatch::SnatchGuard,
};

View File

@ -207,6 +207,8 @@ impl Global {
offset: BufferAddress,
data: &[u8],
) -> BufferAccessResult {
use crate::resource::RawResourceAccess;
let hub = &self.hub;
let buffer = hub.buffers.get(buffer_id).get()?;

View File

@ -8,7 +8,7 @@ use crate::{
ray_tracing::BlasCompactReadyPendingClosure,
resource::{
Buffer, BufferAccessError, BufferAccessResult, BufferMapOperation, Labeled,
ResourceErrorIdent,
RawResourceAccess, ResourceErrorIdent,
},
snatch::SnatchGuard,
Label, DOWNLEVEL_ERROR_MESSAGE,

View File

@ -14,7 +14,6 @@ use wgt::{
};
use super::{life::LifetimeTracker, Device};
use crate::device::resource::CommandIndices;
#[cfg(feature = "trace")]
use crate::device::trace::Action;
use crate::{
@ -33,8 +32,8 @@ use crate::{
lock::{rank, Mutex, MutexGuard, RwLock, RwLockWriteGuard},
ray_tracing::{BlasCompactReadyPendingClosure, CompactBlasError},
resource::{
AccelerationStructure, Blas, BlasCompactState, Buffer, BufferAccessError, BufferMapState,
DestroyedBuffer, DestroyedResourceError, DestroyedTexture, Fallible, FlushedStagingBuffer,
Blas, BlasCompactState, Buffer, BufferAccessError, BufferMapState, DestroyedBuffer,
DestroyedResourceError, DestroyedTexture, Fallible, FlushedStagingBuffer,
InvalidResourceError, Labeled, ParentDevice, ResourceErrorIdent, StagingBuffer, Texture,
TextureInner, Trackable, TrackingData,
},
@ -44,6 +43,7 @@ use crate::{
track::{self, Tracker, TrackerIndex},
FastHashMap, SubmissionIndex,
};
use crate::{device::resource::CommandIndices, resource::RawResourceAccess};
pub struct Queue {
raw: Box<dyn hal::DynQueue>,

View File

@ -40,7 +40,7 @@ use crate::{
pipeline,
pool::ResourcePool,
resource::{
self, AccelerationStructure, Buffer, Fallible, Labeled, ParentDevice, QuerySet, Sampler,
self, Buffer, Fallible, Labeled, ParentDevice, QuerySet, RawResourceAccess, Sampler,
StagingBuffer, Texture, TextureView, TextureViewNotRenderableReason, Tlas, TrackingData,
},
resource_log,

View File

@ -135,6 +135,29 @@ macro_rules! impl_parent_device {
};
}
/// Allow access to the hal resource as guarded by the `SnatchGuard`.
pub trait RawResourceAccess: ParentDevice {
type DynResource: hal::DynResource + ?Sized;
/// Get access to the raw resource if it is not destroyed.
///
/// Returns `None` if the resource has been destroyed. This method
/// does not allocate in either case.
fn raw<'a>(&'a self, guard: &'a SnatchGuard) -> Option<&'a Self::DynResource>;
/// Get access to the raw resource if it is not destroyed.
///
/// Returns a full error if the resource has been destroyed. This
/// method allocates a label in the error case.
fn try_raw<'a>(
&'a self,
guard: &'a SnatchGuard,
) -> Result<&'a Self::DynResource, DestroyedResourceError> {
self.raw(guard)
.ok_or_else(|| DestroyedResourceError(self.error_ident()))
}
}
pub trait ResourceType {
const TYPE: &'static str;
}
@ -435,21 +458,15 @@ impl Drop for Buffer {
}
}
impl Buffer {
pub(crate) fn raw<'a>(&'a self, guard: &'a SnatchGuard) -> Option<&'a dyn hal::DynBuffer> {
impl RawResourceAccess for Buffer {
type DynResource = dyn hal::DynBuffer;
fn raw<'a>(&'a self, guard: &'a SnatchGuard) -> Option<&'a Self::DynResource> {
self.raw.get(guard).map(|b| b.as_ref())
}
}
pub(crate) fn try_raw<'a>(
&'a self,
guard: &'a SnatchGuard,
) -> Result<&'a dyn hal::DynBuffer, DestroyedResourceError> {
self.raw
.get(guard)
.map(|raw| raw.as_ref())
.ok_or_else(|| DestroyedResourceError(self.error_ident()))
}
impl Buffer {
pub(crate) fn check_destroyed(
&self,
guard: &SnatchGuard,
@ -1182,6 +1199,14 @@ impl Drop for Texture {
}
}
impl RawResourceAccess for Texture {
type DynResource = dyn hal::DynTexture;
fn raw<'a>(&'a self, guard: &'a SnatchGuard) -> Option<&'a Self::DynResource> {
self.inner.get(guard).map(|t| t.raw())
}
}
impl Texture {
pub(crate) fn try_inner<'a>(
&'a self,
@ -1192,23 +1217,6 @@ impl Texture {
.ok_or_else(|| DestroyedResourceError(self.error_ident()))
}
pub(crate) fn raw<'a>(
&'a self,
snatch_guard: &'a SnatchGuard,
) -> Option<&'a dyn hal::DynTexture> {
Some(self.inner.get(snatch_guard)?.raw())
}
pub(crate) fn try_raw<'a>(
&'a self,
guard: &'a SnatchGuard,
) -> Result<&'a dyn hal::DynTexture, DestroyedResourceError> {
self.inner
.get(guard)
.map(|t| t.raw())
.ok_or_else(|| DestroyedResourceError(self.error_ident()))
}
pub(crate) fn check_destroyed(
&self,
guard: &SnatchGuard,
@ -1570,25 +1578,25 @@ impl Drop for TextureView {
}
}
impl TextureView {
pub(crate) fn raw<'a>(
&'a self,
snatch_guard: &'a SnatchGuard,
) -> Option<&'a dyn hal::DynTextureView> {
self.raw.get(snatch_guard).map(|it| it.as_ref())
impl RawResourceAccess for TextureView {
type DynResource = dyn hal::DynTextureView;
fn raw<'a>(&'a self, guard: &'a SnatchGuard) -> Option<&'a Self::DynResource> {
self.raw.get(guard).map(|it| it.as_ref())
}
pub(crate) fn try_raw<'a>(
fn try_raw<'a>(
&'a self,
guard: &'a SnatchGuard,
) -> Result<&'a dyn hal::DynTextureView, DestroyedResourceError> {
) -> Result<&'a Self::DynResource, DestroyedResourceError> {
self.parent.check_destroyed(guard)?;
self.raw
.get(guard)
.map(|it| it.as_ref())
self.raw(guard)
.ok_or_else(|| DestroyedResourceError(self.error_ident()))
}
}
impl TextureView {
/// Checks that the given texture usage contains the required texture usage,
/// returns an error otherwise.
pub(crate) fn check_usage(
@ -1888,13 +1896,6 @@ impl QuerySet {
pub type BlasDescriptor<'a> = wgt::CreateBlasDescriptor<Label<'a>>;
pub type TlasDescriptor<'a> = wgt::CreateTlasDescriptor<Label<'a>>;
pub(crate) trait AccelerationStructure: Trackable {
fn try_raw<'a>(
&'a self,
guard: &'a SnatchGuard,
) -> Result<&'a dyn hal::DynAccelerationStructure, DestroyedResourceError>;
}
pub type BlasPrepareCompactResult = Result<(), BlasPrepareCompactError>;
#[cfg(send_sync)]
@ -1970,15 +1971,11 @@ impl Drop for Blas {
}
}
impl AccelerationStructure for Blas {
fn try_raw<'a>(
&'a self,
guard: &'a SnatchGuard,
) -> Result<&'a dyn hal::DynAccelerationStructure, DestroyedResourceError> {
self.raw
.get(guard)
.map(|raw| raw.as_ref())
.ok_or_else(|| DestroyedResourceError(self.error_ident()))
impl RawResourceAccess for Blas {
type DynResource = dyn hal::DynAccelerationStructure;
fn raw<'a>(&'a self, guard: &'a SnatchGuard) -> Option<&'a Self::DynResource> {
self.raw.get(guard).map(|it| it.as_ref())
}
}
@ -2118,15 +2115,11 @@ impl Drop for Tlas {
}
}
impl AccelerationStructure for Tlas {
fn try_raw<'a>(
&'a self,
guard: &'a SnatchGuard,
) -> Result<&'a dyn hal::DynAccelerationStructure, DestroyedResourceError> {
self.raw
.get(guard)
.map(|raw| raw.as_ref())
.ok_or_else(|| DestroyedResourceError(self.error_ident()))
impl RawResourceAccess for Tlas {
type DynResource = dyn hal::DynAccelerationStructure;
fn raw<'a>(&'a self, guard: &'a SnatchGuard) -> Option<&'a Self::DynResource> {
self.raw.get(guard).map(|raw| raw.as_ref())
}
}

View File

@ -106,7 +106,7 @@ use crate::{
binding_model, command,
lock::{rank, Mutex},
pipeline,
resource::{self, Labeled, ResourceErrorIdent},
resource::{self, Labeled, RawResourceAccess, ResourceErrorIdent},
snatch::SnatchGuard,
track::blas::BlasTracker,
};

View File

@ -20,7 +20,7 @@
use super::{range::RangedStates, PendingTransition, PendingTransitionList};
use crate::{
resource::{Texture, TextureInner, TextureView, Trackable},
resource::{RawResourceAccess, Texture, TextureInner, TextureView, Trackable},
snatch::SnatchGuard,
track::{
invalid_resource_state, skip_barrier, ResourceMetadata, ResourceMetadataProvider,