use wgpu::{Adapter, Device, Instance, InstanceDescriptor, MemoryHints, PowerPreference, Queue};
pub struct GpuContext {
instance: Instance,
adapter: Adapter,
device: Device,
queue: Queue,
}
impl GpuContext {
pub async fn new() -> Self {
let instance = Instance::new(InstanceDescriptor::new_without_display_handle());
let adapter = instance
.request_adapter(&wgpu::RequestAdapterOptions {
power_preference: PowerPreference::HighPerformance,
force_fallback_adapter: false,
compatible_surface: None,
..Default::default()
})
.await
.expect("no compatible GPU adapter found");
let (device, queue) = adapter
.request_device(&wgpu::DeviceDescriptor {
label: Some("dynamis device"),
required_features: wgpu::Features::empty(),
required_limits: wgpu::Limits::default(),
memory_hints: MemoryHints::default(),
..Default::default()
})
.await
.expect("failed to create GPU device");
Self {
instance,
adapter,
device,
queue,
}
}
pub fn device(&self) -> &Device {
&self.device
}
pub fn queue(&self) -> &Queue {
&self.queue
}
pub fn adapter_info(&self) -> wgpu::AdapterInfo {
self.adapter.get_info()
}
pub fn instance(&self) -> &Instance {
&self.instance
}
}