renderer/blur: Use proper commit counter
This commit is contained in:
parent
d4cd9b674c
commit
6868c24501
1 changed files with 12 additions and 12 deletions
|
|
@ -1,9 +1,6 @@
|
||||||
use std::{
|
use std::{
|
||||||
borrow::{Borrow, BorrowMut},
|
borrow::{Borrow, BorrowMut},
|
||||||
sync::{
|
sync::{LazyLock, Mutex},
|
||||||
Arc, LazyLock, Mutex,
|
|
||||||
atomic::{AtomicBool, Ordering},
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
use cgmath::{Matrix3, SquareMatrix, Vector2};
|
use cgmath::{Matrix3, SquareMatrix, Vector2};
|
||||||
|
|
@ -127,7 +124,7 @@ struct BlurState {
|
||||||
offset: f64,
|
offset: f64,
|
||||||
passes: usize,
|
passes: usize,
|
||||||
region: Vec<Rectangle<i32, Logical>>,
|
region: Vec<Rectangle<i32, Logical>>,
|
||||||
dirty: Arc<AtomicBool>,
|
commit: CommitCounter,
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe impl Send for BlurState {}
|
unsafe impl Send for BlurState {}
|
||||||
|
|
@ -142,18 +139,18 @@ impl BlurState {
|
||||||
offset: 0.,
|
offset: 0.,
|
||||||
passes: 0,
|
passes: 0,
|
||||||
region: Vec::new(),
|
region: Vec::new(),
|
||||||
dirty: Arc::new(AtomicBool::new(true)),
|
commit: CommitCounter::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct BlurElement {
|
pub struct BlurElement {
|
||||||
id: Id,
|
id: Id,
|
||||||
|
commit: CommitCounter,
|
||||||
src: Size<f64, Buffer>,
|
src: Size<f64, Buffer>,
|
||||||
geometry: Rectangle<f64, Logical>,
|
geometry: Rectangle<f64, Logical>,
|
||||||
scaling_shaders: BlurShaders,
|
scaling_shaders: BlurShaders,
|
||||||
render_shader: GlesTexProgram,
|
render_shader: GlesTexProgram,
|
||||||
dirty: Arc<AtomicBool>,
|
|
||||||
region: Vec<Rectangle<i32, Physical>>,
|
region: Vec<Rectangle<i32, Physical>>,
|
||||||
offset: f64,
|
offset: f64,
|
||||||
passes: usize,
|
passes: usize,
|
||||||
|
|
@ -262,16 +259,16 @@ impl BlurElement {
|
||||||
state.region = region.clone();
|
state.region = region.clone();
|
||||||
state.src = src;
|
state.src = src;
|
||||||
if dirty {
|
if dirty {
|
||||||
state.dirty.store(dirty, Ordering::Release);
|
state.commit.increment();
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(BlurElement {
|
Ok(BlurElement {
|
||||||
id: state.id.clone(),
|
id: state.id.clone(),
|
||||||
|
commit: state.commit,
|
||||||
src,
|
src,
|
||||||
geometry,
|
geometry,
|
||||||
scaling_shaders: BlurShaders::get(renderer),
|
scaling_shaders: BlurShaders::get(renderer),
|
||||||
render_shader: ClippingShader::get(renderer),
|
render_shader: ClippingShader::get(renderer),
|
||||||
dirty: state.dirty.clone(),
|
|
||||||
offset: state.offset,
|
offset: state.offset,
|
||||||
passes: state.passes,
|
passes: state.passes,
|
||||||
region: region
|
region: region
|
||||||
|
|
@ -289,7 +286,7 @@ impl Element for BlurElement {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn current_commit(&self) -> CommitCounter {
|
fn current_commit(&self) -> CommitCounter {
|
||||||
Default::default()
|
self.commit
|
||||||
}
|
}
|
||||||
|
|
||||||
fn src(&self) -> Rectangle<f64, Buffer> {
|
fn src(&self) -> Rectangle<f64, Buffer> {
|
||||||
|
|
@ -309,7 +306,7 @@ impl Element for BlurElement {
|
||||||
scale: Scale<f64>,
|
scale: Scale<f64>,
|
||||||
commit: Option<CommitCounter>,
|
commit: Option<CommitCounter>,
|
||||||
) -> DamageSet<i32, Physical> {
|
) -> DamageSet<i32, Physical> {
|
||||||
if commit.is_none() || self.dirty.load(Ordering::Acquire) {
|
if self.commit.distance(commit).is_none_or(|d| d > 0) {
|
||||||
DamageSet::from_slice(&[self.geometry.to_physical_precise_round(scale)])
|
DamageSet::from_slice(&[self.geometry.to_physical_precise_round(scale)])
|
||||||
} else {
|
} else {
|
||||||
DamageSet::default()
|
DamageSet::default()
|
||||||
|
|
@ -344,7 +341,10 @@ impl<R: Renderer + AsGlowRenderer> RenderElement<R> for BlurElement {
|
||||||
|
|
||||||
let texture_ref = cache.get_or_insert_threadsafe(BlurTexture::default);
|
let texture_ref = cache.get_or_insert_threadsafe(BlurTexture::default);
|
||||||
let mut texture_entry = texture_ref.lock().unwrap();
|
let mut texture_entry = texture_ref.lock().unwrap();
|
||||||
if self.dirty.swap(false, Ordering::Acquire) {
|
if texture_entry
|
||||||
|
.as_ref()
|
||||||
|
.is_some_and(|tex| tex.size() != tex_size)
|
||||||
|
{
|
||||||
texture_entry.take();
|
texture_entry.take();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue