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:
- All returned types are owned (not borrowed from Device)
- GPU resources use reference counting internally
- 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§
Sourcefn create_buffer(&self, desc: &BufferDescriptor<'_>) -> GpuBuffer
fn create_buffer(&self, desc: &BufferDescriptor<'_>) -> GpuBuffer
Create a GPU buffer.
Returns an owned GpuBuffer which can be either real or mock.
Sourcefn write_buffer(&self, buffer: &GpuBuffer, offset: u64, data: &[u8])
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.
Sourcefn create_texture(&self, desc: &TextureDescriptor<'_>) -> GpuTexture
fn create_texture(&self, desc: &TextureDescriptor<'_>) -> GpuTexture
Create a GPU texture.
Sourcefn create_shader_module(
&self,
desc: &ShaderModuleDescriptor<'_>,
) -> GpuShaderModule
fn create_shader_module( &self, desc: &ShaderModuleDescriptor<'_>, ) -> GpuShaderModule
Create a shader module from source code.
Sourcefn create_render_pipeline(
&self,
desc: &RenderPipelineDescriptor<'_>,
) -> GpuRenderPipeline
fn create_render_pipeline( &self, desc: &RenderPipelineDescriptor<'_>, ) -> GpuRenderPipeline
Create a render pipeline.
Sourcefn create_compute_pipeline(
&self,
desc: &ComputePipelineDescriptor<'_>,
) -> GpuComputePipeline
fn create_compute_pipeline( &self, desc: &ComputePipelineDescriptor<'_>, ) -> GpuComputePipeline
Create a compute pipeline.
Sourcefn create_bind_group_layout(
&self,
desc: &BindGroupLayoutDescriptor<'_>,
) -> GpuBindGroupLayout
fn create_bind_group_layout( &self, desc: &BindGroupLayoutDescriptor<'_>, ) -> GpuBindGroupLayout
Create a bind group layout.
Sourcefn create_bind_group(&self, desc: &BindGroupDescriptor<'_>) -> GpuBindGroup
fn create_bind_group(&self, desc: &BindGroupDescriptor<'_>) -> GpuBindGroup
Create a bind group.
Sourcefn create_sampler(&self, desc: &SamplerDescriptor<'_>) -> GpuSampler
fn create_sampler(&self, desc: &SamplerDescriptor<'_>) -> GpuSampler
Create a texture sampler.