use crate::{
pipeline::{constants::OUTPUT_BUFFER_SIZE, output_clear::OutputClear},
wgpu_render_state,
};
use wgpu::{Adapter, Buffer, BufferDescriptor, BufferUsages, Device, Queue};
#[derive(Debug, Clone)]
pub struct Gpu {
pub device: Device,
pub queue: Queue,
}
impl Gpu {
pub fn ui() -> Self {
let render_state = wgpu_render_state();
Self {
device: render_state.device,
queue: render_state.queue,
}
}
}
#[derive(Debug)]
pub struct OutputContext {
pub gpu: Gpu,
pub output_buffer: Buffer,
pub output_clear: OutputClear,
}
impl OutputContext {
pub fn new(adapter: &Adapter) -> Result<Self, wgpu::RequestDeviceError> {
let (device, queue) =
pollster::block_on(adapter.request_device(&wgpu::DeviceDescriptor {
label: Some("gled output device"),
#[cfg(feature = "profiling")]
required_features: adapter.features()
& wgpu_profiler::GpuProfiler::ALL_WGPU_TIMER_FEATURES,
required_limits: adapter.limits(),
..Default::default()
}))?;
device.on_uncaptured_error(std::sync::Arc::new(|error| {
tracing::error!("WGPU error on the output device: {error:?}");
}));
let output_buffer = device.create_buffer(&BufferDescriptor {
size: OUTPUT_BUFFER_SIZE,
usage: BufferUsages::STORAGE | BufferUsages::COPY_SRC | BufferUsages::COPY_DST,
label: Some("Output buffer"),
mapped_at_creation: false,
});
let output_clear = OutputClear::new(&device, &output_buffer);
Ok(Self {
gpu: Gpu { device, queue },
output_buffer,
output_clear,
})
}
}