#![allow(dead_code)]
use std::sync::{Mutex, MutexGuard, OnceLock};
use iced::{Font, Pixels};
use iced_wgpu::graphics::Shell;
use iced_wgpu::wgpu;
use iced_wgpu::{Engine, Renderer};
pub fn shared() -> Option<MutexGuard<'static, Renderer>> {
static SHARED: OnceLock<Option<Mutex<Renderer>>> = OnceLock::new();
SHARED
.get_or_init(|| headless_renderer().map(Mutex::new))
.as_ref()
.map(|m| m.lock().unwrap_or_else(|e| e.into_inner()))
}
fn headless_renderer() -> Option<Renderer> {
let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor {
backends: wgpu::Backends::all(),
..Default::default()
});
let adapter = pollster::block_on(instance.request_adapter(&wgpu::RequestAdapterOptions {
power_preference: wgpu::PowerPreference::LowPower,
compatible_surface: None,
force_fallback_adapter: false,
}))
.ok()?;
let (device, queue) = pollster::block_on(adapter.request_device(&wgpu::DeviceDescriptor {
label: Some("widget_pixel_oracle"),
required_features: wgpu::Features::empty(),
required_limits: wgpu::Limits {
max_bind_groups: 2,
..wgpu::Limits::default()
},
..Default::default()
}))
.ok()?;
let engine = Engine::new(
&adapter,
device,
queue,
wgpu::TextureFormat::Rgba8Unorm,
None,
Shell::headless(),
);
Some(Renderer::new(engine, Font::default(), Pixels(16.0)))
}