librashader_runtime/
parameters.rsuse arc_swap::ArcSwap;
use librashader_common::map::{FastHashMap, ShortString};
use librashader_presets::ParameterMeta;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::Arc;
pub trait FilterChainParameters {
fn parameters(&self) -> &RuntimeParameters;
}
pub struct RuntimeParameters {
passes_enabled: AtomicUsize,
pub(crate) parameters: ArcSwap<FastHashMap<ShortString, f32>>,
}
impl RuntimeParameters {
pub fn new(passes_enabled: usize, parameters: Vec<ParameterMeta>) -> Self {
RuntimeParameters {
passes_enabled: AtomicUsize::new(passes_enabled),
parameters: ArcSwap::new(Arc::new(
parameters
.into_iter()
.map(|param| (param.name, param.value))
.collect(),
)),
}
}
pub fn parameter_value(&self, name: &str) -> Option<f32> {
self.parameters.load().get::<str>(name.as_ref()).copied()
}
pub fn set_parameter_value(&self, name: &str, new_value: f32) -> Option<f32> {
let mut updated_map = FastHashMap::clone(&self.parameters.load());
if let Some(value) = updated_map.get_mut::<str>(name.as_ref()) {
let old = *value;
*value = new_value;
self.parameters.store(Arc::new(updated_map));
Some(old)
} else {
None
}
}
pub fn update_parameters(&self, updater: impl FnOnce(&mut FastHashMap<ShortString, f32>)) {
let mut updated_map = FastHashMap::clone(&self.parameters.load());
updater(&mut updated_map);
self.parameters.store(Arc::new(updated_map));
}
pub fn parameters(&self) -> Arc<FastHashMap<ShortString, f32>> {
self.parameters.load_full()
}
#[inline(always)]
pub fn passes_enabled(&self) -> usize {
self.passes_enabled.load(Ordering::Relaxed)
}
#[inline(always)]
pub fn set_passes_enabled(&self, count: usize) {
self.passes_enabled.store(count, Ordering::Relaxed);
}
}
#[macro_export]
macro_rules! impl_filter_chain_parameters {
($ty:ty) => {
impl ::librashader_runtime::parameters::FilterChainParameters for $ty {
fn parameters(&self) -> &::librashader_runtime::parameters::RuntimeParameters {
&self.common.config
}
}
};
}