Files
yawn/core/renderer/wgpu.rs
T
Ampandheaust 239b1d25b0 Build Rust render graph core
Keep hot render state in a generic shared SOA arena and use worker messages only for allocation, graph compilation, loadout changes, and render pacing. Compile external S-expression graphs into upfront WebGPU resources, transient aliases, and reusable render bundles.

Amp-Thread-ID: https://ampcode.com/threads/T-01a01380-b478-77d0-84a0-102880a5c5ae
Co-authored-by: Heaust Azure <heaust.azure@gmail.com>
2026-08-20 05:35:24 +00:00

54 lines
1.6 KiB
Rust

pub struct Wgpu {
_instance: wgpu::Instance,
pub surface: wgpu::Surface<'static>,
pub device: wgpu::Device,
pub queue: wgpu::Queue,
pub config: wgpu::SurfaceConfiguration,
pub format: wgpu::TextureFormat,
pub width: u32,
pub height: u32,
}
impl Wgpu {
pub async fn new(canvas: web_sys::OffscreenCanvas) -> Result<Self, String> {
let width = canvas.width();
let height = canvas.height();
if width == 0 || height == 0 {
return Err("CANVAS_SIZE".into());
}
let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor {
backends: wgpu::Backends::BROWSER_WEBGPU,
..Default::default()
});
let surface = instance
.create_surface(wgpu::SurfaceTarget::OffscreenCanvas(canvas))
.map_err(|_| "SURFACE")?;
let adapter = instance
.request_adapter(&wgpu::RequestAdapterOptions {
compatible_surface: Some(&surface),
..Default::default()
})
.await
.map_err(|_| "WEBGPU_UNAVAILABLE")?;
let (device, queue) = adapter
.request_device(&wgpu::DeviceDescriptor::default())
.await
.map_err(|_| "DEVICE")?;
let config = surface
.get_default_config(&adapter, width, height)
.ok_or("SURFACE")?;
let format = config.format;
surface.configure(&device, &config);
Ok(Self {
_instance: instance,
surface,
device,
queue,
config,
format,
width,
height,
})
}
}