diff options
| author | 2024-04-30 23:15:04 +0200 | |
|---|---|---|
| committer | 2024-04-30 23:15:04 +0200 | |
| commit | b276a603a17eda219b32f207aa53e2b6a1321a9f (patch) | |
| tree | 22eed4562ff3aaa7294a1a048b63b570d8d61f97 /graphics/src | |
| 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 '')
| -rw-r--r-- | graphics/src/cache.rs | 37 | 
1 files changed, 34 insertions, 3 deletions
| diff --git a/graphics/src/cache.rs b/graphics/src/cache.rs index 7106c392..bbba79eb 100644 --- a/graphics/src/cache.rs +++ b/graphics/src/cache.rs @@ -15,7 +15,7 @@ impl<T> Cache<T> {      /// Creates a new empty [`Cache`].      pub fn new() -> Self {          Cache { -            group: Group::unique(), +            group: Group::singleton(),              state: RefCell::new(State::Empty { previous: None }),          }      } @@ -27,6 +27,11 @@ impl<T> Cache<T> {      /// You should generally group caches that are likely to change      /// together.      pub fn with_group(group: Group) -> Self { +        assert!( +            !group.is_singleton(), +            "The group {group:?} cannot be shared!" +        ); +          Cache {              group,              state: RefCell::new(State::Empty { previous: None }), @@ -75,14 +80,40 @@ impl<T> Cache<T> {  /// A cache group can be used to implement certain performance  /// optimizations during rendering, like batching or sharing atlases.  #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub struct Group(u64); +pub struct Group { +    id: u64, +    is_singleton: bool, +}  impl Group {      /// Generates a new unique cache [`Group`].      pub fn unique() -> Self {          static NEXT: AtomicU64 = AtomicU64::new(0); -        Self(NEXT.fetch_add(1, atomic::Ordering::Relaxed)) +        Self { +            id: NEXT.fetch_add(1, atomic::Ordering::Relaxed), +            is_singleton: false, +        } +    } + +    /// Returns `true` if the [`Group`] can only ever have a +    /// single [`Cache`] in it. +    /// +    /// This is the default kind of [`Group`] assigned when using +    /// [`Cache::new`]. +    /// +    /// Knowing that a [`Group`] will never be shared may be +    /// useful for rendering backends to perform additional +    /// optimizations. +    pub fn is_singleton(self) -> bool { +        self.is_singleton +    } + +    fn singleton() -> Self { +        Self { +            is_singleton: true, +            ..Self::unique() +        }      }  } | 
