make engine send by using Arc in text/triangle caches

This commit is contained in:
Alix Bott 2024-12-08 03:27:37 +01:00
parent d6182299b9
commit 917feb9247
2 changed files with 19 additions and 20 deletions

View file

@ -7,9 +7,8 @@ use crate::graphics::text::{font_system, to_color, Editor, Paragraph};
use rustc_hash::FxHashMap; use rustc_hash::FxHashMap;
use std::collections::hash_map; use std::collections::hash_map;
use std::rc::{self, Rc};
use std::sync::atomic::{self, AtomicU64}; use std::sync::atomic::{self, AtomicU64};
use std::sync::Arc; use std::sync::{self, Arc};
pub use crate::graphics::Text; pub use crate::graphics::Text;
@ -37,7 +36,7 @@ pub enum Item {
pub struct Cache { pub struct Cache {
id: Id, id: Id,
group: cache::Group, group: cache::Group,
text: Rc<[Text]>, text: Arc<[Text]>,
version: usize, version: usize,
} }
@ -55,7 +54,7 @@ impl Cache {
Some(Self { Some(Self {
id: Id(NEXT_ID.fetch_add(1, atomic::Ordering::Relaxed)), id: Id(NEXT_ID.fetch_add(1, atomic::Ordering::Relaxed)),
group, group,
text: Rc::from(text), text: Arc::from(text),
version: 0, version: 0,
}) })
} }
@ -65,7 +64,7 @@ impl Cache {
return; return;
} }
self.text = Rc::from(text); self.text = Arc::from(text);
self.version += 1; self.version += 1;
} }
} }
@ -76,8 +75,8 @@ struct Upload {
transformation: Transformation, transformation: Transformation,
version: usize, version: usize,
group_version: usize, group_version: usize,
text: rc::Weak<[Text]>, text: sync::Weak<[Text]>,
_atlas: rc::Weak<()>, _atlas: sync::Weak<()>,
} }
#[derive(Default)] #[derive(Default)]
@ -90,7 +89,7 @@ struct Group {
atlas: glyphon::TextAtlas, atlas: glyphon::TextAtlas,
version: usize, version: usize,
should_trim: bool, should_trim: bool,
handle: Rc<()>, // Keeps track of active uploads handle: Arc<()>, // Keeps track of active uploads
} }
impl Storage { impl Storage {
@ -136,7 +135,7 @@ impl Storage {
), ),
version: 0, version: 0,
should_trim: false, should_trim: false,
handle: Rc::new(()), handle: Arc::new(()),
} }
}); });
@ -167,7 +166,7 @@ impl Storage {
group.should_trim = group.should_trim =
group.should_trim || upload.version != cache.version; group.should_trim || upload.version != cache.version;
upload.text = Rc::downgrade(&cache.text); upload.text = Arc::downgrade(&cache.text);
upload.version = cache.version; upload.version = cache.version;
upload.group_version = group.version; upload.group_version = group.version;
upload.transformation = new_transformation; upload.transformation = new_transformation;
@ -206,8 +205,8 @@ impl Storage {
transformation: new_transformation, transformation: new_transformation,
version: 0, version: 0,
group_version: group.version, group_version: group.version,
text: Rc::downgrade(&cache.text), text: Arc::downgrade(&cache.text),
_atlas: Rc::downgrade(&group.handle), _atlas: Arc::downgrade(&group.handle),
}); });
group.should_trim = cache.group.is_singleton(); group.should_trim = cache.group.is_singleton();
@ -226,7 +225,7 @@ impl Storage {
.retain(|_id, upload| upload.text.strong_count() > 0); .retain(|_id, upload| upload.text.strong_count() > 0);
self.groups.retain(|id, group| { self.groups.retain(|id, group| {
let active_uploads = Rc::weak_count(&group.handle); let active_uploads = Arc::weak_count(&group.handle);
if active_uploads == 0 { if active_uploads == 0 {
log::debug!("Dropping text atlas: {id:?}"); log::debug!("Dropping text atlas: {id:?}");

View file

@ -8,8 +8,8 @@ use crate::Buffer;
use rustc_hash::FxHashMap; use rustc_hash::FxHashMap;
use std::collections::hash_map; use std::collections::hash_map;
use std::rc::{self, Rc};
use std::sync::atomic::{self, AtomicU64}; use std::sync::atomic::{self, AtomicU64};
use std::sync::{self, Arc};
const INITIAL_INDEX_COUNT: usize = 1_000; const INITIAL_INDEX_COUNT: usize = 1_000;
const INITIAL_VERTEX_COUNT: usize = 1_000; const INITIAL_VERTEX_COUNT: usize = 1_000;
@ -31,7 +31,7 @@ pub enum Item {
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct Cache { pub struct Cache {
id: Id, id: Id,
batch: Rc<[Mesh]>, batch: Arc<[Mesh]>,
version: usize, version: usize,
} }
@ -48,13 +48,13 @@ impl Cache {
Some(Self { Some(Self {
id: Id(NEXT_ID.fetch_add(1, atomic::Ordering::Relaxed)), id: Id(NEXT_ID.fetch_add(1, atomic::Ordering::Relaxed)),
batch: Rc::from(meshes), batch: Arc::from(meshes),
version: 0, version: 0,
}) })
} }
pub fn update(&mut self, meshes: Vec<Mesh>) { pub fn update(&mut self, meshes: Vec<Mesh>) {
self.batch = Rc::from(meshes); self.batch = Arc::from(meshes);
self.version += 1; self.version += 1;
} }
} }
@ -64,7 +64,7 @@ struct Upload {
layer: Layer, layer: Layer,
transformation: Transformation, transformation: Transformation,
version: usize, version: usize,
batch: rc::Weak<[Mesh]>, batch: sync::Weak<[Mesh]>,
} }
#[derive(Debug, Default)] #[derive(Debug, Default)]
@ -113,7 +113,7 @@ impl Storage {
new_transformation, new_transformation,
); );
upload.batch = Rc::downgrade(&cache.batch); upload.batch = Arc::downgrade(&cache.batch);
upload.version = cache.version; upload.version = cache.version;
upload.transformation = new_transformation; upload.transformation = new_transformation;
} }
@ -135,7 +135,7 @@ impl Storage {
layer, layer,
transformation: new_transformation, transformation: new_transformation,
version: 0, version: 0,
batch: Rc::downgrade(&cache.batch), batch: Arc::downgrade(&cache.batch),
}); });
log::debug!( log::debug!(