use std::sync::Arc;
use wgpu::{Adapter, Device, Instance, Queue};
pub struct GpuInstance {
_instance: Instance, _adapter: Adapter, device: Arc<Device>,
queue: Queue,
}
impl GpuInstance {
pub async fn new() -> anyhow::Result<Self> {
let instance = wgpu::Instance::default();
let adapter = instance
.request_adapter(&wgpu::RequestAdapterOptions {
power_preference: wgpu::PowerPreference::HighPerformance,
..Default::default()
})
.await
.ok_or_else(|| anyhow::anyhow!("Failed to initialize gpu adapter."))?;
let (device, queue) = adapter
.request_device(
&wgpu::DeviceDescriptor {
label: None,
required_features: wgpu::Features::TIMESTAMP_QUERY,
required_limits: wgpu::Limits {
max_buffer_size: 1_000_000_000,
max_storage_buffer_binding_size: 1_000_000_000,
..Default::default()
},
memory_hints: Default::default(),
},
None,
)
.await?;
Ok(Self {
_instance: instance,
_adapter: adapter,
device: Arc::new(device),
queue,
})
}
pub fn device(&self) -> &Device {
&self.device
}
pub fn device_arc(&self) -> Arc<Device> {
self.device.clone()
}
pub fn queue(&self) -> &Queue {
&self.queue
}
}