use crate::errors::AleaticoResult;
pub struct Gpu {
pub(crate) instance: wgpu::Instance,
pub(crate) adapter: wgpu::Adapter,
pub(crate) device: wgpu::Device,
pub(crate) queue: wgpu::Queue,
}
impl Gpu {
pub async fn new(instance: wgpu::Instance, adapter: wgpu::Adapter) -> AleaticoResult<Self> {
let (device, queue) = adapter
.request_device(&wgpu::DeviceDescriptor {
label: None,
required_features: wgpu::Features::empty(),
experimental_features: wgpu::ExperimentalFeatures::disabled(),
required_limits: if cfg!(target_arch = "wasm32") {
wgpu::Limits::downlevel_webgl2_defaults()
} else {
wgpu::Limits::default()
},
memory_hints: Default::default(),
trace: wgpu::Trace::Off,
})
.await?;
Ok(Self {
instance,
device,
adapter,
queue,
})
}
pub fn instance(&self) -> &wgpu::Instance {
&self.instance
}
pub fn adapter(&self) -> &wgpu::Adapter {
&self.adapter
}
pub fn device(&self) -> &wgpu::Device {
&self.device
}
pub fn queue(&self) -> &wgpu::Queue {
&self.queue
}
pub fn create_encoder(&self, label: Option<&str>) -> wgpu::CommandEncoder {
self.device
.create_command_encoder(&wgpu::CommandEncoderDescriptor { label })
}
pub fn submit<I>(&self, command_buffers: I)
where
I: IntoIterator<Item = wgpu::CommandBuffer>,
{
self.queue.submit(command_buffers);
}
}