summaryrefslogtreecommitdiffstats
path: root/wgpu/src/text.rs
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2024-04-30 23:51:00 +0200
committerLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2024-04-30 23:51:00 +0200
commit7e2d0dc931a4409e661851a1c7dffdcfd5b2f93a (patch)
tree18934336d9a446299d7c01abb7b9d5503c3c7f31 /wgpu/src/text.rs
parentb276a603a17eda219b32f207aa53e2b6a1321a9f (diff)
downloadiced-7e2d0dc931a4409e661851a1c7dffdcfd5b2f93a.tar.gz
iced-7e2d0dc931a4409e661851a1c7dffdcfd5b2f93a.tar.bz2
iced-7e2d0dc931a4409e661851a1c7dffdcfd5b2f93a.zip
Keep text atlases alive during temporary empty uploads
Diffstat (limited to '')
-rw-r--r--wgpu/src/text.rs76
1 files changed, 44 insertions, 32 deletions
diff --git a/wgpu/src/text.rs b/wgpu/src/text.rs
index 2508906f..7e683c77 100644
--- a/wgpu/src/text.rs
+++ b/wgpu/src/text.rs
@@ -61,6 +61,10 @@ impl Cache {
}
pub fn update(&mut self, text: Vec<Text>) {
+ if self.text.is_empty() && text.is_empty() {
+ return;
+ }
+
self.text = Rc::from(text);
self.version += 1;
}
@@ -139,23 +143,24 @@ impl Storage {
hash_map::Entry::Occupied(entry) => {
let upload = entry.into_mut();
- if !cache.text.is_empty()
- && (upload.version != cache.version
- || upload.group_version != group.version
- || upload.transformation != new_transformation)
+ if upload.version != cache.version
+ || upload.group_version != group.version
+ || upload.transformation != new_transformation
{
- let _ = prepare(
- device,
- queue,
- encoder,
- &mut upload.renderer,
- &mut group.atlas,
- &mut upload.buffer_cache,
- &cache.text,
- bounds,
- new_transformation,
- target_size,
- );
+ if !cache.text.is_empty() {
+ let _ = prepare(
+ device,
+ queue,
+ encoder,
+ &mut upload.renderer,
+ &mut group.atlas,
+ &mut upload.buffer_cache,
+ &cache.text,
+ bounds,
+ new_transformation,
+ target_size,
+ );
+ }
// Only trim if glyphs have changed
group.should_trim =
@@ -179,18 +184,20 @@ impl Storage {
let mut buffer_cache = BufferCache::new();
- let _ = prepare(
- device,
- queue,
- encoder,
- &mut renderer,
- &mut group.atlas,
- &mut buffer_cache,
- &cache.text,
- bounds,
- new_transformation,
- target_size,
- );
+ if !cache.text.is_empty() {
+ let _ = prepare(
+ device,
+ queue,
+ encoder,
+ &mut renderer,
+ &mut group.atlas,
+ &mut buffer_cache,
+ &cache.text,
+ bounds,
+ new_transformation,
+ target_size,
+ );
+ }
let _ = entry.insert(Upload {
renderer,
@@ -202,6 +209,8 @@ impl Storage {
_atlas: Rc::downgrade(&group.handle),
});
+ group.should_trim = cache.group.is_singleton();
+
log::debug!(
"New text upload: {} (total: {})",
cache.id.0,
@@ -224,10 +233,8 @@ impl Storage {
return false;
}
- if id.is_singleton() || group.should_trim {
- log::debug!(
- "Trimming text atlas: {id:?} (uploads: {active_uploads})"
- );
+ if group.should_trim {
+ log::trace!("Trimming text atlas: {id:?}");
group.atlas.trim();
group.should_trim = false;
@@ -236,6 +243,11 @@ impl Storage {
// when the atlas may be shared by multiple
// uploads.
if !id.is_singleton() {
+ log::debug!(
+ "Invalidating text atlas: {id:?} \
+ (uploads: {active_uploads})"
+ );
+
group.version += 1;
}
}