pub struct Buffer {
pub(crate) raw: Snatchable<Box<dyn DynBuffer>>,
pub(crate) device: Arc<Device>,
pub(crate) usage: BufferUsages,
pub(crate) size: BufferAddress,
pub(crate) initialization_status: RwLock<InitTracker<BufferAddress>>,
pub(crate) label: String,
pub(crate) tracking_data: TrackingData,
pub(crate) map_state: Mutex<BufferMapState>,
pub(crate) bind_groups: Mutex<WeakVec<BindGroup>>,
pub(crate) timestamp_normalization_bind_group: Snatchable<TimestampNormalizationBindGroup>,
pub(crate) indirect_validation_bind_groups: Snatchable<BindGroups>,
}Fields§
§raw: Snatchable<Box<dyn DynBuffer>>§device: Arc<Device>§usage: BufferUsages§size: BufferAddress§initialization_status: RwLock<InitTracker<BufferAddress>>§label: StringThe label from the descriptor used to create the resource.
tracking_data: TrackingData§map_state: Mutex<BufferMapState>§bind_groups: Mutex<WeakVec<BindGroup>>§timestamp_normalization_bind_group: Snatchable<TimestampNormalizationBindGroup>§indirect_validation_bind_groups: Snatchable<BindGroups>Implementations§
Source§impl Buffer
impl Buffer
pub(crate) fn check_destroyed( &self, guard: &SnatchGuard<'_>, ) -> Result<(), DestroyedResourceError>
Sourcepub(crate) fn check_usage(
&self,
expected: BufferUsages,
) -> Result<(), MissingBufferUsageError>
pub(crate) fn check_usage( &self, expected: BufferUsages, ) -> Result<(), MissingBufferUsageError>
Checks that the given buffer usage contains the required buffer usage, returns an error otherwise.
Sourcepub fn resolve_binding_size(
&self,
offset: BufferAddress,
binding_size: Option<BufferSize>,
) -> Result<u64, BindingError>
pub fn resolve_binding_size( &self, offset: BufferAddress, binding_size: Option<BufferSize>, ) -> Result<u64, BindingError>
Resolve the size of a binding for buffer with offset and size.
If size is None, then the remainder of the buffer starting from
offset is used.
If the binding would overflow the buffer, then an error is returned.
Zero-size bindings are permitted here for historical reasons. Although
zero-size bindings are permitted by WebGPU, they are not permitted by
some backends. See Buffer::binding and
#3170.
Sourcepub fn binding<'a>(
&'a self,
offset: BufferAddress,
binding_size: Option<BufferSize>,
snatch_guard: &'a SnatchGuard<'_>,
) -> Result<(BufferBinding<'a, dyn DynBuffer>, u64), BindingError>
pub fn binding<'a>( &'a self, offset: BufferAddress, binding_size: Option<BufferSize>, snatch_guard: &'a SnatchGuard<'_>, ) -> Result<(BufferBinding<'a, dyn DynBuffer>, u64), BindingError>
Create a new hal::BufferBinding for the buffer with offset and
binding_size.
If binding_size is None, then the remainder of the buffer starting
from offset is used.
If the binding would overflow the buffer, then an error is returned.
A zero-size binding at the end of the buffer is permitted here for historical reasons. Although zero-size bindings are permitted by WebGPU, they are not permitted by some backends. The zero-size binding need to be quashed or remapped to a non-zero size, either universally in wgpu-core, or in specific backends that do not support them. See #3170.
Although it seems like it would be simpler and safer to use the resolved
size in the returned hal::BufferBinding, doing this (and removing
redundant logic in backends to resolve the implicit size) was observed
to cause problems in certain CTS tests, so an implicit size
specification is preserved in the output.
Sourcepub fn map_async(
self: &Arc<Self>,
offset: BufferAddress,
size: Option<BufferAddress>,
op: BufferMapOperation,
) -> Result<SubmissionIndex, BufferAccessError>
pub fn map_async( self: &Arc<Self>, offset: BufferAddress, size: Option<BufferAddress>, op: BufferMapOperation, ) -> Result<SubmissionIndex, BufferAccessError>
Schedule buffer mapping.
op.callback is guaranteed to be called, regardless of the outcome.
Sourcefn try_map_async(
self: &Arc<Self>,
offset: BufferAddress,
size: Option<BufferAddress>,
op: BufferMapOperation,
) -> Result<SubmissionIndex, (BufferMapOperation, BufferAccessError)>
fn try_map_async( self: &Arc<Self>, offset: BufferAddress, size: Option<BufferAddress>, op: BufferMapOperation, ) -> Result<SubmissionIndex, (BufferMapOperation, BufferAccessError)>
Try to schedule buffer mapping.
The outcome of this function is one of the following:
- If there is a queue, and nothing pending in the queue that uses the
buffer in question, the buffer is added to
Queue::ready_to_map, and will be mapped the next timeDevice::maintainis called. The queue assumes responsibility for calling the callback, and this function returnsOk(0), but the buffer has not yet been mapped. - If there is a queue, and something is pending in the queue that uses
the buffer in question, the buffer is scheduled for mapping after that
submission completes. The queue assumes responsibility for calling the
callback, and this function returns
Ok(index)with the index of the submission that must complete. The buffer has not yet been mapped. - If there is no queue, the buffer is mapped and the callback is called
immediately. The return value is
Ok(0). - Regardless of the queue state, if there is an error that terminates the buffer mapping attempt, this function returns the callback along with the error, and the caller is responsible for calling the callback.
A return value of Ok(0) means that mapping does not need to wait on the queue, but
it does not mean that the buffer has already been mapped.
pub fn get_mapped_range( self: &Arc<Self>, offset: BufferAddress, size: Option<BufferAddress>, ) -> Result<(NonNull<u8>, u64), BufferAccessError>
Sourcepub(crate) fn map(
&self,
snatch_guard: &SnatchGuard<'_>,
) -> Option<BufferMapPendingClosure>
pub(crate) fn map( &self, snatch_guard: &SnatchGuard<'_>, ) -> Option<BufferMapPendingClosure>
This function returns None only if Self::map_state is not BufferMapState::Waiting.
Other errors are returned within BufferMapPendingClosure.
pub fn unmap(self: &Arc<Self>) -> Result<(), BufferAccessError>
fn unmap_inner( self: &Arc<Self>, ) -> Result<Option<BufferMapPendingClosure>, BufferAccessError>
pub fn destroy(self: &Arc<Self>)
Trait Implementations§
Source§impl Labeled for Buffer
impl Labeled for Buffer
Source§fn label(&self) -> &str
fn label(&self) -> &str
fn error_ident(&self) -> ResourceErrorIdent
Source§impl ParentDevice for Buffer
impl ParentDevice for Buffer
Source§impl RawResourceAccess for Buffer
impl RawResourceAccess for Buffer
type DynResource = dyn DynBuffer
Source§fn raw<'a>(
&'a self,
guard: &'a SnatchGuard<'_>,
) -> Option<&'a Self::DynResource>
fn raw<'a>( &'a self, guard: &'a SnatchGuard<'_>, ) -> Option<&'a Self::DynResource>
Source§fn try_raw<'a>(
&'a self,
guard: &'a SnatchGuard<'_>,
) -> Result<&'a Self::DynResource, DestroyedResourceError>
fn try_raw<'a>( &'a self, guard: &'a SnatchGuard<'_>, ) -> Result<&'a Self::DynResource, DestroyedResourceError>
Source§impl Trackable for Buffer
impl Trackable for Buffer
fn tracker_index(&self) -> TrackerIndex
Auto Trait Implementations§
impl !Freeze for Buffer
impl !RefUnwindSafe for Buffer
impl Send for Buffer
impl Sync for Buffer
impl Unpin for Buffer
impl !UnwindSafe for Buffer
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more