Skip to main content

ReadbackRing

Struct ReadbackRing 

Source
pub struct ReadbackRing { /* private fields */ }
Expand description

Async readback ring buffer with GPU-resident staging buffers.

Implementations§

Source§

impl ReadbackRing

Source

pub fn new( device: &Device, size: usize, buffer_size: u64, ) -> Result<Self, BackendError>

Construct a ring with N staging buffers.

Source

pub fn record_copy( &self, device: &Device, encoder: &mut CommandEncoder, src_buffer: &Buffer, src_offset: u64, byte_len: u64, ) -> Result<ReadbackTicket, BackendError>

Record a readback copy into the next available ring slot.

The caller must submit the encoder and then arm the returned ticket with Self::arm_ticket. This path lets the main dispatch encoder copy into preallocated ring slots instead of allocating a fresh staging buffer per output.

§Errors

Returns BackendError if the byte range cannot be represented, the ring slot is not reusable (an uncollected SLOT_READY/SLOT_ERROR slot or a still-pending slot after a device poll), or the requested readback exceeds slot capacity.

Source

pub fn arm_ticket( &self, ticket: &ReadbackTicket, ) -> Result<(Receiver<MapResult>, Arc<AtomicBool>), BackendError>

Arm a submitted ticket by registering its map_async callback.

§Errors

Returns BackendError when ticket does not reference a live slot.

Source

pub fn with_mapped_ticket<R>( &self, ticket: &ReadbackTicket, visitor: impl FnOnce(&[u8]) -> Result<R, BackendError>, ) -> Result<R, BackendError>

Expose a ready ticket’s mapped bytes to visitor, then free the slot.

§Errors

Returns BackendError when the ticket is stale, the slot is not ready, or mapped length metadata is inconsistent.

Source

pub fn submit_readback( &self, device: &Device, queue: &Queue, src_buffer: &Buffer, src_offset: u64, byte_len: u64, ) -> Result<usize, BackendError>

Submit a copy from src_buffer at src_offset and mark the slot pending.

src_offset is the byte offset within src_buffer to copy from. Pass 0 to read from the start of the buffer. This mirrors the src_offset parameter accepted by record_copy; callers that need a sub-range of the source buffer must supply a non-zero offset here rather than wrapping a slice (the wgpu copy API requires aligned buffer offsets).

§Errors

Returns BackendError if encoder or queue submission fails.

Source

pub fn collect_slot( &self, device: &Device, idx: usize, ) -> Result<Option<Vec<u8>>, BackendError>

Try to collect data from a specific slot.

§Errors

Returns BackendError when idx is out of bounds or map_async failed for the slot.

Source

pub fn collect_slot_into( &self, device: &Device, idx: usize, out: &mut Vec<u8>, ) -> Result<Option<usize>, BackendError>

Try to collect data from a specific slot into a caller-owned buffer.

Reusing out avoids an allocation on every ready readback. The buffer is cleared before bytes are appended.

§Errors

Returns BackendError when idx is out of bounds or map_async failed for the slot.

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> 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<T> Downcast<T> for T

Source§

fn downcast(&self) -> &T

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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> Same for T

Source§

type Output = T

Should always be Self
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> Upcast<T> for T

Source§

fn upcast(&self) -> Option<&T>

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