use wgpu;
pub struct GPUDevice {
pub device: wgpu::Device,
pub queue: wgpu::Queue,
pub adapter: wgpu::Adapter,
pub instance: wgpu::Instance,
}
impl Default for GPUDevice {
fn default() -> Self {
Self::new()
}
}
impl GPUDevice {
pub fn new() -> Self {
pollster::block_on(Self::new_async())
}
async fn new_async() -> Self {
let instance = wgpu::Instance::new(wgpu::InstanceDescriptor {
backends: wgpu::Backends::all(),
..Default::default()
});
let adapter = instance
.request_adapter(&wgpu::RequestAdapterOptions {
power_preference: wgpu::PowerPreference::HighPerformance,
compatible_surface: None,
force_fallback_adapter: false,
})
.await
.expect("Failed to find a GPU adapter");
let (device, queue) = adapter
.request_device(
&wgpu::DeviceDescriptor {
label: Some("shdrlib GPU Device"),
required_features: wgpu::Features::empty(),
required_limits: wgpu::Limits::default(),
memory_hints: Default::default(),
},
None,
)
.await
.expect("Failed to create GPU device");
GPUDevice {
device,
queue,
adapter,
instance,
}
}
pub fn info(&self) -> wgpu::AdapterInfo {
self.adapter.get_info()
}
pub fn adapter(&self) -> &wgpu::Adapter {
&self.adapter
}
pub fn instance(&self) -> &wgpu::Instance {
&self.instance
}
}