1#[derive(Debug, Copy, Clone)]
26pub struct LockRank {
27 pub(super) bit: LockRankSet,
31
32 pub(super) followers: LockRankSet,
41}
42
43macro_rules! define_lock_ranks {
45 {
46 $(
47 $( #[ $attr:meta ] )*
48 rank $name:ident $member:literal followed by { $( $follower:ident ),* $(,)? }
49 )*
50 } => {
51 #[allow(non_camel_case_types, clippy::upper_case_acronyms)]
53 enum LockRankNumber { $( $name, )* }
54
55 bitflags::bitflags! {
56 #[derive(Debug, Copy, Clone, Eq, PartialEq)]
57 pub struct LockRankSet: u64 {
59 $(
60 const $name = 1 << (LockRankNumber:: $name as u64);
61 )*
62 }
63 }
64
65 impl LockRankSet {
66 pub fn member_name(self) -> &'static str {
67 match self {
68 $(
69 LockRankSet:: $name => $member,
70 )*
71 _ => "<unrecognized LockRankSet bit>",
72 }
73 }
74
75 #[cfg_attr(not(feature = "observe_locks"), allow(dead_code))]
76 pub fn const_name(self) -> &'static str {
77 match self {
78 $(
79 LockRankSet:: $name => stringify!($name),
80 )*
81 _ => "<unrecognized LockRankSet bit>",
82 }
83 }
84 }
85
86 $(
87 $( #[ $attr ] )*
91 pub const $name: LockRank = LockRank {
92 bit: LockRankSet:: $name,
93 followers: LockRankSet::empty() $( .union($follower.bit) )*,
94 };
95 )*
96 }
97}
98
99define_lock_ranks! {
100 rank COMMAND_BUFFER_DATA "CommandBuffer::data" followed by {
101 DEVICE_SNATCHABLE_LOCK,
102 DEVICE_USAGE_SCOPES,
103 SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
104 BUFFER_MAP_STATE,
105 }
106 rank DEVICE_SNATCHABLE_LOCK "Device::snatchable_lock" followed by {
107 SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
108 DEVICE_TRACE,
109 BUFFER_MAP_STATE,
110 }
113 rank BUFFER_MAP_STATE "Buffer::map_state" followed by {
114 QUEUE_PENDING_WRITES,
115 SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
116 DEVICE_TRACE,
117 }
118 rank QUEUE_PENDING_WRITES "Queue::pending_writes" followed by {
119 COMMAND_ALLOCATOR_FREE_ENCODERS,
120 SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
121 QUEUE_LIFE_TRACKER,
122 }
123 rank QUEUE_LIFE_TRACKER "Queue::life_tracker" followed by {
124 COMMAND_ALLOCATOR_FREE_ENCODERS,
125 DEVICE_TRACE,
126 }
127 rank COMMAND_ALLOCATOR_FREE_ENCODERS "CommandAllocator::free_encoders" followed by {
128 SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
129 }
130
131 rank BUFFER_BIND_GROUPS "Buffer::bind_groups" followed by { }
132 rank BUFFER_INITIALIZATION_STATUS "Buffer::initialization_status" followed by { }
133 rank DEVICE_COMMAND_INDICES "Device::command_indices" followed by {}
134 rank DEVICE_DEFERRED_DESTROY "Device::deferred_destroy" followed by {}
135 rank DEVICE_FENCE "Device::fence" followed by { }
136 #[allow(dead_code)]
137 rank DEVICE_TRACE "Device::trace" followed by { }
138 rank DEVICE_TRACKERS "Device::trackers" followed by { }
139 rank DEVICE_LOST_CLOSURE "Device::device_lost_closure" followed by { }
140 rank DEVICE_USAGE_SCOPES "Device::usage_scopes" followed by { }
141 rank IDENTITY_MANAGER_VALUES "IdentityManager::values" followed by { }
142 rank REGISTRY_STORAGE "Registry::storage" followed by { }
143 rank RESOURCE_POOL_INNER "ResourcePool::inner" followed by { }
144 rank SHARED_TRACKER_INDEX_ALLOCATOR_INNER "SharedTrackerIndexAllocator::inner" followed by { }
145 rank SURFACE_PRESENTATION "Surface::presentation" followed by { }
146 rank TEXTURE_BIND_GROUPS "Texture::bind_groups" followed by { }
147 rank TEXTURE_INITIALIZATION_STATUS "Texture::initialization_status" followed by { }
148 rank TEXTURE_CLEAR_MODE "Texture::clear_mode" followed by { }
149 rank TEXTURE_VIEWS "Texture::views" followed by { }
150 rank BLAS_BUILT_INDEX "Blas::built_index" followed by { }
151 rank BLAS_COMPACTION_STATE "Blas::compaction_size" followed by { }
152 rank TLAS_BUILT_INDEX "Tlas::built_index" followed by { }
153 rank TLAS_DEPENDENCIES "Tlas::dependencies" followed by { }
154 rank BUFFER_POOL "BufferPool::buffers" followed by { }
155
156 #[cfg(test)]
157 rank PAWN "pawn" followed by { ROOK, BISHOP }
158 #[cfg(test)]
159 rank ROOK "rook" followed by { KNIGHT }
160 #[cfg(test)]
161 rank KNIGHT "knight" followed by { }
162 #[cfg(test)]
163 rank BISHOP "bishop" followed by { }
164}