mirror of
https://github.com/gfx-rs/wgpu.git
synced 2025-12-08 21:26:17 +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)]
|
#[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) };
|
||||||
|
|||||||
@ -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 } => {
|
||||||
|
|||||||
@ -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> {
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user