use std::collections::HashMap;
use super::kernels::EwKernel;
const REDUCE_SHADER_SRC: &str = include_str!("../../shaders/reduce_xyz.wgsl");
pub struct EwPipelines {
pipelines: HashMap<(EwKernel, u32), wgpu::ComputePipeline>,
reduce_pipeline: wgpu::ComputePipeline,
}
impl EwPipelines {
#[must_use]
pub fn new(device: &wgpu::Device) -> Self {
let reduce_pipeline = crate::renderer::gpu::compute::create_compute_pipeline_cached(
device,
None,
"reduce_xyz_main",
REDUCE_SHADER_SRC,
"reduce_xyz_main",
&[],
);
Self {
pipelines: HashMap::new(),
reduce_pipeline,
}
}
pub fn ensure(
&mut self,
device: &wgpu::Device,
kernel: EwKernel,
class: u32,
) -> &wgpu::ComputePipeline {
self.pipelines.entry((kernel, class)).or_insert_with(|| {
crate::renderer::gpu::compute::create_compute_pipeline_cached(
device,
None,
kernel.entry_point(),
kernel.source(),
kernel.entry_point(),
&[("MATERIAL_CLASS", f64::from(class))],
)
})
}
#[must_use]
pub fn get(&self, kernel: EwKernel, class: u32) -> &wgpu::ComputePipeline {
self.pipelines
.get(&(kernel, class))
.unwrap_or_else(|| panic!("pipeline {kernel:?} (class {class}) was not compiled"))
}
#[must_use]
pub const fn reduce_pipeline(&self) -> &wgpu::ComputePipeline {
&self.reduce_pipeline
}
pub fn compiled(&self) -> impl Iterator<Item = (EwKernel, u32)> + '_ {
self.pipelines.keys().copied()
}
}