Skip to main content

AtomicSparseBufferVec

Struct AtomicSparseBufferVec 

Source
pub struct AtomicSparseBufferVec<T>
where T: AtomicPod,
{ /* private fields */ }
Expand description

A GPU buffer that can grow, can be updated atomically from multiple threads on the CPU, and is sparsely updated on the GPU if only a small number of elements have changed.

This type is similar to crate::render_resource::buffer_vec::AtomicRawBufferVec, but instead of reuploading the entire buffer to the GPU when it’s changed, it tracks changes on a per-element level and uploads only the elements that changed if the number of such elements is small. It uses a compute shader to scatter those changed elements.

As the stored data is AtomicPod, multiple threads may update the buffer simultaneously. Note that, like crate::render_resource::buffer_vec::AtomicRawBufferVec, only existing elements may be updated from multiple threads; new data still requires exclusive access.

T must have a size that’s a multiple of 4.

Implementations§

Source§

impl<T> AtomicSparseBufferVec<T>
where T: AtomicPod,

Source

pub fn new( buffer_usages: BufferUsages, label: Arc<str>, ) -> AtomicSparseBufferVec<T>

Creates a new AtomicSparseBufferVec with the given set of buffer usages and label.

buffer_usages specifies the set of allowed wgpu buffer usages for the buffer that AtomicSparseBufferVec manages. BufferUsages::COPY_DST is automatically added to this set.

Source

pub fn len(&self) -> u32

Returns the number of elements in the CPU side copy of the buffer.

Source

pub fn is_empty(&self) -> bool

Returns true if there are no elements in the CPU side copy of the buffer.

Source

pub fn buffer(&self) -> Option<&Buffer>

Returns a handle to the buffer, if the data has been uploaded.

Source

pub fn clear(&mut self)

Removes all elements from the buffer.

Source

pub fn get(&self, index: u32) -> T

Copies a value out of the buffer.

Source

pub fn set(&self, index: u32, value: T)

Sets the value at the given index.

If the index isn’t in range of the buffer, this method panics.

Internally, the value is converted to its blob representation.

Note that this method is thread-safe and doesn’t require &mut self. It’s your responsibility, however, to ensure synchronization; though this method is memory-safe, it’s possible for other threads to observe partially-overwritten values if Self::get or similar methods are called while the write operation is occurring.

Source

pub fn push(&mut self, value: T) -> u32

Adds a new value and returns its index.

Source

pub fn reserve(&mut self, new_capacity: usize, render_device: &RenderDevice)

Ensures that the backing buffer for this buffer vector is present and appropriately sized on the GPU.

Source

pub fn grow(&mut self, new_len: u32)

Grows the buffer by adding default values so that it’s at least the given size.

This method sets all the newly-added values to dirty.

If the buffer is already large enough, this method does nothing.

Source

pub fn write_buffers( &mut self, render_device: &RenderDevice, render_queue: &RenderQueue, )

Writes the data to the GPU, either via a sparse upload or a bulk data upload.

Source

pub fn prepare_to_populate_buffers( &mut self, render_device: &RenderDevice, pipeline_cache: &PipelineCache, sparse_buffer_update_jobs: &mut SparseBufferUpdateJobs, sparse_buffer_update_bind_groups: &mut SparseBufferUpdateBindGroups, sparse_buffer_update_pipelines: &SparseBufferUpdatePipelines, )

If a sparse update has been scheduled, prepares all GPU resources necessary to perform a sparse buffer update, other than updating the metadata uniform.

Source§

impl<T> AtomicSparseBufferVec<T>
where T: AtomicPod + PartialEq,

Source

pub fn grow_and_set(&mut self, index: u32, value: T)

Sets the value at the given index, growing the buffer if the index isn’t in range.

If the buffer already holds value there, this does nothing, leaving the element’s dirty bit clear so that a sparse update skips it.

Requires &mut self because growing reallocates.

Use Self::set_if_changed when the index is known to be in range and only a shared reference is available.

Source

pub fn set_if_changed(&self, index: u32, value: T)

Sets the value at an index that’s already in range, without growing the buffer.

If the buffer already holds value there, this does nothing, leaving the element’s dirty bit clear so that a sparse update skips it.

Like Self::set, this is thread-safe, doesn’t require &mut self, and panics if the index isn’t in range.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T, U> AsBindGroupShaderType<U> for T
where U: ShaderType, &'a T: for<'a> Into<U>,

Source§

fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U

Return the T ShaderType for self. When used in AsBindGroup derives, it is safe to assume that all images in self exist.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> ConditionalSend for T
where T: Send,

Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts 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>

Converts 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)

Converts &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)

Converts &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
where T: Any + Send,

Source§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_sync(self: Box<T>) -> Box<dyn Any + Send + Sync>

Converts Box<Trait> (where Trait: DowncastSync) to Box<dyn Any + Send + Sync>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync> ⓘ

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, W> HasTypeWitness<W> for T
where W: MakeTypeWitness<Arg = T>, T: ?Sized,

Source§

const WITNESS: W = W::MAKE

A constant of the type witness
Source§

impl<T> Identity for T
where T: ?Sized,

Source§

const TYPE_EQ: TypeEq<T, <T as Identity>::Type> = TypeEq::NEW

Proof that Self is the same type as Self::Type, provides methods for casting between Self and Self::Type.
Source§

type Type = T

The same type as Self, used to emulate type equality bounds (T == U) with associated type equality constraints (T: Identity<Type = U>).
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> IntoResult<T> for T

Source§

fn into_result(self) -> Result<T, RunSystemError>

Converts this type into the system output type.
Source§

impl<A> Is for A
where A: Any,

Source§

fn is<T>() -> bool
where T: Any,

Checks if the current type “is” another type, using a TypeId equality comparison. This is most useful in the context of generic logic. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Settings for T
where T: 'static + Send + Sync,

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WasmNotSend for T
where T: Send,

Source§

impl<T> WasmNotSendSync for T

Source§

impl<T> WasmNotSync for T
where T: Sync,

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more