Skip to main content

wgpu_primitives/
context.rs

1use crate::Error;
2use wgpu::{AdapterInfo, Backends, Device, Instance, MemoryHints, Queue, RequestAdapterOptions};
3
4pub struct Context {
5    pub adapter_info: AdapterInfo,
6    pub device: Device,
7    pub queue: Queue,
8}
9
10impl Context {
11    pub async fn init() -> Result<Self, Error> {
12        let descriptor = wgpu::InstanceDescriptor {
13            backends: Backends::PRIMARY,
14            ..Default::default()
15        }
16        .with_env();
17        let instance = Instance::new(&descriptor);
18
19        let adapter = instance
20            .request_adapter(&RequestAdapterOptions {
21                power_preference: wgpu::PowerPreference::HighPerformance,
22                compatible_surface: None,
23                force_fallback_adapter: false,
24            })
25            .await?;
26        let adapter_info = adapter.get_info();
27        let optional_features = wgpu::Features::TIMESTAMP_QUERY | wgpu::Features::SUBGROUP;
28        let required_features = adapter.features() & optional_features;
29
30        let (device, queue) = adapter
31            .request_device(&wgpu::DeviceDescriptor {
32                label: Some("Context Device"),
33                required_features,
34                required_limits: adapter.limits(),
35                memory_hints: MemoryHints::Performance,
36                ..Default::default()
37            })
38            .await?;
39
40        Ok(Self {
41            adapter_info,
42            device,
43            queue,
44        })
45    }
46}