pub struct BufferVec<T>where
T: ShaderType + WriteInto,{ /* private fields */ }Expand description
Like RawBufferVec, but doesn’t require that the data type T be
NoUninit.
This is a high-performance data structure that you should use whenever
possible if your data is more complex than is suitable for RawBufferVec.
The ShaderType trait from the encase library is used to ensure that
the data is correctly aligned for use by the GPU.
For performance reasons, unlike RawBufferVec, this type doesn’t allow
CPU access to the data after it’s been added via BufferVec::push. If you
need CPU access to the data, consider another type, such as
StorageBuffer.
Other options for storing GPU-accessible data are:
Implementations§
Source§impl<T> BufferVec<T>where
T: ShaderType + WriteInto,
impl<T> BufferVec<T>where
T: ShaderType + WriteInto,
Sourcepub const fn new(buffer_usage: BufferUsages) -> Self
pub const fn new(buffer_usage: BufferUsages) -> Self
Creates a new BufferVec with the given BufferUsages.
Sourcepub fn buffer(&self) -> Option<&Buffer>
pub fn buffer(&self) -> Option<&Buffer>
Returns a handle to the buffer, if the data has been uploaded.
Sourcepub fn binding(&self) -> Option<BindingResource<'_>>
pub fn binding(&self) -> Option<BindingResource<'_>>
Returns the binding for the buffer if the data has been uploaded.
Sourcepub fn capacity(&self) -> usize
pub fn capacity(&self) -> usize
Returns the amount of space that the GPU will use before reallocating.
Sourcepub fn set_label(&mut self, label: Option<&str>)
pub fn set_label(&mut self, label: Option<&str>)
Changes the debugging label of the buffer.
The next time the buffer is updated (via Self::reserve), Bevy will inform
the driver of the new label.
Sourcepub fn reserve(&mut self, capacity: usize, device: &RenderDevice)
pub fn reserve(&mut self, capacity: usize, device: &RenderDevice)
Creates a Buffer on the RenderDevice with size
at least size_of::<T>() * capacity, unless such a buffer already exists.
If a Buffer exists, but is too small, references to it will be discarded,
and a new Buffer will be created. Any previously created Buffers
that are no longer referenced will be deleted by the RenderDevice
once it is done using them (typically 1-2 frames).
In addition to any BufferUsages provided when
the BufferVec was created, the buffer on the RenderDevice
is marked as BufferUsages::COPY_DST.
Sourcepub fn write_buffer(&mut self, device: &RenderDevice, queue: &RenderQueue)
pub fn write_buffer(&mut self, device: &RenderDevice, queue: &RenderQueue)
Queues writing of data from system RAM to VRAM using the RenderDevice
and the provided RenderQueue.
Before queuing the write, a reserve operation is
executed.
Sourcepub fn write_buffer_range(
&mut self,
render_queue: &RenderQueue,
range: Range<usize>,
) -> Result<(), WriteBufferRangeError>
pub fn write_buffer_range( &mut self, render_queue: &RenderQueue, range: Range<usize>, ) -> Result<(), WriteBufferRangeError>
Queues writing of data from system RAM to VRAM using the RenderDevice
and the provided RenderQueue.
If the buffer is not initialized on the GPU or the range is bigger than the capacity it will return an error. You’ll need to either reserve a new buffer which will lose data on the GPU or create a new buffer and copy the old data to it.
This will only write the data contained in the given range. It is useful if you only want to update a part of the buffer.
Auto Trait Implementations§
impl<T> Freeze for BufferVec<T>
impl<T> !RefUnwindSafe for BufferVec<T>
impl<T> Send for BufferVec<T>where
T: Send,
impl<T> Sync for BufferVec<T>where
T: Sync,
impl<T> Unpin for BufferVec<T>where
T: Unpin,
impl<T> !UnwindSafe for BufferVec<T>
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> 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> 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