pub struct DeferredPresent { /* private fields */ }Expand description
A frame that has been rendered and queue-submitted but not yet
presented — the deferred half of SurfaceRenderer::submit_deferred.
Opaque by design: it wraps a wgpu::SurfaceTexture (and the
wgpu::Queue that presents it) behind private fields with no accessor,
exactly like DetachedSurface, so no wgpu type
is nameable outside this crate (docs/CODE_STANDARDS.md’s wgpu-leak
anti-pattern). It is Send — a wgpu::SurfaceTexture owns its swapchain
frame and borrows nothing, and a wgpu::Queue is a cheap Send + Sync
handle — which is the whole point: a shell can hand it from the render
thread to the thread that must issue the present.
Why deferring the present is a contract, not a micro-optimisation. On
iOS, a CAMetalLayer with presentsWithTransaction = true requires
[drawable present] to run on the thread committing the CATransaction
that carries the sibling views’ geometry. wgpu-hal’s Metal present already
implements exactly that shape when the layer has the flag set (submit a
present command buffer, waitUntilScheduled, then drawable.present()) —
it simply runs it on whichever thread calls Self::present. Under the
render-thread split that thread commits no transaction, so the drawable is
never handed to the compositor at all (measured: total loss of presentation).
Handing this value to the UI thread and
presenting there is what lets frust’s surface land in the same transaction
as the platform-view geometry while the split stays on.
Dropping one without presenting is safe and deliberate: the drawable returns to the layer’s pool un-presented and that frame is simply skipped — the depth-1 latest-wins discipline (a newer frame supersedes an un-presented older one rather than blocking on it).
Implementations§
Source§impl DeferredPresent
impl DeferredPresent
Sourcepub fn present(self)
pub fn present(self)
Present the deferred frame on the calling thread.
Consumes the handle, so a frame can never be presented twice. With
presentsWithTransaction set on the target CAMetalLayer this is the
call that must run on the transaction-committing (UI) thread; on every
other platform/configuration it is an ordinary present that happens to
have been moved off the submit site.