pub struct RawBufferVec<T: NoUninit> { /* private fields */ }Expand description
A structure for storing raw bytes that have already been properly formatted for use by the GPU.
“Properly formatted” means that item data already meets the alignment and padding
requirements for how it will be used on the GPU. The item type must implement NoUninit
for its data representation to be directly copyable.
Index, vertex, and instance-rate vertex buffers have no alignment nor padding requirements and so this helper type is a good choice for them.
The contained data is stored in system RAM. Calling reserve
allocates VRAM from the RenderDevice.
write_buffer queues copying of the data
from system RAM to VRAM.
Other options for storing GPU-accessible data are:
Implementations§
Source§impl<T: NoUninit> RawBufferVec<T>
impl<T: NoUninit> RawBufferVec<T>
Sourcepub const fn new(buffer_usage: BufferUsages) -> Self
pub const fn new(buffer_usage: BufferUsages) -> Self
Creates a new RawBufferVec 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.
pub fn append(&mut self, other: &mut RawBufferVec<T>)
Sourcepub fn set(&mut self, index: u32, value: T)
pub fn set(&mut self, index: u32, value: T)
Sets the value at the given index.
The index must be less than RawBufferVec::len.
Sourcepub fn reserve_internal(&mut self, count: usize)
pub fn reserve_internal(&mut self, count: usize)
Preallocates space for count elements in the internal CPU-side buffer.
Unlike RawBufferVec::reserve, this doesn’t have any effect on the GPU buffer.
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 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 a 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 RawBufferVec 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.
pub fn values(&self) -> &Vec<T>
pub fn values_mut(&mut self) -> &mut Vec<T>
Trait Implementations§
Source§impl<T: NoUninit> Extend<T> for RawBufferVec<T>
impl<T: NoUninit> Extend<T> for RawBufferVec<T>
Source§fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I)
fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I)
Source§fn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
extend_one)Source§fn extend_reserve(&mut self, additional: usize)
fn extend_reserve(&mut self, additional: usize)
extend_one)Auto Trait Implementations§
impl<T> Freeze for RawBufferVec<T>
impl<T> !RefUnwindSafe for RawBufferVec<T>
impl<T> Send for RawBufferVec<T>where
T: Send,
impl<T> Sync for RawBufferVec<T>where
T: Sync,
impl<T> Unpin for RawBufferVec<T>where
T: Unpin,
impl<T> !UnwindSafe for RawBufferVec<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, 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