pub struct Compositor { /* private fields */ }Expand description
Fundamentally, the compositor works on a massive set of pre-allocated vertices that it assembles into quads in the vertex shader, which then moves them into position and assigns them UV coordinates. Then the pixel shader checks if it must do per-pixel clipping and discards the pixel if it’s out of bounds, then samples a texture from the provided texture bank, does color modulation if applicable, then draws the final pixel to the screen using pre-multiplied alpha blending. This allows the compositor to avoid allocating a vertex buffer, instead using a SSBO (or webgpu storage buffer) to store the per-quad data, which it then accesses from the built-in vertex index.
The compositor can accept GPU generated instructions written directly into it’s buffer using a compute shader, if desired.
The compositor can also accept custom draw calls that break up the batched compositor instructions, which is intended for situations where rendering to the texture atlas is either impractical, or a different blending operation is required (such as subpixel blended text, which requires the SRC1 dual-source blending mode, instead of standard pre-multiplied alpha).
Implementations§
Source§impl Compositor
impl Compositor
pub fn new( device: &Device, shared: &Shared, atlasview: &Arc<TextureView>, layerview: &Arc<TextureView>, format: TextureFormat, layer: bool, ) -> Self
pub fn prepare( &mut self, driver: &Driver, _: &mut CommandEncoder, surface_dim: PxDim, )
pub fn draw( &mut self, driver: &Driver, pass: &mut RenderPass<'_>, index: u8, slice: u8, )
pub fn cleanup(&mut self)
Trait Implementations§
Auto Trait Implementations§
impl Freeze for Compositor
impl !RefUnwindSafe for Compositor
impl Send for Compositor
impl Sync for Compositor
impl Unpin for Compositor
impl !UnwindSafe for Compositor
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
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
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