use parking_lot::RwLock;
use std::fmt::Debug;
use std::sync::Arc;
use ahash::RandomState;
use vulkano::descriptor_set::WriteDescriptorSet;
use vulkano::image::sampler::Sampler;
use vulkano::image::view::ImageView;
use crate::render::descriptor_set::VKDescriptorSource;
#[derive(Debug)]
pub struct ImageSampler {
sampler: Arc<Sampler>,
view: RwLock<Arc<ImageView>>,
random_state: RandomState,
}
impl ImageSampler {
pub fn new(
view: Arc<ImageView>,
sampler: Arc<Sampler>,
) -> Self {
Self {
sampler,
view: RwLock::new(view),
random_state: RandomState::new(),
}
}
#[inline]
pub fn set_image_view(&self, view: Arc<ImageView>) {
*self.view.write() = view;
}
}
impl VKDescriptorSource for ImageSampler {
fn write_descriptor(&self, _frame_idx: usize, binding: u32) -> (WriteDescriptorSet, u64) {
let view = self.view.read();
(
WriteDescriptorSet::image_view_sampler(
binding,
view.clone(),
self.sampler.clone(),
),
self.random_state.hash_one(view.clone()),
)
}
fn update_descriptor_source(&self, _frame_idx: usize) -> u64 {
let view = self.view.read();
self.random_state.hash_one(view.clone())
}
}