use crate::error::RenderError;
pub struct RenderContext {
pub device: wgpu::Device,
pub queue: wgpu::Queue,
}
impl RenderContext {
#[must_use]
pub fn new(device: wgpu::Device, queue: wgpu::Queue) -> Self {
Self { device, queue }
}
pub async fn init() -> Result<Self, RenderError> {
Self::init_with_backend(wgpu::Backends::all()).await
}
pub async fn init_with_backend(backends: wgpu::Backends) -> Result<Self, RenderError> {
let instance = wgpu::Instance::new(wgpu::InstanceDescriptor {
backends,
flags: wgpu::InstanceFlags::default(),
memory_budget_thresholds: wgpu::MemoryBudgetThresholds::default(),
backend_options: wgpu::BackendOptions::default(),
display: None,
});
let adapter = instance
.request_adapter(&wgpu::RequestAdapterOptions {
power_preference: wgpu::PowerPreference::HighPerformance,
force_fallback_adapter: false,
compatible_surface: None,
})
.await
.map_err(|e| RenderError::DeviceCreation {
message: e.to_string(),
})?;
log::info!(
"render adapter selected backend={:?} name={}",
adapter.get_info().backend,
adapter.get_info().name
);
let (device, queue) = adapter
.request_device(&wgpu::DeviceDescriptor {
label: Some("ff-render"),
..Default::default()
})
.await
.map_err(|e| RenderError::DeviceCreation {
message: e.to_string(),
})?;
Ok(Self { device, queue })
}
}