Skip to main content

Renderer

Struct Renderer 

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

The main renderer responsible for GPU rendering operations.

The renderer manages the complete rendering pipeline including:

  • GPU context (device, queue, surface)
  • Resource management (buffers, textures, bind groups)
  • Pipeline caching (shader compilation, PSO creation)
  • Frame rendering (scene extraction, command submission)

§Lifecycle

  1. Create with Renderer::new (no GPU resources allocated)
  2. Initialize GPU with Renderer::init
  3. Render frames with Renderer::begin_frame
  4. Clean up with Renderer::maybe_prune

Implementations§

Source§

impl Renderer

Source

pub fn new( init_config: RendererInitConfig, settings: RendererSettings, ) -> Renderer

Phase 1: Create configuration (no GPU resources yet).

This only stores the render settings. GPU resources are allocated when init is called.

§Arguments
  • init_config - Static GPU/device configuration (consumed at init time)
  • settings - Runtime rendering settings (can be changed later via update_settings)
Source

pub fn size(&self) -> (u32, u32)

Returns the current surface size in pixels as (width, height).

Source

pub async fn init<W>( &mut self, window: W, width: u32, height: u32, ) -> Result<(), Error>
where W: HasWindowHandle + HasDisplayHandle + Send + Sync + 'static,

Phase 2: Initialize GPU context with window handle.

This method:

  1. Creates the wgpu instance and adapter
  2. Requests a device with required features/limits
  3. Configures the surface for presentation
  4. Initializes resource manager and pipeline cache
Source

pub async fn init_headless( &mut self, width: u32, height: u32, format: Option<PixelFormat>, ) -> Result<(), Error>

Phase 2 (headless): Initialize GPU context without a window.

Creates an offscreen render target of the specified dimensions. No window surface is created, making this suitable for server-side rendering, automated testing, and GPU readback workflows.

§Arguments
  • width — Render target width in pixels.
  • height — Render target height in pixels.
  • format — Desired pixel format. Pass None for the default Rgba8Unorm (sRGB). Use Some(Rgba16Float) for HDR readback.
Source

pub fn resize(&mut self, width: u32, height: u32)

Source

pub fn begin_frame<'a>( &'a mut self, scene: &'a mut Scene, camera: &'a RenderCamera, assets: &'a AssetServer, frame_time: FrameTime, ) -> Option<FrameComposer<'a>>

Begins building a new frame for rendering.

Returns a FrameComposer that provides a chainable API for configuring the render pipeline via custom pass hooks.

§Usage
// Method 1: Use default built-in passes
if let Some(composer) = renderer.begin_frame(scene, camera, assets, time) {
    composer.render();
}

// Method 2: With custom hooks (e.g., UI overlay)
if let Some(composer) = renderer.begin_frame(scene, camera, assets, time) {
    composer
        .add_custom_pass(HookStage::AfterPostProcess, |graph, bb| {
            ui_pass.target_tex = bb.surface_out;
            graph.add_pass(&mut ui_pass);
        })
        .render();
}
§Returns

Returns Some(FrameComposer) if frame preparation succeeds, or None if rendering should be skipped (e.g., window size is 0).

Source

pub fn maybe_prune(&mut self)

Performs periodic resource cleanup.

Should be called after each frame to release unused GPU resources. Uses internal heuristics to avoid expensive cleanup every frame.

Source

pub fn render_path(&self) -> &RenderPath

Returns the current RenderPath.

Source

pub fn settings(&self) -> &RendererSettings

Returns a reference to the current runtime renderer settings.

Source

pub fn init_config(&self) -> &RendererInitConfig

Returns a reference to the init-time configuration.

Source

pub fn update_settings(&mut self, new_settings: RendererSettings)

Applies new runtime settings, performing an internal diff to update only the parts that actually changed.

This is the single entry point for all runtime configuration changes. Callers (UI panels, scripting layers, etc.) should maintain their own RendererSettings instance, mutate it, and pass it here.

Source

pub fn set_render_path(&mut self, path: RenderPath)

Switches the active render path at runtime.

Convenience wrapper around update_settings for changing only the render path.

Source

pub fn device(&self) -> Option<&Device>

Returns a reference to the wgpu Device.

Useful for external plugins to initialize GPU resources.

Source

pub fn queue(&self) -> Option<&Queue>

Returns a reference to the wgpu Queue.

Useful for external plugins to submit commands.

Source

pub fn surface_format(&self) -> Option<TextureFormat>

Returns the surface/render-target texture format.

In windowed mode this is the swap-chain format; in headless mode it is the offscreen texture format. Returns None before initialisation.

Source

pub fn wgpu_ctx(&self) -> Option<&WgpuContext>

Returns a reference to the WgpuContext.

For external plugins that need access to low-level GPU resources. Only available after renderer initialization.

Source

pub fn dump_graph_mermaid(&self) -> Option<String>

Source

pub fn register_shader_template(&mut self, name: &str, source: &str)

Registers a custom WGSL shader template with the given name.

The source string is pre-processed by the minijinja template engine at compile time, so {$ include "chunks/camera_uniforms.wgsl" $} and similar directives are fully supported.

§Usage
renderer.register_shader_template(
    "custom_unlit",
    include_str!("shaders/custom_unlit.wgsl"),
);

After registration, any material declared with #[myth_material(shader = "custom_unlit")] will use this template.

§Panics

Panics if the renderer has not been initialized via init.

Source

pub fn is_headless(&self) -> bool

Returns true if the renderer is in headless (offscreen) mode.

Source

pub fn readback_pixels(&mut self) -> Result<Vec<u8>, Error>

Reads back the current headless render target as raw pixel data.

The returned Vec<u8> contains tightly-packed pixel data whose per-pixel byte count matches the headless texture format (e.g. 4 bytes for RGBA8, 8 bytes for RGBA16Float). Row ordering is top-to-bottom.

A staging buffer is cached internally and re-used across calls as long as the required size has not changed, eliminating per-frame allocation.

This method submits a GPU copy command and blocks the calling thread until the transfer completes.

§Errors

Returns an error if:

  • The renderer has not been initialised
  • No headless render target exists (windowed mode)
  • The GPU buffer mapping fails
Source

pub fn create_readback_stream( &self, buffer_count: usize, max_stash_size: usize, ) -> Result<ReadbackStream, Error>

Creates a [ReadbackStream] backed by the headless render target.

The stream pre-allocates buffer_count staging buffers that rotate in a ring, enabling fully non-blocking GPU→CPU readback suitable for video recording and AI training-data pipelines.

§Errors

Returns an error if the renderer is not initialised or not in headless mode, or if the texture format does not support readback.

Source

pub fn poll_device(&self)

Drives pending GPU callbacks without blocking.

Call this once per frame in a readback-stream loop so that map_async callbacks fire and frames become available via [ReadbackStream::try_recv].

Source

pub fn headless_texture(&self) -> Option<&Texture>

Returns a reference to the headless render target texture, if present.

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> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert 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>

Convert 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)

Convert &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)

Convert &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> 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> 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