librashader_runtime/
parameters.rs1use arc_swap::ArcSwap;
2use librashader_common::map::{FastHashMap, ShortString};
3use librashader_presets::ParameterMeta;
4use std::sync::atomic::{AtomicUsize, Ordering};
5use std::sync::Arc;
6
7pub trait FilterChainParameters {
9 fn parameters(&self) -> &RuntimeParameters;
11}
12
13pub struct RuntimeParameters {
18 passes_enabled: AtomicUsize,
19 pub(crate) parameters: ArcSwap<FastHashMap<ShortString, f32>>,
20}
21
22impl RuntimeParameters {
23 pub fn new(passes_enabled: usize, parameters: Vec<ParameterMeta>) -> Self {
26 RuntimeParameters {
27 passes_enabled: AtomicUsize::new(passes_enabled),
28 parameters: ArcSwap::new(Arc::new(
29 parameters
30 .into_iter()
31 .map(|param| (param.name, param.value))
32 .collect(),
33 )),
34 }
35 }
36
37 pub fn parameter_value(&self, name: &str) -> Option<f32> {
39 self.parameters.load().get::<str>(name.as_ref()).copied()
40 }
41
42 pub fn set_parameter_value(&self, name: &str, new_value: f32) -> Option<f32> {
47 let mut updated_map = FastHashMap::clone(&self.parameters.load());
48
49 if let Some(value) = updated_map.get_mut::<str>(name.as_ref()) {
50 let old = *value;
51 *value = new_value;
52
53 self.parameters.store(Arc::new(updated_map));
54
55 Some(old)
56 } else {
57 None
58 }
59 }
60
61 pub fn update_parameters(&self, updater: impl FnOnce(&mut FastHashMap<ShortString, f32>)) {
63 let mut updated_map = FastHashMap::clone(&self.parameters.load());
64 updater(&mut updated_map);
65 self.parameters.store(Arc::new(updated_map));
66 }
67
68 pub fn parameters(&self) -> Arc<FastHashMap<ShortString, f32>> {
70 self.parameters.load_full()
71 }
72
73 #[inline(always)]
78 pub fn passes_enabled(&self) -> usize {
79 self.passes_enabled.load(Ordering::Relaxed)
80 }
81
82 #[inline(always)]
86 pub fn set_passes_enabled(&self, count: usize) {
87 self.passes_enabled.store(count, Ordering::Relaxed);
88 }
89}
90
91#[macro_export]
92macro_rules! impl_filter_chain_parameters {
93 ($ty:ty) => {
94 impl ::librashader_runtime::parameters::FilterChainParameters for $ty {
95 fn parameters(&self) -> &::librashader_runtime::parameters::RuntimeParameters {
96 &self.common.config
97 }
98 }
99 };
100}