pub struct Buffer { /* private fields */ }
Implementations§
Methods from Deref<Target = Buffer>§
Sourcepub fn as_entire_binding(&self) -> BindingResource<'_>
pub fn as_entire_binding(&self) -> BindingResource<'_>
Return the binding view of the entire buffer.
Sourcepub fn as_entire_buffer_binding(&self) -> BufferBinding<'_>
pub fn as_entire_buffer_binding(&self) -> BufferBinding<'_>
Return the binding view of the entire buffer.
Sourcepub unsafe fn as_hal<A>(
&self,
) -> Option<impl Deref<Target = <A as Api>::Buffer> + WasmNotSendSync>where
A: HalApi,
pub unsafe fn as_hal<A>(
&self,
) -> Option<impl Deref<Target = <A as Api>::Buffer> + WasmNotSendSync>where
A: HalApi,
Get the wgpu_hal
buffer from this Buffer
.
Find the Api struct corresponding to the active backend in wgpu_hal::api
,
and pass that struct to the to the A
type parameter.
Returns a guard that dereferences to the type of the hal backend
which implements A::Buffer
.
§Deadlocks
- The returned guard holds a read-lock on a device-local “destruction”
lock, which will cause all calls to
destroy
to block until the guard is released.
§Errors
This method will return None if:
- The buffer is not from the backend specified by
A
. - The buffer is from the
webgpu
orcustom
backend. - The buffer has had
Self::destroy()
called on it.
§Safety
- The returned resource must not be destroyed unless the guard is the last reference to it and it is not in use by the GPU. The guard and handle may be dropped at any time however.
- All the safety requirements of wgpu-hal must be upheld.
Sourcepub fn slice<S>(&self, bounds: S) -> BufferSlice<'_>where
S: RangeBounds<u64>,
pub fn slice<S>(&self, bounds: S) -> BufferSlice<'_>where
S: RangeBounds<u64>,
Returns a BufferSlice
referring to the portion of self
’s contents
indicated by bounds
. Regardless of what sort of data self
stores,
bounds
start and end are given in bytes.
A BufferSlice
can be used to supply vertex and index data, or to map
buffer contents for access from the CPU. See the BufferSlice
documentation for details.
The range
argument can be half or fully unbounded: for example,
buffer.slice(..)
refers to the entire buffer, and buffer.slice(n..)
refers to the portion starting at the n
th byte and extending to the
end of the buffer.
§Panics
- If
bounds
is outside of the bounds ofself
. - If
bounds
has a length less than 1.
Sourcepub fn unmap(&self)
pub fn unmap(&self)
Unmaps the buffer from host memory.
This terminates the effect of all previous map_async()
operations and
makes the buffer available for use by the GPU again.
Sourcepub fn size(&self) -> u64
pub fn size(&self) -> u64
Returns the length of the buffer allocation in bytes.
This is always equal to the size
that was specified when creating the buffer.
Sourcepub fn usage(&self) -> BufferUsages
pub fn usage(&self) -> BufferUsages
Returns the allowed usages for this Buffer
.
This is always equal to the usage
that was specified when creating the buffer.
Sourcepub fn map_async<S>(
&self,
mode: MapMode,
bounds: S,
callback: impl FnOnce(Result<(), BufferAsyncError>) + WasmNotSend + 'static,
)where
S: RangeBounds<u64>,
pub fn map_async<S>(
&self,
mode: MapMode,
bounds: S,
callback: impl FnOnce(Result<(), BufferAsyncError>) + WasmNotSend + 'static,
)where
S: RangeBounds<u64>,
Map the buffer to host (CPU) memory, making it available for reading or writing
via get_mapped_range()
.
It is available once the callback
is called with an Ok
response.
For the callback to complete, either queue.submit(..)
, instance.poll_all(..)
, or device.poll(..)
must be called elsewhere in the runtime, possibly integrated into an event loop or run on a separate thread.
The callback will be called on the thread that first calls the above functions after the GPU work has completed. There are no restrictions on the code you can run in the callback, however on native the call to the function will not complete until the callback returns, so prefer keeping callbacks short and used to set flags, send messages, etc.
As long as a buffer is mapped, it is not available for use by any other commands; at all times, either the GPU or the CPU has exclusive access to the contents of the buffer.
This can also be performed using BufferSlice::map_async()
.
§Panics
- If the buffer is already mapped.
- If the buffer’s
BufferUsages
do not allow the requestedMapMode
. - If
bounds
is outside of the bounds ofself
. - If
bounds
has a length less than 1. - If the start and end of
bounds
are not be aligned toMAP_ALIGNMENT
.
Sourcepub fn get_mapped_range<S>(&self, bounds: S) -> BufferView<'_>where
S: RangeBounds<u64>,
pub fn get_mapped_range<S>(&self, bounds: S) -> BufferView<'_>where
S: RangeBounds<u64>,
Gain read-only access to the bytes of a mapped Buffer
.
Returns a BufferView
referring to the buffer range represented by
self
. See the documentation for BufferView
for details.
bounds
may be less than the bounds passed to Self::map_async()
,
and multiple views may be obtained and used simultaneously as long as they do not overlap.
This can also be performed using BufferSlice::get_mapped_range()
.
§Panics
- If
bounds
is outside of the bounds ofself
. - If
bounds
has a length less than 1. - If the start and end of
bounds
are not aligned toMAP_ALIGNMENT
. - If the buffer to which
self
refers is not currently mapped. - If you try to create overlapping views of a buffer, mutable or otherwise.
Sourcepub fn get_mapped_range_mut<S>(&self, bounds: S) -> BufferViewMut<'_>where
S: RangeBounds<u64>,
pub fn get_mapped_range_mut<S>(&self, bounds: S) -> BufferViewMut<'_>where
S: RangeBounds<u64>,
Gain write access to the bytes of a mapped Buffer
.
Returns a BufferViewMut
referring to the buffer range represented by
self
. See the documentation for BufferViewMut
for more details.
bounds
may be less than the bounds passed to Self::map_async()
,
and multiple views may be obtained and used simultaneously as long as they do not overlap.
This can also be performed using BufferSlice::get_mapped_range_mut()
.
§Panics
- If
bounds
is outside of the bounds ofself
. - If
bounds
has a length less than 1. - If the start and end of
bounds
are not aligned toMAP_ALIGNMENT
. - If the buffer to which
self
refers is not currently mapped. - If you try to create overlapping views of a buffer, mutable or otherwise.
Trait Implementations§
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, U> AsBindGroupShaderType<U> for T
impl<T, U> AsBindGroupShaderType<U> for T
Source§fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
T
ShaderType
for self
. When used in AsBindGroup
derives, it is safe to assume that all images in self
exist.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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
, which can then be
downcast
into Box<dyn ConcreteType>
where ConcreteType
implements Trait
.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
, which can then be further
downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
Source§impl<T> Identity for Twhere
T: ?Sized,
impl<T> Identity for Twhere
T: ?Sized,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
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