use crate::backend::{ComputePipelineHandle, GpuBackend};
use crate::device::Device;
use crate::shader::ShaderModule;
use anyhow::Result;
use std::sync::{Arc, Mutex};
pub struct ComputePipeline {
_device: Device,
backend: Arc<Mutex<Box<dyn GpuBackend>>>,
pub(crate) handle: ComputePipelineHandle,
pub(crate) slot_access: Vec<Option<crate::types::ResourceAccess>>,
}
impl ComputePipeline {
pub fn new(device: &Device, compute_shader: &ShaderModule) -> Result<Self> {
Self::new_with_label(device, compute_shader, None)
}
pub fn new_with_label(device: &Device, compute_shader: &ShaderModule, label: Option<&str>) -> Result<Self> {
tracing::debug!(?label, "Creating compute pipeline");
let mut backend = device.inner.backend.lock().unwrap();
let handle = {
let _tz = crate::tracy_zone!("goldy.compute_pipeline.create_pso");
backend.create_compute_pipeline(device.inner.handle, compute_shader.handle, label)?
};
tracing::debug!("Compute pipeline created");
let slot_access = backend.compute_pipeline_slot_access(handle);
Ok(Self {
_device: device.clone(),
backend: Arc::clone(&device.inner.backend),
handle,
slot_access,
})
}
}
impl Drop for ComputePipeline {
fn drop(&mut self) {
tracing::trace!("Destroying compute pipeline");
let mut backend = self.backend.lock().unwrap();
backend.destroy_compute_pipeline(self.handle);
}
}