Skip to main content

lgui_core/memory/
policy.rs

1use std::time::Duration;
2
3#[cfg_attr(feature = "diagnostics-serde", derive(serde::Serialize))]
4#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
5pub enum CacheDomain {
6    EncodedImage,
7    DecodedImage,
8    Svg,
9    Blur,
10    Text,
11    StaticLayer,
12    ScrollRaster,
13    Gdi,
14    D2d,
15    Skia,
16    ComponentOutput,
17    HostScene,
18    Diagnostics,
19    Persistent,
20}
21
22impl CacheDomain {
23    pub const fn as_str(self) -> &'static str {
24        match self {
25            Self::EncodedImage => "encoded-image",
26            Self::DecodedImage => "decoded-image",
27            Self::Svg => "svg",
28            Self::Blur => "blur",
29            Self::Text => "text",
30            Self::StaticLayer => "static-layer",
31            Self::ScrollRaster => "scroll-raster",
32            Self::Gdi => "gdi",
33            Self::D2d => "d2d",
34            Self::Skia => "skia",
35            Self::ComponentOutput => "component-output",
36            Self::HostScene => "host-scene",
37            Self::Diagnostics => "diagnostics",
38            Self::Persistent => "persistent",
39        }
40    }
41}
42
43#[cfg_attr(feature = "diagnostics-serde", derive(serde::Serialize))]
44#[derive(Clone, Copy, Debug, Default, Hash, PartialEq, Eq)]
45pub enum ResourceClass {
46    Live,
47    Rebuildable,
48    #[default]
49    Cache,
50    Transient,
51}
52
53#[cfg_attr(feature = "diagnostics-serde", derive(serde::Serialize))]
54#[derive(Clone, Copy, Debug, Default, Hash, PartialEq, Eq, PartialOrd, Ord)]
55pub enum RetentionClass {
56    Frame,
57    WhileVisible,
58    Scene,
59    #[default]
60    Session,
61    Persistent,
62}
63
64#[cfg_attr(feature = "diagnostics-serde", derive(serde::Serialize))]
65#[derive(Clone, Copy, Debug, Default, Hash, PartialEq, Eq, PartialOrd, Ord)]
66pub enum CachePriority {
67    Low,
68    #[default]
69    Normal,
70    High,
71}
72
73#[cfg_attr(feature = "diagnostics-serde", derive(serde::Serialize))]
74#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
75pub enum ImageCachePolicy {
76    #[default]
77    ApplicationDefault,
78    NoStore,
79    WhileVisible,
80    Scene,
81    Session,
82    Persistent {
83        max_age: Duration,
84        revalidate: bool,
85    },
86}
87
88#[cfg_attr(feature = "diagnostics-serde", derive(serde::Serialize))]
89#[derive(Clone, Copy, Debug, Default, Hash, PartialEq, Eq)]
90pub enum CacheScope {
91    #[default]
92    Memory,
93    Persistent,
94    AllRebuildable,
95}
96
97#[cfg_attr(feature = "diagnostics-serde", derive(serde::Serialize))]
98#[derive(Clone, Copy, Debug, Default, Hash, PartialEq, Eq)]
99pub enum TrimReason {
100    #[default]
101    SoftBudget,
102    HardBudget,
103    WindowHidden,
104    AllWindowsHidden,
105    SessionUnmounted,
106    DeviceLost,
107    ThemeOrScaleChanged,
108    ModeratePressure,
109    CriticalPressure,
110    Explicit,
111    Shutdown,
112}
113
114#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq)]
115pub enum MemoryEvent {
116    FrameCommitted,
117    WindowHidden,
118    WindowShown,
119    AllWindowsHidden,
120    SessionUnmounted,
121    RendererDeviceLost,
122    ThemeOrScaleChanged,
123    ModeratePressure,
124    CriticalPressure,
125    ExplicitTrim,
126    ApplicationShutdown,
127}
128
129impl MemoryEvent {
130    pub const fn trim_reason(self) -> TrimReason {
131        match self {
132            Self::FrameCommitted => TrimReason::SoftBudget,
133            Self::WindowHidden => TrimReason::WindowHidden,
134            Self::WindowShown => TrimReason::SoftBudget,
135            Self::AllWindowsHidden => TrimReason::AllWindowsHidden,
136            Self::SessionUnmounted => TrimReason::SessionUnmounted,
137            Self::RendererDeviceLost => TrimReason::DeviceLost,
138            Self::ThemeOrScaleChanged => TrimReason::ThemeOrScaleChanged,
139            Self::ModeratePressure => TrimReason::ModeratePressure,
140            Self::CriticalPressure => TrimReason::CriticalPressure,
141            Self::ExplicitTrim => TrimReason::Explicit,
142            Self::ApplicationShutdown => TrimReason::Shutdown,
143        }
144    }
145}
146
147#[cfg_attr(feature = "diagnostics-serde", derive(serde::Serialize))]
148#[derive(Clone, Copy, Debug, Default, Hash, PartialEq, Eq)]
149pub enum MemoryAction {
150    #[default]
151    None,
152    EnforceBudget,
153    Trim {
154        scope: CacheScope,
155        target_bytes: usize,
156    },
157}
158
159#[derive(Clone, Debug, Hash, PartialEq, Eq)]
160pub struct CacheKey {
161    pub namespace: String,
162    pub key: String,
163    pub version: u64,
164}
165
166impl CacheKey {
167    pub fn new(namespace: impl Into<String>, key: impl Into<String>, version: u64) -> Self {
168        Self {
169            namespace: namespace.into(),
170            key: key.into(),
171            version,
172        }
173    }
174}