Skip to main content

DoubleBufferedSubmitter

Struct DoubleBufferedSubmitter 

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

Double-buffered GPU command submission.

Maintains two independent CommandBuffer slots (A and B). While the GPU executes the commands in slot B, the CPU records new work into slot A, and vice-versa. This overlaps CPU recording with GPU execution to maximise throughput.

§Typical cycle (one frame)

1. begin_record(recording_slot)   → SlotState::Recording
2. … record commands …
3. finish_record(recording_slot)  → SlotState::ReadyToSubmit
4. submit(recording_slot)         → SlotState::Inflight
5. mark_retired(other_slot)       → SlotState::Retired (after GPU fence)
6. reset(retired_slot)            → SlotState::Idle

Implementations§

Source§

impl DoubleBufferedSubmitter

Source

pub fn new() -> Self

Create a new double-buffered submitter with both slots idle.

Source

pub fn state(&self, slot: BufferSlot) -> SlotState

Current state of slot.

Source

pub fn active_slot(&self) -> BufferSlot

The slot the CPU is currently (or will next) record into.

Source

pub fn frame_count(&self) -> u64

Total number of complete double-buffer cycles (frames) submitted.

Source

pub fn begin_record(&mut self, slot: BufferSlot) -> bool

Begin recording commands into slot.

Returns false if slot is not currently Idle.

Source

pub fn record(&mut self, slot: BufferSlot, entry: CommandEntry) -> bool

Record a command entry into the active recording slot.

Returns false if slot is not in Recording state.

Source

pub fn finish_record(&mut self, slot: BufferSlot) -> bool

Finish recording for slot.

Returns false if slot is not in Recording state.

Source

pub fn submit(&mut self, slot: BufferSlot) -> Option<Vec<CommandEntry>>

Submit the commands in slot to the (simulated) GPU queue.

Returns the submitted commands on success, or None if slot is not ReadyToSubmit.

Source

pub fn mark_retired(&mut self, slot: BufferSlot) -> bool

Mark slot as retired (GPU execution complete).

Returns false if slot is not Inflight.

Source

pub fn reset_slot(&mut self, slot: BufferSlot) -> bool

Reset slot to Idle so it can be recorded into again.

Returns false if slot is not Retired.

Source

pub fn command_count(&self, slot: BufferSlot) -> usize

Number of commands recorded in slot.

Trait Implementations§

Source§

impl Default for DoubleBufferedSubmitter

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

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

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

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

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