#[derive(Debug, Copy, Clone)]
pub struct LockRank {
pub(super) bit: LockRankSet,
pub(super) followers: LockRankSet,
}
macro_rules! define_lock_ranks {
{
$(
$( #[ $attr:meta ] )*
rank $name:ident $member:literal followed by { $( $follower:ident ),* $(,)? }
)*
} => {
#[allow(non_camel_case_types, clippy::upper_case_acronyms)]
enum LockRankNumber { $( $name, )* }
bitflags::bitflags! {
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub struct LockRankSet: u64 {
$(
const $name = 1 << (LockRankNumber:: $name as u64);
)*
}
}
impl LockRankSet {
pub fn member_name(self) -> &'static str {
match self {
$(
LockRankSet:: $name => $member,
)*
_ => "<unrecognized LockRankSet bit>",
}
}
#[cfg_attr(not(feature = "observe_locks"), allow(dead_code))]
pub fn const_name(self) -> &'static str {
match self {
$(
LockRankSet:: $name => stringify!($name),
)*
_ => "<unrecognized LockRankSet bit>",
}
}
}
$(
$( #[ $attr ] )*
pub const $name: LockRank = LockRank {
bit: LockRankSet:: $name,
followers: LockRankSet::empty() $( .union($follower.bit) )*,
};
)*
}
}
define_lock_ranks! {
rank COMMAND_BUFFER_DATA "CommandBuffer::data" followed by {
DEVICE_SNATCHABLE_LOCK,
BUFFER_MAP_STATE,
COMMAND_ALLOCATOR_FREE_ENCODERS,
BUFFER_POOL,
DEVICE_TRACE,
DEVICE_USAGE_SCOPES,
HUB_OTHER,
SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
}
rank DEVICE_SNATCHABLE_LOCK "Device::snatchable_lock" followed by {
BUFFER_MAP_STATE,
DEVICE_COMMAND_INDICES,
QUEUE_PENDING_WRITES,
TEXTURE_INITIALIZATION_STATUS,
QUEUE_LIFE_TRACKER,
BLAS_COMPACTION_STATE,
BUFFER_BIND_GROUPS,
BUFFER_INITIALIZATION_STATUS,
BUFFER_POOL,
DEVICE_TRACE,
DEVICE_USAGE_SCOPES,
HUB_OTHER,
SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
TEXTURE_BIND_GROUPS,
TEXTURE_CLEAR_MODE,
TEXTURE_VIEWS,
QUERY_SET_INITIALIZED_SLOTS,
}
rank DEVICE_COMMAND_INDICES "Device::command_indices" followed by {
BUFFER_POOL,
QUEUE_PENDING_WRITES,
QUEUE_LIFE_TRACKER,
COMMAND_ALLOCATOR_FREE_ENCODERS,
DEVICE_DEFERRED_DESTROY,
SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
}
rank QUEUE_PENDING_WRITES "Queue::pending_writes" followed by {
BUFFER_MAP_STATE,
DEVICE_TRACKERS,
COMMAND_ALLOCATOR_FREE_ENCODERS,
BUFFER_INITIALIZATION_STATUS,
TEXTURE_INITIALIZATION_STATUS,
SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
}
rank TEXTURE_INITIALIZATION_STATUS "Texture::initialization_status" followed by {
DEVICE_TRACKERS,
}
rank DEVICE_TRACKERS "Device::trackers" followed by {
TEXTURE_CLEAR_MODE,
}
rank QUEUE_LIFE_TRACKER "Queue::life_tracker" followed by {
BUFFER_MAP_STATE,
BUFFER_INITIALIZATION_STATUS,
BUFFER_POOL,
COMMAND_ALLOCATOR_FREE_ENCODERS,
DEVICE_DEFERRED_DESTROY,
DEVICE_TRACE,
SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
}
rank BUFFER_MAP_STATE "Buffer::map_state" followed by {
DEVICE_TRACE,
SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
}
rank COMMAND_ALLOCATOR_FREE_ENCODERS "CommandAllocator::free_encoders" followed by {
SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
}
rank HUB_OTHER "Hub (general)" followed by {
HUB_TEXTURE_VIEWS,
HUB_BIND_GROUPS,
}
rank HUB_BIND_GROUPS "Hub::bind_groups" followed by {
HUB_RENDER_PIPELINES,
}
rank HUB_RENDER_PIPELINES "Hub::render_pipelines" followed by {
SHARED_TRACKER_INDEX_ALLOCATOR_INNER,
}
rank HUB_TEXTURE_VIEWS "Hub::texture_views" followed by {
HUB_SAMPLERS,
}
rank HUB_SAMPLERS "Hub::samplers" followed by {
HUB_TLAS,
}
rank HUB_TLAS "Hub::tlas" followed by {
HUB_EXTERNAL_TEXTURES,
}
rank BLAS_COMPACTION_STATE "Blas::compaction_state" followed by { }
rank BUFFER_BIND_GROUPS "Buffer::bind_groups" followed by { }
rank BUFFER_INITIALIZATION_STATUS "Buffer::initialization_status" followed by { }
rank BUFFER_POOL "BufferPool::buffers" followed by { }
rank DEVICE_DEFERRED_DESTROY "Device::deferred_destroy" followed by { }
rank DEVICE_TRACE "Device::trace" followed by { }
rank DEVICE_USAGE_SCOPES "Device::usage_scopes" followed by { }
rank HUB_EXTERNAL_TEXTURES "Hub::external_textures" followed by { }
rank SHARED_TRACKER_INDEX_ALLOCATOR_INNER "SharedTrackerIndexAllocator::inner" followed by { }
rank QUERY_SET_INITIALIZED_SLOTS "QuerySet::initialized_slots" followed by { }
rank TEXTURE_BIND_GROUPS "Texture::bind_groups" followed by { }
rank TEXTURE_CLEAR_MODE "Texture::clear_mode" followed by { }
rank TEXTURE_VIEWS "Texture::views" followed by { }
rank BLAS_BUILT_INDEX "Blas::built_index" followed by { }
rank DEVICE_LOST_CLOSURE "Device::device_lost_closure" followed by { }
rank IDENTITY_MANAGER_VALUES "IdentityManager::values" followed by { }
rank RESOURCE_POOL_INNER "ResourcePool::inner" followed by { }
rank SURFACE_PRESENTATION "Surface::presentation" followed by { }
rank TLAS_BUILT_INDEX "Tlas::built_index" followed by { }
rank TLAS_DEPENDENCIES "Tlas::dependencies" followed by { }
#[cfg(test)]
rank PAWN "pawn" followed by { ROOK, BISHOP }
#[cfg(test)]
rank ROOK "rook" followed by { KNIGHT }
#[cfg(test)]
rank KNIGHT "knight" followed by { }
#[cfg(test)]
rank BISHOP "bishop" followed by { }
}