1use hal::memory as m;
5
6#[derive(Debug, Clone, Copy, PartialEq)]
8pub enum MemoryUsage {
9 Private,
13 Dynamic {
18 sparse_updates: bool,
21 },
22 Staging {
26 read_back: bool,
28 },
29}
30
31impl MemoryUsage {
32 pub fn properties_required(self) -> m::Properties {
34 match self {
35 MemoryUsage::Private => m::Properties::DEVICE_LOCAL,
36 MemoryUsage::Dynamic { .. } | MemoryUsage::Staging { .. } => m::Properties::CPU_VISIBLE,
37 }
38 }
39
40 #[allow(clippy::identity_op)]
41 pub(crate) fn memory_fitness(self, properties: m::Properties) -> u32 {
42 match self {
43 MemoryUsage::Private => {
44 assert!(properties.contains(m::Properties::DEVICE_LOCAL));
45 0 | (!properties.contains(m::Properties::CPU_VISIBLE) as u32) << 3
46 | (!properties.contains(m::Properties::LAZILY_ALLOCATED) as u32) << 2
47 | (!properties.contains(m::Properties::CPU_CACHED) as u32) << 1
48 | (!properties.contains(m::Properties::COHERENT) as u32) << 0
49 }
50 MemoryUsage::Dynamic { sparse_updates } => {
51 assert!(properties.contains(m::Properties::CPU_VISIBLE));
52 assert!(!properties.contains(m::Properties::LAZILY_ALLOCATED));
53 0 | (properties.contains(m::Properties::DEVICE_LOCAL) as u32) << 2
54 | ((properties.contains(m::Properties::COHERENT) == sparse_updates) as u32) << 1
55 | (!properties.contains(m::Properties::CPU_CACHED) as u32) << 0
56 }
57 MemoryUsage::Staging { read_back } => {
58 assert!(properties.contains(m::Properties::CPU_VISIBLE));
59 assert!(!properties.contains(m::Properties::LAZILY_ALLOCATED));
60 0 | ((properties.contains(m::Properties::CPU_CACHED) == read_back) as u32) << 1
61 | (!properties.contains(m::Properties::DEVICE_LOCAL) as u32) << 0
62 }
63 }
64 }
65}