summaryrefslogtreecommitdiffstats
path: root/wgpu
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2024-04-30 23:15:04 +0200
committerLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2024-04-30 23:15:04 +0200
commitb276a603a17eda219b32f207aa53e2b6a1321a9f (patch)
tree22eed4562ff3aaa7294a1a048b63b570d8d61f97 /wgpu
parentc51b85e7ab067f5e7411eccd10a5ae192e6ee0a8 (diff)
downloadiced-b276a603a17eda219b32f207aa53e2b6a1321a9f.tar.gz
iced-b276a603a17eda219b32f207aa53e2b6a1321a9f.tar.bz2
iced-b276a603a17eda219b32f207aa53e2b6a1321a9f.zip
Fix cache trimming loop in `iced_wgpu::text`
Diffstat (limited to 'wgpu')
-rw-r--r--wgpu/src/text.rs24
1 files changed, 18 insertions, 6 deletions
diff --git a/wgpu/src/text.rs b/wgpu/src/text.rs
index 8ec1d56a..2508906f 100644
--- a/wgpu/src/text.rs
+++ b/wgpu/src/text.rs
@@ -157,13 +157,16 @@ impl Storage {
target_size,
);
+ // Only trim if glyphs have changed
+ group.should_trim =
+ group.should_trim || upload.version != cache.version;
+
upload.text = Rc::downgrade(&cache.text);
upload.version = cache.version;
upload.group_version = group.version;
upload.transformation = new_transformation;
upload.buffer_cache.trim();
- group.should_trim = true;
}
}
hash_map::Entry::Vacant(entry) => {
@@ -213,19 +216,28 @@ impl Storage {
.retain(|_id, upload| upload.text.strong_count() > 0);
self.groups.retain(|id, group| {
- if Rc::weak_count(&group.handle) == 0 {
+ let active_uploads = Rc::weak_count(&group.handle);
+
+ if active_uploads == 0 {
log::debug!("Dropping text atlas: {id:?}");
return false;
}
- if group.should_trim {
- log::debug!("Trimming text atlas: {id:?}");
+ if id.is_singleton() || group.should_trim {
+ log::debug!(
+ "Trimming text atlas: {id:?} (uploads: {active_uploads})"
+ );
group.atlas.trim();
-
- group.version += 1;
group.should_trim = false;
+
+ // We only need to worry about glyph fighting
+ // when the atlas may be shared by multiple
+ // uploads.
+ if !id.is_singleton() {
+ group.version += 1;
+ }
}
true