summaryrefslogtreecommitdiffstats
path: root/wgpu
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2024-04-27 14:16:12 +0200
committerLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2024-04-27 14:16:12 +0200
commit2dcd4f916e0ea71f925212c8277498c6f995155b (patch)
treec562eec0bec369713a407e572b3632787833573f /wgpu
parentd5bb6deb2fe15790d9ffe37243592189f1dd28c5 (diff)
downloadiced-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.rs13
-rw-r--r--wgpu/src/triangle.rs13
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);
}
}