1#[derive(Debug, Copy, Clone)]
34pub struct LockRank {
35 pub(super) bit: LockRankSet,
39
40 pub(super) followers: LockRankSet,
49}
50
51macro_rules! define_lock_ranks {
53 {
54 $(
55 $( #[ $attr:meta ] )*
56 rank $name:ident $member:literal followed by { $( $follower:ident ),* $(,)? }
57 )*
58 } => {
59 #[allow(non_camel_case_types, clippy::upper_case_acronyms)]
61 enum LockRankNumber { $( $name, )* }
62
63 bitflags::bitflags! {
64 #[derive(Debug, Copy, Clone, Eq, PartialEq)]
65 pub struct LockRankSet: u64 {
67 $(
68 const $name = 1 << (LockRankNumber:: $name as u64);
69 )*
70 }
71 }
72
73 impl LockRankSet {
74 pub fn member_name(self) -> &'static str {
75 match self {
76 $(
77 LockRankSet:: $name => $member,
78 )*
79 _ => "<unrecognized LockRankSet bit>",
80 }
81 }
82
83 #[cfg_attr(not(feature = "observe_locks"), allow(dead_code))]
84 pub fn const_name(self) -> &'static str {
85 match self {
86 $(
87 LockRankSet:: $name => stringify!($name),
88 )*
89 _ => "<unrecognized LockRankSet bit>",
90 }
91 }
92 }
93
94 $(
95 $( #[ $attr ] )*
99 pub const $name: LockRank = LockRank {
100 bit: LockRankSet:: $name,
101 followers: LockRankSet::empty() $( .union($follower.bit) )*,
102 };
103 )*
104 }
105}
106
107define_lock_ranks! {
108 rank COMMAND_BUFFER_DATA "CommandBuffer::data" followed by {
110 DEVICE_SNATCHABLE_LOCK,
111 BUFFER_MAP_STATE,
112 COMMAND_ALLOCATOR_FREE_ENCODERS,
113 BUFFER_POOL,
114 DEVICE_TRACE,
115 DEVICE_USAGE_SCOPES,
116 REGISTRY_STORAGE,
117 SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
118 }
119 rank DEVICE_SNATCHABLE_LOCK "Device::snatchable_lock" followed by {
120 BUFFER_MAP_STATE,
121 DEVICE_COMMAND_INDICES,
122 QUEUE_PENDING_WRITES,
123 TEXTURE_INITIALIZATION_STATUS,
124 QUEUE_LIFE_TRACKER,
125 BLAS_COMPACTION_STATE,
126 BUFFER_BIND_GROUPS,
127 BUFFER_INITIALIZATION_STATUS,
128 BUFFER_POOL,
129 DEVICE_TRACE,
130 DEVICE_USAGE_SCOPES,
131 REGISTRY_STORAGE,
132 SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
133 TEXTURE_BIND_GROUPS,
134 TEXTURE_CLEAR_MODE,
135 TEXTURE_VIEWS,
136 }
139 rank DEVICE_COMMAND_INDICES "Device::command_indices" followed by {
140 BUFFER_POOL,
141 QUEUE_PENDING_WRITES,
142 QUEUE_LIFE_TRACKER,
143 COMMAND_ALLOCATOR_FREE_ENCODERS,
144 DEVICE_DEFERRED_DESTROY,
145 SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
146 }
147 rank QUEUE_PENDING_WRITES "Queue::pending_writes" followed by {
148 BUFFER_MAP_STATE,
149 DEVICE_TRACKERS,
150 COMMAND_ALLOCATOR_FREE_ENCODERS,
151 BUFFER_INITIALIZATION_STATUS,
152 TEXTURE_INITIALIZATION_STATUS,
153 SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
154 }
155 rank TEXTURE_INITIALIZATION_STATUS "Texture::initialization_status" followed by {
156 DEVICE_TRACKERS,
157 }
158 rank DEVICE_TRACKERS "Device::trackers" followed by {
159 TEXTURE_CLEAR_MODE,
160 }
161 rank QUEUE_LIFE_TRACKER "Queue::life_tracker" followed by {
162 BUFFER_MAP_STATE,
163 BUFFER_INITIALIZATION_STATUS,
164 BUFFER_POOL,
165 COMMAND_ALLOCATOR_FREE_ENCODERS,
166 DEVICE_DEFERRED_DESTROY,
167 DEVICE_TRACE,
168 SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
169 }
170 rank BUFFER_MAP_STATE "Buffer::map_state" followed by {
171 DEVICE_TRACE,
172 SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
173 }
174 rank COMMAND_ALLOCATOR_FREE_ENCODERS "CommandAllocator::free_encoders" followed by {
175 SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
176 }
177
178 rank BLAS_COMPACTION_STATE "Blas::compaction_state" followed by { }
180 rank BUFFER_BIND_GROUPS "Buffer::bind_groups" followed by { }
181 rank BUFFER_INITIALIZATION_STATUS "Buffer::initialization_status" followed by { }
182 rank BUFFER_POOL "BufferPool::buffers" followed by { }
183 rank DEVICE_DEFERRED_DESTROY "Device::deferred_destroy" followed by { }
184 rank DEVICE_TRACE "Device::trace" followed by { }
185 rank DEVICE_USAGE_SCOPES "Device::usage_scopes" followed by { }
186 rank REGISTRY_STORAGE "Registry::storage" followed by { }
187 rank SHARED_TRACKER_INDEX_ALLOCATOR_INNER "SharedTrackerIndexAllocator::inner" followed by { }
188 rank TEXTURE_BIND_GROUPS "Texture::bind_groups" followed by { }
189 rank TEXTURE_CLEAR_MODE "Texture::clear_mode" followed by { }
190 rank TEXTURE_VIEWS "Texture::views" followed by { }
191
192 rank BLAS_BUILT_INDEX "Blas::built_index" followed by { }
194 rank DEVICE_LOST_CLOSURE "Device::device_lost_closure" followed by { }
195 rank IDENTITY_MANAGER_VALUES "IdentityManager::values" followed by { }
196 rank RESOURCE_POOL_INNER "ResourcePool::inner" followed by { }
197 rank SURFACE_PRESENTATION "Surface::presentation" followed by { }
198 rank TLAS_BUILT_INDEX "Tlas::built_index" followed by { }
199 rank TLAS_DEPENDENCIES "Tlas::dependencies" followed by { }
200
201 #[cfg(test)]
202 rank PAWN "pawn" followed by { ROOK, BISHOP }
203 #[cfg(test)]
204 rank ROOK "rook" followed by { KNIGHT }
205 #[cfg(test)]
206 rank KNIGHT "knight" followed by { }
207 #[cfg(test)]
208 rank BISHOP "bishop" followed by { }
209}