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

View File

@ -1,7 +1,7 @@
//! The `ResourceMetadata` type.
use bit_vec::BitVec;
use std::{mem, sync::Arc};
use std::mem;
use wgt::strict_assert;
/// 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
/// only occupied elements.
#[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`.
owned: BitVec<usize>,
/// 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 {
Self {
owned: BitVec::default(),
@ -94,7 +94,7 @@ impl<T> ResourceMetadata<T> {
/// The given `index` must be in bounds for this `ResourceMetadata`'s
/// existing tables. See `tracker_assert_in_bounds`.
#[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);
let resource_dst = unsafe { self.resources.get_unchecked_mut(index) };
resource_dst.insert(resource)
@ -107,7 +107,7 @@ impl<T> ResourceMetadata<T> {
/// The given `index` must be in bounds for this `ResourceMetadata`'s
/// existing tables. See `tracker_assert_in_bounds`.
#[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 {
self.resources
.get_unchecked(index)
@ -117,7 +117,7 @@ impl<T> ResourceMetadata<T> {
}
/// 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() {
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
/// 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.
Direct { resource: &'a Arc<T> },
Direct { resource: &'a T },
/// Comes from another metadata tracker.
Indirect { metadata: &'a ResourceMetadata<T> },
}
impl<T> ResourceMetadataProvider<'_, T> {
impl<T: Clone> ResourceMetadataProvider<'_, T> {
/// Get a reference to the resource from this.
///
/// # Safety
///
/// - The index must be in bounds of the metadata tracker if this uses an indirect source.
#[inline(always)]
pub(super) unsafe fn get(&self, index: usize) -> &Arc<T> {
pub(super) unsafe fn get(&self, index: usize) -> &T {
match self {
ResourceMetadataProvider::Direct { resource } => resource,
ResourceMetadataProvider::Indirect { metadata } => {

View File

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

View File

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