mirror of
https://github.com/gfx-rs/wgpu.git
synced 2025-02-16 08:53:20 +00:00
make resource metadata generic over a T: Clone
This commit is contained in:
parent
0e1c1f7c07
commit
a270577dc4
@ -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) };
|
||||
|
@ -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 } => {
|
||||
|
@ -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> {
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user