|
use std::sync::Arc; |
|
use wgpu::{Device, Instance, Queue}; |
|
|
|
#[derive(Debug, Clone)] |
|
pub struct Context { |
|
pub device: Arc<Device>, |
|
pub queue: Arc<Queue>, |
|
pub instance: Arc<Instance>, |
|
pub adapter: Arc<wgpu::Adapter>, |
|
} |
|
|
|
impl Context { |
|
pub async fn new() -> Option<Self> { |
|
|
|
let instance_descriptor = wgpu::InstanceDescriptor { |
|
backends: wgpu::Backends::all(), |
|
..Default::default() |
|
}; |
|
let instance = Instance::new(instance_descriptor); |
|
|
|
let adapter_options = wgpu::RequestAdapterOptions { |
|
power_preference: wgpu::PowerPreference::HighPerformance, |
|
compatible_surface: None, |
|
force_fallback_adapter: false, |
|
}; |
|
|
|
let adapter = instance.request_adapter(&adapter_options).await?; |
|
|
|
let required_limits = adapter.limits(); |
|
|
|
|
|
let (device, queue) = adapter |
|
.request_device( |
|
&wgpu::DeviceDescriptor { |
|
label: None, |
|
|
|
required_features: wgpu::Features::empty(), |
|
|
|
|
|
|
|
|
|
required_limits, |
|
memory_hints: Default::default(), |
|
}, |
|
None, |
|
) |
|
.await |
|
.unwrap(); |
|
|
|
let info = adapter.get_info(); |
|
|
|
if info.vendor == 0x10005 { |
|
return None; |
|
} |
|
Some(Self { |
|
device: Arc::new(device), |
|
queue: Arc::new(queue), |
|
adapter: Arc::new(adapter), |
|
instance: Arc::new(instance), |
|
}) |
|
} |
|
} |
|
|