From eaa5fea40d6546b6feba2dbfb94b310a16fa9416 Mon Sep 17 00:00:00 2001 From: Jim Blandy Date: Tue, 26 Nov 2024 16:03:33 -0800 Subject: [PATCH] [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`. --- wgpu-core/src/track/buffer.rs | 126 +++++++++++++++------------------- 1 file changed, 54 insertions(+), 72 deletions(-) diff --git a/wgpu-core/src/track/buffer.rs b/wgpu-core/src/track/buffer.rs index 13629dfbc9..e35fc937fa 100644 --- a/wgpu-core/src/track/buffer.rs +++ b/wgpu-core/src/track/buffer.rs @@ -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>, + metadata_provider: ResourceMetadataProvider<'_, Arc>, + ) { + 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>, - index: usize, - start_state_provider: BufferStateProvider<'_>, - end_state_provider: Option>, - metadata_provider: ResourceMetadataProvider<'_, Arc>, - barriers: &mut Vec>, -) { - 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( start_states: Option<&mut [BufferUses]>,