diff options
author | 2024-04-27 14:16:12 +0200 | |
---|---|---|
committer | 2024-04-27 14:16:12 +0200 | |
commit | 2dcd4f916e0ea71f925212c8277498c6f995155b (patch) | |
tree | c562eec0bec369713a407e572b3632787833573f /wgpu | |
parent | d5bb6deb2fe15790d9ffe37243592189f1dd28c5 (diff) | |
download | iced-2dcd4f916e0ea71f925212c8277498c6f995155b.tar.gz iced-2dcd4f916e0ea71f925212c8277498c6f995155b.tar.bz2 iced-2dcd4f916e0ea71f925212c8277498c6f995155b.zip |
Retain caches in `iced_wgpu` as long as `Rc` values are alive
This allows reusing a `canvas::Cache` at no cost even if it
is not presented every frame.
Diffstat (limited to 'wgpu')
-rw-r--r-- | wgpu/src/text.rs | 13 | ||||
-rw-r--r-- | wgpu/src/triangle.rs | 13 |
2 files changed, 12 insertions, 14 deletions
diff --git a/wgpu/src/text.rs b/wgpu/src/text.rs index 0d01faca..f20db026 100644 --- a/wgpu/src/text.rs +++ b/wgpu/src/text.rs @@ -4,9 +4,9 @@ use crate::graphics::color; use crate::graphics::text::cache::{self, Cache as BufferCache}; use crate::graphics::text::{font_system, to_color, Editor, Paragraph}; -use rustc_hash::{FxHashMap, FxHashSet}; +use rustc_hash::FxHashMap; use std::collections::hash_map; -use std::rc::Rc; +use std::rc::{self, Rc}; use std::sync::atomic::{self, AtomicU64}; use std::sync::Arc; @@ -69,12 +69,12 @@ struct Upload { buffer_cache: BufferCache, transformation: Transformation, version: usize, + text: rc::Weak<[Text]>, } #[derive(Default)] pub struct Storage { uploads: FxHashMap<Id, Upload>, - recently_used: FxHashSet<Id>, } impl Storage { @@ -162,6 +162,7 @@ impl Storage { buffer_cache, transformation: new_transformation, version: 0, + text: Rc::downgrade(&cache.text), }); log::info!( @@ -171,13 +172,11 @@ impl Storage { ); } } - - let _ = self.recently_used.insert(cache.id); } pub fn trim(&mut self) { - self.uploads.retain(|id, _| self.recently_used.contains(id)); - self.recently_used.clear(); + self.uploads + .retain(|_id, upload| upload.text.strong_count() > 0); } } diff --git a/wgpu/src/triangle.rs b/wgpu/src/triangle.rs index 8470ea39..53a5502a 100644 --- a/wgpu/src/triangle.rs +++ b/wgpu/src/triangle.rs @@ -6,9 +6,9 @@ use crate::graphics::mesh::{self, Mesh}; use crate::graphics::Antialiasing; use crate::Buffer; -use rustc_hash::{FxHashMap, FxHashSet}; +use rustc_hash::FxHashMap; use std::collections::hash_map; -use std::rc::Rc; +use std::rc::{self, Rc}; use std::sync::atomic::{self, AtomicU64}; const INITIAL_INDEX_COUNT: usize = 1_000; @@ -64,12 +64,12 @@ struct Upload { layer: Layer, transformation: Transformation, version: usize, + batch: rc::Weak<[Mesh]>, } #[derive(Debug, Default)] pub struct Storage { uploads: FxHashMap<Id, Upload>, - recently_used: FxHashSet<Id>, } impl Storage { @@ -134,6 +134,7 @@ impl Storage { layer, transformation: new_transformation, version: 0, + batch: Rc::downgrade(&cache.batch), }); log::info!( @@ -143,13 +144,11 @@ impl Storage { ); } } - - let _ = self.recently_used.insert(cache.id); } pub fn trim(&mut self) { - self.uploads.retain(|id, _| self.recently_used.contains(id)); - self.recently_used.clear(); + self.uploads + .retain(|_id, upload| upload.batch.strong_count() > 0); } } |