mirror of
https://github.com/gfx-rs/wgpu.git
synced 2026-04-22 03:02:01 -04:00
[core] Make insert_or_barrier_update a method of BufferTracker.
Change `wgpu_core::track::buffer::insert_or_barrier_update` into a method of `BufferTracker`, and replace four arguments with `self`.
This commit is contained in:
committed by
Connor Fitzgerald
parent
170f457f71
commit
eaa5fea40d
@@ -310,15 +310,11 @@ impl BufferTracker {
|
||||
self.tracker_assert_in_bounds(index);
|
||||
|
||||
unsafe {
|
||||
insert_or_barrier_update(
|
||||
Some(&mut self.start),
|
||||
&mut self.end,
|
||||
&mut self.metadata,
|
||||
self.insert_or_barrier_update(
|
||||
index,
|
||||
BufferStateProvider::Direct { state },
|
||||
None,
|
||||
ResourceMetadataProvider::Direct { resource: buffer },
|
||||
&mut self.temp,
|
||||
)
|
||||
};
|
||||
|
||||
@@ -345,10 +341,7 @@ impl BufferTracker {
|
||||
self.tracker_assert_in_bounds(index);
|
||||
tracker.tracker_assert_in_bounds(index);
|
||||
unsafe {
|
||||
insert_or_barrier_update(
|
||||
Some(&mut self.start),
|
||||
&mut self.end,
|
||||
&mut self.metadata,
|
||||
self.insert_or_barrier_update(
|
||||
index,
|
||||
BufferStateProvider::Indirect {
|
||||
state: &tracker.start,
|
||||
@@ -359,7 +352,6 @@ impl BufferTracker {
|
||||
ResourceMetadataProvider::Indirect {
|
||||
metadata: &tracker.metadata,
|
||||
},
|
||||
&mut self.temp,
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -383,10 +375,7 @@ impl BufferTracker {
|
||||
self.tracker_assert_in_bounds(index);
|
||||
scope.tracker_assert_in_bounds(index);
|
||||
unsafe {
|
||||
insert_or_barrier_update(
|
||||
Some(&mut self.start),
|
||||
&mut self.end,
|
||||
&mut self.metadata,
|
||||
self.insert_or_barrier_update(
|
||||
index,
|
||||
BufferStateProvider::Indirect {
|
||||
state: &scope.state,
|
||||
@@ -395,7 +384,6 @@ impl BufferTracker {
|
||||
ResourceMetadataProvider::Indirect {
|
||||
metadata: &scope.metadata,
|
||||
},
|
||||
&mut self.temp,
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -438,10 +426,7 @@ impl BufferTracker {
|
||||
continue;
|
||||
}
|
||||
unsafe {
|
||||
insert_or_barrier_update(
|
||||
Some(&mut self.start),
|
||||
&mut self.end,
|
||||
&mut self.metadata,
|
||||
self.insert_or_barrier_update(
|
||||
index,
|
||||
BufferStateProvider::Indirect {
|
||||
state: &scope.state,
|
||||
@@ -450,13 +435,62 @@ impl BufferTracker {
|
||||
ResourceMetadataProvider::Indirect {
|
||||
metadata: &scope.metadata,
|
||||
},
|
||||
&mut self.temp,
|
||||
)
|
||||
};
|
||||
|
||||
unsafe { scope.metadata.remove(index) };
|
||||
}
|
||||
}
|
||||
|
||||
/// If the resource isn't tracked
|
||||
/// - Inserts the given resource.
|
||||
/// - Uses the `start_state_provider` to populate `start_states`
|
||||
/// - Uses either `end_state_provider` or `start_state_provider`
|
||||
/// to populate `current_states`.
|
||||
///
|
||||
/// If the resource is tracked
|
||||
/// - Inserts barriers from the state in `current_states`
|
||||
/// to the state provided by `start_state_provider`.
|
||||
/// - Updates the `current_states` with either the state from
|
||||
/// `end_state_provider` or `start_state_provider`.
|
||||
///
|
||||
/// Any barriers are added to the barrier vector.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// Indexes must be valid indexes into all arrays passed in
|
||||
/// to this function, either directly or via metadata or provider structs.
|
||||
#[inline(always)]
|
||||
unsafe fn insert_or_barrier_update(
|
||||
&mut self,
|
||||
index: usize,
|
||||
start_state_provider: BufferStateProvider<'_>,
|
||||
end_state_provider: Option<BufferStateProvider<'_>>,
|
||||
metadata_provider: ResourceMetadataProvider<'_, Arc<Buffer>>,
|
||||
) {
|
||||
let currently_owned = unsafe { self.metadata.contains_unchecked(index) };
|
||||
|
||||
if !currently_owned {
|
||||
unsafe {
|
||||
insert(
|
||||
Some(&mut self.start),
|
||||
&mut self.end,
|
||||
&mut self.metadata,
|
||||
index,
|
||||
start_state_provider,
|
||||
end_state_provider,
|
||||
metadata_provider,
|
||||
)
|
||||
};
|
||||
return;
|
||||
}
|
||||
|
||||
let update_state_provider =
|
||||
end_state_provider.unwrap_or_else(|| start_state_provider.clone());
|
||||
unsafe { barrier(&mut self.end, index, start_state_provider, &mut self.temp) };
|
||||
|
||||
unsafe { update(&mut self.end, index, update_state_provider) };
|
||||
}
|
||||
}
|
||||
|
||||
/// Stores all buffer state within a device.
|
||||
@@ -657,58 +691,6 @@ unsafe fn insert_or_merge(
|
||||
}
|
||||
}
|
||||
|
||||
/// If the resource isn't tracked
|
||||
/// - Inserts the given resource.
|
||||
/// - Uses the `start_state_provider` to populate `start_states`
|
||||
/// - Uses either `end_state_provider` or `start_state_provider`
|
||||
/// to populate `current_states`.
|
||||
///
|
||||
/// If the resource is tracked
|
||||
/// - Inserts barriers from the state in `current_states`
|
||||
/// to the state provided by `start_state_provider`.
|
||||
/// - Updates the `current_states` with either the state from
|
||||
/// `end_state_provider` or `start_state_provider`.
|
||||
///
|
||||
/// Any barriers are added to the barrier vector.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// Indexes must be valid indexes into all arrays passed in
|
||||
/// to this function, either directly or via metadata or provider structs.
|
||||
#[inline(always)]
|
||||
unsafe fn insert_or_barrier_update(
|
||||
start_states: Option<&mut [BufferUses]>,
|
||||
current_states: &mut [BufferUses],
|
||||
resource_metadata: &mut ResourceMetadata<Arc<Buffer>>,
|
||||
index: usize,
|
||||
start_state_provider: BufferStateProvider<'_>,
|
||||
end_state_provider: Option<BufferStateProvider<'_>>,
|
||||
metadata_provider: ResourceMetadataProvider<'_, Arc<Buffer>>,
|
||||
barriers: &mut Vec<PendingTransition<BufferUses>>,
|
||||
) {
|
||||
let currently_owned = unsafe { resource_metadata.contains_unchecked(index) };
|
||||
|
||||
if !currently_owned {
|
||||
unsafe {
|
||||
insert(
|
||||
start_states,
|
||||
current_states,
|
||||
resource_metadata,
|
||||
index,
|
||||
start_state_provider,
|
||||
end_state_provider,
|
||||
metadata_provider,
|
||||
)
|
||||
};
|
||||
return;
|
||||
}
|
||||
|
||||
let update_state_provider = end_state_provider.unwrap_or_else(|| start_state_provider.clone());
|
||||
unsafe { barrier(current_states, index, start_state_provider, barriers) };
|
||||
|
||||
unsafe { update(current_states, index, update_state_provider) };
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
unsafe fn insert<T: Clone>(
|
||||
start_states: Option<&mut [BufferUses]>,
|
||||
|
||||
Reference in New Issue
Block a user