1use crate::{GpuInitError, GpuRendererSettings, PowerPreference};
12
13pub struct HeadlessGpu {
16 pub device: wgpu::Device,
17 pub queue: wgpu::Queue,
18 pub adapter_info: String,
19}
20
21impl HeadlessGpu {
22 pub async fn new(settings: GpuRendererSettings) -> Result<Self, GpuInitError> {
27 let instance = wgpu::Instance::new(wgpu::InstanceDescriptor::default());
28 let power_preference = match settings.power_preference {
29 PowerPreference::Low => wgpu::PowerPreference::LowPower,
30 PowerPreference::High => wgpu::PowerPreference::HighPerformance,
31 };
32 let adapter = instance
33 .request_adapter(&wgpu::RequestAdapterOptions {
34 power_preference,
35 compatible_surface: None,
36 force_fallback_adapter: false,
37 })
38 .await
39 .ok_or(GpuInitError::NoAdapter)?;
40 let info = adapter.get_info();
41 let adapter_info = format!(
42 "{name} ({backend:?}, {device_type:?})",
43 name = info.name,
44 backend = info.backend,
45 device_type = info.device_type,
46 );
47 let (device, queue) = adapter
48 .request_device(
49 &wgpu::DeviceDescriptor {
50 label: Some("roxlap-gpu headless device"),
51 required_features: wgpu::Features::empty(),
52 required_limits: crate::pick_required_limits(&adapter.limits()),
53 memory_hints: wgpu::MemoryHints::default(),
54 },
55 None,
56 )
57 .await?;
58 Ok(Self {
59 device,
60 queue,
61 adapter_info,
62 })
63 }
64
65 pub fn new_blocking(settings: GpuRendererSettings) -> Result<Self, GpuInitError> {
70 pollster::block_on(Self::new(settings))
71 }
72}