pub struct DataTextureSource<'a, T: Pod + Send + Sync> { /* private fields */ }Expand description
Utility for writing data to a dynamically sized “data textures”.
For WebGL compatibility we sometimes have to use textures instead of buffers.
We call these textures “data textures”.
This construct allows to write data directly to gpu readable memory which
then upon finishing is automatically copied into an appropriately sized
texture which receives all data written to DataTextureSource.
Each texel in the data texture represents a single element of the type T.
This is implemented by dynamically allocating cpu-write-gpu-read buffers from the
central crate::CpuWriteGpuReadBelt and copying all of them to the texture in the end.
Implementations§
Source§impl<'a, T: Pod + Send + Sync> DataTextureSource<'a, T>
impl<'a, T: Pod + Send + Sync> DataTextureSource<'a, T>
Sourcepub fn new(ctx: &'a RenderContext) -> Self
pub fn new(ctx: &'a RenderContext) -> Self
Creates a new DataTextureSource with the given RenderContext.
This operation itself will not allocate any memory, empty DataTextureSource are not a concern.
Sourcepub fn capacity(&self) -> usize
pub fn capacity(&self) -> usize
The number of elements that can be written without allocating more memory.
Sourcepub fn remaining_capacity(&self) -> usize
pub fn remaining_capacity(&self) -> usize
The number of elements that can be written without allocating more memory.
Sourcepub fn reserve(
&mut self,
num_elements: usize,
) -> Result<usize, CpuWriteGpuReadError>
pub fn reserve( &mut self, num_elements: usize, ) -> Result<usize, CpuWriteGpuReadError>
Ensures that there’s space internally for at least num_elements more elements.
Returns the number of elements that are currently reserved. This value is smaller than the requested number of elements if the maximum number of elements that can be stored is reached.
Creating new buffers is a relatively expensive operation, so it’s best to reserve gratuitously and often. Ideally, you know exactly how many elements you’re going to write and reserve accordingly at the start.
If there’s no more space, a new buffer is allocated such that:
- have a total capacity for at least as many elements as requested, clamping total size to the maximum.
- be at least double the size of the last buffer
- keep it easy to copy to textures by always being a multiple of the maximum row size we use for data textures
- this massively simplifies the buffer->texture copy logic!
Sourcepub fn extend_from_slice(
&mut self,
elements: &[T],
) -> Result<(), DataTextureSourceWriteError>
pub fn extend_from_slice( &mut self, elements: &[T], ) -> Result<(), DataTextureSourceWriteError>
Pushes a slice of elements into the data texture.
Sourcepub fn extend_from_slice_clamped(
&mut self,
slice: &[T],
default: T,
len: usize,
) -> Result<(), DataTextureSourceWriteError>
pub fn extend_from_slice_clamped( &mut self, slice: &[T], default: T, len: usize, ) -> Result<(), DataTextureSourceWriteError>
Append len elements, using slice as source,
clamping to the last value (or default) if slice is too short.
Sourcepub fn add_n(
&mut self,
element: T,
num_elements: usize,
) -> Result<(), DataTextureSourceWriteError>
pub fn add_n( &mut self, element: T, num_elements: usize, ) -> Result<(), DataTextureSourceWriteError>
Fills the data texture with n instances of an element.
pub fn push(&mut self, element: T) -> Result<(), DataTextureSourceWriteError>
Sourcepub fn finish(
self,
texture_format: TextureFormat,
texture_label: impl Into<Label>,
) -> Result<GpuTexture, CpuWriteGpuReadError>
pub fn finish( self, texture_format: TextureFormat, texture_label: impl Into<Label>, ) -> Result<GpuTexture, CpuWriteGpuReadError>
Schedules copies of all previous writes to this DataTextureSource to a GpuTexture.
The format has to be uncompressed, not a depth/stencil format and have the exact same block size of the size of type T.
The resulting GpuTexture is ready to be bound as a data texture in a shader.
Auto Trait Implementations§
impl<'a, T> !RefUnwindSafe for DataTextureSource<'a, T>
impl<'a, T> !UnwindSafe for DataTextureSource<'a, T>
impl<'a, T> Freeze for DataTextureSource<'a, T>
impl<'a, T> Send for DataTextureSource<'a, T>
impl<'a, T> Sync for DataTextureSource<'a, T>
impl<'a, T> Unpin for DataTextureSource<'a, T>
impl<'a, T> UnsafeUnpin for DataTextureSource<'a, T>
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
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