renderer/blur: Use proper commit counter

This commit is contained in:
Victoria Brekenfeld 2026-04-10 17:50:18 +02:00 committed by Victoria Brekenfeld
parent d4cd9b674c
commit 6868c24501

View file

@ -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();
} }