Skip to main content

RenderContext

Trait RenderContext 

Source
pub trait RenderContext: Send + Sync {
    // Required methods
    fn create_buffer(&self, desc: &BufferDescriptor<'_>) -> GpuBuffer;
    fn write_buffer(&self, buffer: &GpuBuffer, offset: u64, data: &[u8]);
    fn create_texture(&self, desc: &TextureDescriptor<'_>) -> GpuTexture;
    fn create_shader_module(
        &self,
        desc: &ShaderModuleDescriptor<'_>,
    ) -> GpuShaderModule;
    fn create_render_pipeline(
        &self,
        desc: &RenderPipelineDescriptor<'_>,
    ) -> GpuRenderPipeline;
    fn create_compute_pipeline(
        &self,
        desc: &ComputePipelineDescriptor<'_>,
    ) -> GpuComputePipeline;
    fn create_bind_group_layout(
        &self,
        desc: &BindGroupLayoutDescriptor<'_>,
    ) -> GpuBindGroupLayout;
    fn create_bind_group(&self, desc: &BindGroupDescriptor<'_>) -> GpuBindGroup;
    fn create_sampler(&self, desc: &SamplerDescriptor<'_>) -> GpuSampler;
}
Expand description

Trait abstracting GPU resource creation and operations.

§Lifetime Considerations

This trait does NOT use lifetimes because:

  1. All returned types are owned (not borrowed from Device)
  2. GPU resources use reference counting internally
  3. Resources live until dropped

This makes the trait object-safe and easy to mock.

§Borrow Checking Pattern

Methods take &self (shared reference) and return owned wrapper types. This allows:

  • Multiple components to share the same context (via Arc)
  • Mock implementations to use interior mutability (Mutex)
  • No lifetime parameters propagating through the codebase

§Example

use astrelis_test_utils::RenderContext;
use wgpu::{BufferDescriptor, BufferUsages};

fn render_scene(ctx: &dyn RenderContext) {
    let desc = BufferDescriptor {
        label: None,
        size: 16,
        usage: BufferUsages::VERTEX,
        mapped_at_creation: false,
    };
    let data = vec![0u8; 16];
    let buffer = ctx.create_buffer(&desc);
    ctx.write_buffer(&buffer, 0, &data);
    // buffer is owned, no lifetime issues
}

Required Methods§

Source

fn create_buffer(&self, desc: &BufferDescriptor<'_>) -> GpuBuffer

Create a GPU buffer.

Returns an owned GpuBuffer which can be either real or mock.

Source

fn write_buffer(&self, buffer: &GpuBuffer, offset: u64, data: &[u8])

Write data to a buffer.

For real buffers, this maps to queue.write_buffer(). For mock buffers, this records the operation for test verification.

Source

fn create_texture(&self, desc: &TextureDescriptor<'_>) -> GpuTexture

Create a GPU texture.

Source

fn create_shader_module( &self, desc: &ShaderModuleDescriptor<'_>, ) -> GpuShaderModule

Create a shader module from source code.

Source

fn create_render_pipeline( &self, desc: &RenderPipelineDescriptor<'_>, ) -> GpuRenderPipeline

Create a render pipeline.

Source

fn create_compute_pipeline( &self, desc: &ComputePipelineDescriptor<'_>, ) -> GpuComputePipeline

Create a compute pipeline.

Source

fn create_bind_group_layout( &self, desc: &BindGroupLayoutDescriptor<'_>, ) -> GpuBindGroupLayout

Create a bind group layout.

Source

fn create_bind_group(&self, desc: &BindGroupDescriptor<'_>) -> GpuBindGroup

Create a bind group.

Source

fn create_sampler(&self, desc: &SamplerDescriptor<'_>) -> GpuSampler

Create a texture sampler.

Implementors§