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