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}