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 INSTANCE_DEVICES "InstanceDevices" followed by {
110 DEVICE_SNATCHABLE_LOCK,
111 QUEUE_PENDING_WRITES,
112 DEVICE_TRACKERS,
113 QUEUE_LIFE_TRACKER,
114 BUFFER_BIND_GROUPS,
115 DEVICE_TRACE,
116 TEXTURE_BIND_GROUPS,
117 TEXTURE_CLEAR_MODE,
118 TEXTURE_VIEWS,
119 DEVICE_DEFERRED_DESTROY,
120 DEVICE_LOST_CLOSURE,
121 }
122 rank DEVICE_SNATCHABLE_LOCK "Device::snatchable_lock" followed by {
123 BUFFER_MAP_STATE,
124 COMMAND_BUFFER_DATA,
125 DEVICE_COMMAND_INDICES,
126 QUEUE_PENDING_WRITES,
127 DEVICE_TRACKERS,
128 QUEUE_LIFE_TRACKER,
129 BLAS_COMPACTION_STATE,
130 COMMAND_ALLOCATOR_FREE_ENCODERS,
131 BUFFER_BIND_GROUPS,
132 BUFFER_INITIALIZATION_STATUS,
133 BUFFER_POOL,
134 DEVICE_LOST_CLOSURE,
135 DEVICE_TRACE,
136 DEVICE_USAGE_SCOPES,
137 QUERY_SET_INITIALIZED_SLOTS,
138 SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
139 TEXTURE_BIND_GROUPS,
140 TEXTURE_CLEAR_MODE,
141 TEXTURE_INITIALIZATION_STATUS,
142 TEXTURE_VIEWS,
143 }
144 rank DEVICE_COMMAND_INDICES "Device::command_indices" followed by {
145 COMMAND_BUFFER_DATA,
146 BUFFER_MAP_STATE,
147 BUFFER_POOL,
148 DEVICE_TRACKERS,
149 QUEUE_PENDING_WRITES,
150 QUEUE_LIFE_TRACKER,
151 BLAS_COMPACTION_STATE,
152 BLAS_BUILT_INDEX,
153 COMMAND_ALLOCATOR_FREE_ENCODERS,
154 DEVICE_DEFERRED_DESTROY,
155 DEVICE_TRACE,
156 QUERY_SET_INITIALIZED_SLOTS,
157 RESOURCE_POOL_INNER,
158 SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
159 TEXTURE_CLEAR_MODE,
160 TLAS_BUILT_INDEX,
161 TLAS_DEPENDENCIES,
162 }
163 rank COMMAND_BUFFER_DATA "CommandBuffer::data" followed by {
164 BUFFER_MAP_STATE,
165 COMMAND_ALLOCATOR_FREE_ENCODERS,
166 BLAS_COMPACTION_STATE,
167 BUFFER_POOL,
168 DEVICE_TRACE,
169 DEVICE_USAGE_SCOPES,
170 SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
171 }
172 rank QUEUE_PENDING_WRITES "Queue::pending_writes" followed by {
173 BUFFER_MAP_STATE,
174 DEVICE_TRACKERS,
175 COMMAND_ALLOCATOR_FREE_ENCODERS,
176 BUFFER_INITIALIZATION_STATUS,
177 TEXTURE_INITIALIZATION_STATUS,
178 SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
179 }
180 rank DEVICE_TRACKERS "Device::trackers" followed by {
181 BUFFER_BIND_GROUPS,
182 BUFFER_INITIALIZATION_STATUS,
183 DEVICE_DEFERRED_DESTROY,
184 TEXTURE_BIND_GROUPS,
185 TEXTURE_CLEAR_MODE,
186 TEXTURE_INITIALIZATION_STATUS,
187 TEXTURE_VIEWS,
188 }
189 rank QUEUE_LIFE_TRACKER "Queue::life_tracker" followed by {
190 BLAS_COMPACTION_STATE,
191 BUFFER_MAP_STATE,
192 COMMAND_ALLOCATOR_FREE_ENCODERS,
193 BUFFER_INITIALIZATION_STATUS,
194 BUFFER_POOL,
195 DEVICE_DEFERRED_DESTROY,
196 DEVICE_TRACE,
197 RESOURCE_POOL_INNER,
198 SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
199 TEXTURE_CLEAR_MODE,
200 }
201 rank BLAS_COMPACTION_STATE "Blas::compaction_state" followed by {
202 BLAS_BUILT_INDEX,
203 }
204 rank BUFFER_MAP_STATE "Buffer::map_state" followed by {
205 BUFFER_INITIALIZATION_STATUS,
206 DEVICE_TRACE,
207 SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
208 }
209 rank COMMAND_ALLOCATOR_FREE_ENCODERS "CommandAllocator::free_encoders" followed by {
210 SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
211 }
212 rank TLAS_BUILT_INDEX "Tlas::built_index" followed by {
213 TLAS_DEPENDENCIES,
214 }
215 rank TLAS_DEPENDENCIES "Tlas::dependencies" followed by {
216 BLAS_BUILT_INDEX,
217 }
218
219 rank BLAS_BUILT_INDEX "Blas::built_index" followed by { }
221 rank BUFFER_BIND_GROUPS "Buffer::bind_groups" followed by { }
222 rank BUFFER_INITIALIZATION_STATUS "Buffer::initialization_status" followed by { }
223 rank BUFFER_POOL "BufferPool::buffers" followed by { }
224 rank DEVICE_DEFERRED_DESTROY "Device::deferred_destroy" followed by { }
225 rank DEVICE_LOST_CLOSURE "Device::device_lost_closure" followed by { }
226 rank DEVICE_TRACE "Device::trace" followed by { }
227 rank DEVICE_USAGE_SCOPES "Device::usage_scopes" followed by { }
228 rank QUERY_SET_INITIALIZED_SLOTS "QuerySet::initialized_slots" followed by { }
229 rank RESOURCE_POOL_INNER "ResourcePool::inner" followed by { }
230 rank SHARED_TRACKER_INDEX_ALLOCATOR_INNER "SharedTrackerIndexAllocator::inner" followed by { }
231 rank TEXTURE_BIND_GROUPS "Texture::bind_groups" followed by { }
232 rank TEXTURE_CLEAR_MODE "Texture::clear_mode" followed by { }
233 rank TEXTURE_INITIALIZATION_STATUS "Texture::initialization_status" followed by { }
234 rank TEXTURE_VIEWS "Texture::views" followed by { }
235
236 rank SURFACE_PRESENTATION "Surface::presentation" followed by { }
238
239 #[cfg(test)]
240 rank PAWN "pawn" followed by { ROOK, BISHOP }
241 #[cfg(test)]
242 rank ROOK "rook" followed by { KNIGHT }
243 #[cfg(test)]
244 rank KNIGHT "knight" followed by { }
245 #[cfg(test)]
246 rank BISHOP "bishop" followed by { }
247}