diff options
| author | 2024-04-30 23:15:04 +0200 | |
|---|---|---|
| committer | 2024-04-30 23:15:04 +0200 | |
| commit | b276a603a17eda219b32f207aa53e2b6a1321a9f (patch) | |
| tree | 22eed4562ff3aaa7294a1a048b63b570d8d61f97 /wgpu | |
| parent | c51b85e7ab067f5e7411eccd10a5ae192e6ee0a8 (diff) | |
| download | iced-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.rs | 24 | 
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  | 
