[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:
Jim Blandy
2024-11-26 16:03:33 -08:00
committed by Connor Fitzgerald
parent 170f457f71
commit eaa5fea40d

View File

@@ -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]>,