make resource metadata generic over a T: Clone

This commit is contained in:
teoxoy 2024-07-04 19:07:20 +02:00 committed by Teodor Tanasoaia
parent 0e1c1f7c07
commit a270577dc4
4 changed files with 30 additions and 30 deletions

View File

@ -87,7 +87,7 @@ impl<A: HalApi> BufferBindGroupState<A> {
#[derive(Debug)] #[derive(Debug)]
pub(crate) struct BufferUsageScope<A: HalApi> { pub(crate) struct BufferUsageScope<A: HalApi> {
state: Vec<BufferUses>, state: Vec<BufferUses>,
metadata: ResourceMetadata<Buffer<A>>, metadata: ResourceMetadata<Arc<Buffer<A>>>,
} }
impl<A: HalApi> Default for BufferUsageScope<A> { impl<A: HalApi> Default for BufferUsageScope<A> {
@ -240,7 +240,7 @@ pub(crate) struct BufferTracker<A: HalApi> {
start: Vec<BufferUses>, start: Vec<BufferUses>,
end: Vec<BufferUses>, end: Vec<BufferUses>,
metadata: ResourceMetadata<Buffer<A>>, metadata: ResourceMetadata<Arc<Buffer<A>>>,
temp: Vec<PendingTransition<BufferUses>>, temp: Vec<PendingTransition<BufferUses>>,
} }
@ -552,11 +552,11 @@ impl BufferStateProvider<'_> {
unsafe fn insert_or_merge<A: HalApi>( unsafe fn insert_or_merge<A: HalApi>(
start_states: Option<&mut [BufferUses]>, start_states: Option<&mut [BufferUses]>,
current_states: &mut [BufferUses], current_states: &mut [BufferUses],
resource_metadata: &mut ResourceMetadata<Buffer<A>>, resource_metadata: &mut ResourceMetadata<Arc<Buffer<A>>>,
index32: u32, index32: u32,
index: usize, index: usize,
state_provider: BufferStateProvider<'_>, state_provider: BufferStateProvider<'_>,
metadata_provider: ResourceMetadataProvider<'_, Buffer<A>>, metadata_provider: ResourceMetadataProvider<'_, Arc<Buffer<A>>>,
) -> Result<(), ResourceUsageCompatibilityError> { ) -> Result<(), ResourceUsageCompatibilityError> {
let currently_owned = unsafe { resource_metadata.contains_unchecked(index) }; let currently_owned = unsafe { resource_metadata.contains_unchecked(index) };
@ -607,11 +607,11 @@ unsafe fn insert_or_merge<A: HalApi>(
unsafe fn insert_or_barrier_update<A: HalApi>( unsafe fn insert_or_barrier_update<A: HalApi>(
start_states: Option<&mut [BufferUses]>, start_states: Option<&mut [BufferUses]>,
current_states: &mut [BufferUses], current_states: &mut [BufferUses],
resource_metadata: &mut ResourceMetadata<Buffer<A>>, resource_metadata: &mut ResourceMetadata<Arc<Buffer<A>>>,
index: usize, index: usize,
start_state_provider: BufferStateProvider<'_>, start_state_provider: BufferStateProvider<'_>,
end_state_provider: Option<BufferStateProvider<'_>>, end_state_provider: Option<BufferStateProvider<'_>>,
metadata_provider: ResourceMetadataProvider<'_, Buffer<A>>, metadata_provider: ResourceMetadataProvider<'_, Arc<Buffer<A>>>,
barriers: &mut Vec<PendingTransition<BufferUses>>, barriers: &mut Vec<PendingTransition<BufferUses>>,
) { ) {
let currently_owned = unsafe { resource_metadata.contains_unchecked(index) }; let currently_owned = unsafe { resource_metadata.contains_unchecked(index) };
@ -641,11 +641,11 @@ unsafe fn insert_or_barrier_update<A: HalApi>(
unsafe fn insert<A: HalApi>( unsafe fn insert<A: HalApi>(
start_states: Option<&mut [BufferUses]>, start_states: Option<&mut [BufferUses]>,
current_states: &mut [BufferUses], current_states: &mut [BufferUses],
resource_metadata: &mut ResourceMetadata<Buffer<A>>, resource_metadata: &mut ResourceMetadata<Arc<Buffer<A>>>,
index: usize, index: usize,
start_state_provider: BufferStateProvider<'_>, start_state_provider: BufferStateProvider<'_>,
end_state_provider: Option<BufferStateProvider<'_>>, end_state_provider: Option<BufferStateProvider<'_>>,
metadata_provider: ResourceMetadataProvider<'_, Buffer<A>>, metadata_provider: ResourceMetadataProvider<'_, Arc<Buffer<A>>>,
) { ) {
let new_start_state = unsafe { start_state_provider.get_state(index) }; let new_start_state = unsafe { start_state_provider.get_state(index) };
let new_end_state = let new_end_state =
@ -675,7 +675,7 @@ unsafe fn merge<A: HalApi>(
index32: u32, index32: u32,
index: usize, index: usize,
state_provider: BufferStateProvider<'_>, state_provider: BufferStateProvider<'_>,
metadata_provider: ResourceMetadataProvider<'_, Buffer<A>>, metadata_provider: ResourceMetadataProvider<'_, Arc<Buffer<A>>>,
) -> Result<(), ResourceUsageCompatibilityError> { ) -> Result<(), ResourceUsageCompatibilityError> {
let current_state = unsafe { current_states.get_unchecked_mut(index) }; let current_state = unsafe { current_states.get_unchecked_mut(index) };
let new_state = unsafe { state_provider.get_state(index) }; let new_state = unsafe { state_provider.get_state(index) };

View File

@ -1,7 +1,7 @@
//! The `ResourceMetadata` type. //! The `ResourceMetadata` type.
use bit_vec::BitVec; use bit_vec::BitVec;
use std::{mem, sync::Arc}; use std::mem;
use wgt::strict_assert; use wgt::strict_assert;
/// A set of resources, holding a `Arc<T>` and epoch for each member. /// A set of resources, holding a `Arc<T>` and epoch for each member.
@ -12,15 +12,15 @@ use wgt::strict_assert;
/// members, but a bit vector tracks occupancy, so iteration touches /// members, but a bit vector tracks occupancy, so iteration touches
/// only occupied elements. /// only occupied elements.
#[derive(Debug)] #[derive(Debug)]
pub(super) struct ResourceMetadata<T> { pub(super) struct ResourceMetadata<T: Clone> {
/// If the resource with index `i` is a member, `owned[i]` is `true`. /// If the resource with index `i` is a member, `owned[i]` is `true`.
owned: BitVec<usize>, owned: BitVec<usize>,
/// A vector holding clones of members' `T`s. /// A vector holding clones of members' `T`s.
resources: Vec<Option<Arc<T>>>, resources: Vec<Option<T>>,
} }
impl<T> ResourceMetadata<T> { impl<T: Clone> ResourceMetadata<T> {
pub(super) fn new() -> Self { pub(super) fn new() -> Self {
Self { Self {
owned: BitVec::default(), owned: BitVec::default(),
@ -94,7 +94,7 @@ impl<T> ResourceMetadata<T> {
/// The given `index` must be in bounds for this `ResourceMetadata`'s /// The given `index` must be in bounds for this `ResourceMetadata`'s
/// existing tables. See `tracker_assert_in_bounds`. /// existing tables. See `tracker_assert_in_bounds`.
#[inline(always)] #[inline(always)]
pub(super) unsafe fn insert(&mut self, index: usize, resource: Arc<T>) -> &Arc<T> { pub(super) unsafe fn insert(&mut self, index: usize, resource: T) -> &T {
self.owned.set(index, true); self.owned.set(index, true);
let resource_dst = unsafe { self.resources.get_unchecked_mut(index) }; let resource_dst = unsafe { self.resources.get_unchecked_mut(index) };
resource_dst.insert(resource) resource_dst.insert(resource)
@ -107,7 +107,7 @@ impl<T> ResourceMetadata<T> {
/// The given `index` must be in bounds for this `ResourceMetadata`'s /// The given `index` must be in bounds for this `ResourceMetadata`'s
/// existing tables. See `tracker_assert_in_bounds`. /// existing tables. See `tracker_assert_in_bounds`.
#[inline(always)] #[inline(always)]
pub(super) unsafe fn get_resource_unchecked(&self, index: usize) -> &Arc<T> { pub(super) unsafe fn get_resource_unchecked(&self, index: usize) -> &T {
unsafe { unsafe {
self.resources self.resources
.get_unchecked(index) .get_unchecked(index)
@ -117,7 +117,7 @@ impl<T> ResourceMetadata<T> {
} }
/// Returns an iterator over the resources owned by `self`. /// Returns an iterator over the resources owned by `self`.
pub(super) fn owned_resources(&self) -> impl Iterator<Item = Arc<T>> + '_ { pub(super) fn owned_resources(&self) -> impl Iterator<Item = T> + '_ {
if !self.owned.is_empty() { if !self.owned.is_empty() {
self.tracker_assert_in_bounds(self.owned.len() - 1) self.tracker_assert_in_bounds(self.owned.len() - 1)
}; };
@ -148,20 +148,20 @@ impl<T> ResourceMetadata<T> {
/// ///
/// This is used to abstract over the various places /// This is used to abstract over the various places
/// trackers can get new resource metadata from. /// trackers can get new resource metadata from.
pub(super) enum ResourceMetadataProvider<'a, T> { pub(super) enum ResourceMetadataProvider<'a, T: Clone> {
/// Comes directly from explicit values. /// Comes directly from explicit values.
Direct { resource: &'a Arc<T> }, Direct { resource: &'a T },
/// Comes from another metadata tracker. /// Comes from another metadata tracker.
Indirect { metadata: &'a ResourceMetadata<T> }, Indirect { metadata: &'a ResourceMetadata<T> },
} }
impl<T> ResourceMetadataProvider<'_, T> { impl<T: Clone> ResourceMetadataProvider<'_, T> {
/// Get a reference to the resource from this. /// Get a reference to the resource from this.
/// ///
/// # Safety /// # Safety
/// ///
/// - The index must be in bounds of the metadata tracker if this uses an indirect source. /// - The index must be in bounds of the metadata tracker if this uses an indirect source.
#[inline(always)] #[inline(always)]
pub(super) unsafe fn get(&self, index: usize) -> &Arc<T> { pub(super) unsafe fn get(&self, index: usize) -> &T {
match self { match self {
ResourceMetadataProvider::Direct { resource } => resource, ResourceMetadataProvider::Direct { resource } => resource,
ResourceMetadataProvider::Indirect { metadata } => { ResourceMetadataProvider::Indirect { metadata } => {

View File

@ -50,7 +50,7 @@ impl<T: Trackable> StatelessBindGroupState<T> {
/// Stores all resource state within a command buffer or device. /// Stores all resource state within a command buffer or device.
#[derive(Debug)] #[derive(Debug)]
pub(crate) struct StatelessTracker<T: Trackable> { pub(crate) struct StatelessTracker<T: Trackable> {
metadata: ResourceMetadata<T>, metadata: ResourceMetadata<Arc<T>>,
} }
impl<T: Trackable> StatelessTracker<T> { impl<T: Trackable> StatelessTracker<T> {

View File

@ -220,7 +220,7 @@ impl TextureStateSet {
#[derive(Debug)] #[derive(Debug)]
pub(crate) struct TextureUsageScope<A: HalApi> { pub(crate) struct TextureUsageScope<A: HalApi> {
set: TextureStateSet, set: TextureStateSet,
metadata: ResourceMetadata<Texture<A>>, metadata: ResourceMetadata<Arc<Texture<A>>>,
} }
impl<A: HalApi> Default for TextureUsageScope<A> { impl<A: HalApi> Default for TextureUsageScope<A> {
@ -375,7 +375,7 @@ pub(crate) struct TextureTracker<A: HalApi> {
start_set: TextureStateSet, start_set: TextureStateSet,
end_set: TextureStateSet, end_set: TextureStateSet,
metadata: ResourceMetadata<Texture<A>>, metadata: ResourceMetadata<Arc<Texture<A>>>,
temp: Vec<PendingTransition<TextureUses>>, temp: Vec<PendingTransition<TextureUses>>,
@ -806,10 +806,10 @@ impl<'a> TextureStateProvider<'a> {
unsafe fn insert_or_merge<A: HalApi>( unsafe fn insert_or_merge<A: HalApi>(
texture_selector: &TextureSelector, texture_selector: &TextureSelector,
current_state_set: &mut TextureStateSet, current_state_set: &mut TextureStateSet,
resource_metadata: &mut ResourceMetadata<Texture<A>>, resource_metadata: &mut ResourceMetadata<Arc<Texture<A>>>,
index: usize, index: usize,
state_provider: TextureStateProvider<'_>, state_provider: TextureStateProvider<'_>,
metadata_provider: ResourceMetadataProvider<'_, Texture<A>>, metadata_provider: ResourceMetadataProvider<'_, Arc<Texture<A>>>,
) -> Result<(), ResourceUsageCompatibilityError> { ) -> Result<(), ResourceUsageCompatibilityError> {
let currently_owned = unsafe { resource_metadata.contains_unchecked(index) }; let currently_owned = unsafe { resource_metadata.contains_unchecked(index) };
@ -862,11 +862,11 @@ unsafe fn insert_or_barrier_update<A: HalApi>(
texture_selector: &TextureSelector, texture_selector: &TextureSelector,
start_state: Option<&mut TextureStateSet>, start_state: Option<&mut TextureStateSet>,
current_state_set: &mut TextureStateSet, current_state_set: &mut TextureStateSet,
resource_metadata: &mut ResourceMetadata<Texture<A>>, resource_metadata: &mut ResourceMetadata<Arc<Texture<A>>>,
index: usize, index: usize,
start_state_provider: TextureStateProvider<'_>, start_state_provider: TextureStateProvider<'_>,
end_state_provider: Option<TextureStateProvider<'_>>, end_state_provider: Option<TextureStateProvider<'_>>,
metadata_provider: ResourceMetadataProvider<'_, Texture<A>>, metadata_provider: ResourceMetadataProvider<'_, Arc<Texture<A>>>,
barriers: &mut Vec<PendingTransition<TextureUses>>, barriers: &mut Vec<PendingTransition<TextureUses>>,
) { ) {
let currently_owned = unsafe { resource_metadata.contains_unchecked(index) }; let currently_owned = unsafe { resource_metadata.contains_unchecked(index) };
@ -915,11 +915,11 @@ unsafe fn insert<A: HalApi>(
texture_selector: Option<&TextureSelector>, texture_selector: Option<&TextureSelector>,
start_state: Option<&mut TextureStateSet>, start_state: Option<&mut TextureStateSet>,
end_state: &mut TextureStateSet, end_state: &mut TextureStateSet,
resource_metadata: &mut ResourceMetadata<Texture<A>>, resource_metadata: &mut ResourceMetadata<Arc<Texture<A>>>,
index: usize, index: usize,
start_state_provider: TextureStateProvider<'_>, start_state_provider: TextureStateProvider<'_>,
end_state_provider: Option<TextureStateProvider<'_>>, end_state_provider: Option<TextureStateProvider<'_>>,
metadata_provider: ResourceMetadataProvider<'_, Texture<A>>, metadata_provider: ResourceMetadataProvider<'_, Arc<Texture<A>>>,
) { ) {
let start_layers = unsafe { start_state_provider.get_state(texture_selector, index) }; let start_layers = unsafe { start_state_provider.get_state(texture_selector, index) };
match start_layers { match start_layers {
@ -1002,7 +1002,7 @@ unsafe fn merge<A: HalApi>(
current_state_set: &mut TextureStateSet, current_state_set: &mut TextureStateSet,
index: usize, index: usize,
state_provider: TextureStateProvider<'_>, state_provider: TextureStateProvider<'_>,
metadata_provider: ResourceMetadataProvider<'_, Texture<A>>, metadata_provider: ResourceMetadataProvider<'_, Arc<Texture<A>>>,
) -> Result<(), ResourceUsageCompatibilityError> { ) -> Result<(), ResourceUsageCompatibilityError> {
let current_simple = unsafe { current_state_set.simple.get_unchecked_mut(index) }; let current_simple = unsafe { current_state_set.simple.get_unchecked_mut(index) };
let current_state = if *current_simple == TextureUses::COMPLEX { let current_state = if *current_simple == TextureUses::COMPLEX {