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_FENCE,
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_FENCE "Device::fence" followed by {
140 DEVICE_COMMAND_INDICES,
141 QUEUE_LIFE_TRACKER,
142 }
143 rank DEVICE_COMMAND_INDICES "Device::command_indices" followed by {
144 BUFFER_POOL,
145 QUEUE_PENDING_WRITES,
146 QUEUE_LIFE_TRACKER,
147 COMMAND_ALLOCATOR_FREE_ENCODERS,
148 DEVICE_DEFERRED_DESTROY,
149 SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
150 }
151 rank QUEUE_PENDING_WRITES "Queue::pending_writes" followed by {
152 BUFFER_MAP_STATE,
153 DEVICE_TRACKERS,
154 COMMAND_ALLOCATOR_FREE_ENCODERS,
155 BUFFER_INITIALIZATION_STATUS,
156 TEXTURE_INITIALIZATION_STATUS,
157 SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
158 }
159 rank TEXTURE_INITIALIZATION_STATUS "Texture::initialization_status" followed by {
160 DEVICE_TRACKERS,
161 }
162 rank DEVICE_TRACKERS "Device::trackers" followed by {
163 TEXTURE_CLEAR_MODE,
164 }
165 rank QUEUE_LIFE_TRACKER "Queue::life_tracker" followed by {
166 BUFFER_MAP_STATE,
167 BUFFER_INITIALIZATION_STATUS,
168 BUFFER_POOL,
169 COMMAND_ALLOCATOR_FREE_ENCODERS,
170 DEVICE_DEFERRED_DESTROY,
171 DEVICE_TRACE,
172 SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
173 }
174 rank BUFFER_MAP_STATE "Buffer::map_state" followed by {
175 DEVICE_TRACE,
176 SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
177 }
178 rank COMMAND_ALLOCATOR_FREE_ENCODERS "CommandAllocator::free_encoders" followed by {
179 SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
180 }
181
182 rank BLAS_COMPACTION_STATE "Blas::compaction_state" followed by { }
184 rank BUFFER_BIND_GROUPS "Buffer::bind_groups" followed by { }
185 rank BUFFER_INITIALIZATION_STATUS "Buffer::initialization_status" followed by { }
186 rank BUFFER_POOL "BufferPool::buffers" followed by { }
187 rank DEVICE_DEFERRED_DESTROY "Device::deferred_destroy" followed by { }
188 rank DEVICE_TRACE "Device::trace" followed by { }
189 rank DEVICE_USAGE_SCOPES "Device::usage_scopes" followed by { }
190 rank REGISTRY_STORAGE "Registry::storage" followed by { }
191 rank SHARED_TRACKER_INDEX_ALLOCATOR_INNER "SharedTrackerIndexAllocator::inner" followed by { }
192 rank TEXTURE_BIND_GROUPS "Texture::bind_groups" followed by { }
193 rank TEXTURE_CLEAR_MODE "Texture::clear_mode" followed by { }
194 rank TEXTURE_VIEWS "Texture::views" followed by { }
195
196 rank BLAS_BUILT_INDEX "Blas::built_index" followed by { }
198 rank DEVICE_LOST_CLOSURE "Device::device_lost_closure" followed by { }
199 rank IDENTITY_MANAGER_VALUES "IdentityManager::values" followed by { }
200 rank RESOURCE_POOL_INNER "ResourcePool::inner" followed by { }
201 rank SURFACE_PRESENTATION "Surface::presentation" followed by { }
202 rank TLAS_BUILT_INDEX "Tlas::built_index" followed by { }
203 rank TLAS_DEPENDENCIES "Tlas::dependencies" followed by { }
204
205 #[cfg(test)]
206 rank PAWN "pawn" followed by { ROOK, BISHOP }
207 #[cfg(test)]
208 rank ROOK "rook" followed by { KNIGHT }
209 #[cfg(test)]
210 rank KNIGHT "knight" followed by { }
211 #[cfg(test)]
212 rank BISHOP "bishop" followed by { }
213}