use std::cell::RefCell;
use std::collections::HashMap;
use std::rc::Rc;
pub struct PipelineCache {
builder: Box<dyn Fn(u32) -> wgpu::RenderPipeline>,
cache: RefCell<HashMap<u32, Rc<wgpu::RenderPipeline>>>,
}
impl PipelineCache {
pub fn new(builder: impl Fn(u32) -> wgpu::RenderPipeline + 'static) -> Self {
PipelineCache {
builder: Box::new(builder),
cache: RefCell::new(HashMap::new()),
}
}
pub fn get(&self, sample_count: u32) -> Rc<wgpu::RenderPipeline> {
let sample_count = sample_count.max(1);
if let Some(pipeline) = self.cache.borrow().get(&sample_count) {
return pipeline.clone();
}
let pipeline = Rc::new((self.builder)(sample_count));
self.cache
.borrow_mut()
.insert(sample_count, pipeline.clone());
pipeline
}
}
pub fn multisample_state(sample_count: u32) -> wgpu::MultisampleState {
wgpu::MultisampleState {
count: sample_count.max(1),
mask: !0,
alpha_to_coverage_enabled: false,
}
}