pub struct StagingBelt { /* private fields */ }
Expand description
Staging belt is a machine that uploads data.
Internally it uses a ring-buffer of staging buffers that are sub-allocated.
It has an advantage over Queue.write_buffer
in a way that it returns a mutable slice,
which you can fill to avoid an extra data copy.
Implementations§
Source§impl StagingBelt
impl StagingBelt
Sourcepub fn new(chunk_size: BufferAddress, device: &Device) -> Self
pub fn new(chunk_size: BufferAddress, device: &Device) -> Self
Create a new staging belt.
The chunk_size
is the unit of internal buffer allocation.
It’s better when it’s big, but ideally still 1-4 times less than
the total amount of data uploaded per submission.
Sourcepub fn write_buffer(
&mut self,
target: &Buffer,
offset: BufferAddress,
size: BufferSize,
device: &Device,
) -> BufferViewMut<'_>
pub fn write_buffer( &mut self, target: &Buffer, offset: BufferAddress, size: BufferSize, device: &Device, ) -> BufferViewMut<'_>
Allocate the staging belt slice of size
to be uploaded into the target
buffer
at the specified offset.
The upload will only really be scheduled at the next StagingBelt::flush
call.
Sourcepub fn flush(&mut self, device: &Device) -> CommandBuffer
pub fn flush(&mut self, device: &Device) -> CommandBuffer
Produce a command buffer with all the accumulated transfers.
At this point, all the partially used staging buffers are closed until the GPU is done copying the data from them.