Skip to content

Commit e974043

Browse files
committed
Refactor the view tracker
1 parent bf0e146 commit e974043

File tree

5 files changed

+31
-69
lines changed

5 files changed

+31
-69
lines changed

src/command/compute.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ pub extern "C" fn wgpu_compute_pass_set_bind_group(
7474
&*HUB.buffers.read(),
7575
&*HUB.textures.read(),
7676
);
77-
pass.trackers.views.consume(&bind_group.used.views);
7877

7978
if let Some(pipeline_layout_id) = pass.binder.provide_entry(index as usize, bind_group_id, bind_group) {
8079
let pipeline_layout_guard = HUB.pipeline_layouts.read();

src/command/mod.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use crate::device::{
1616
use crate::hub::{HUB, Storage};
1717
use crate::resource::TexturePlacement;
1818
use crate::swap_chain::{SwapChainLink, SwapImageEpoch};
19-
use crate::track::TrackerSet;
19+
use crate::track::{DummyUsage, TrackerSet};
2020
use crate::conv;
2121
use crate::{
2222
BufferHandle, TextureHandle,
@@ -123,7 +123,9 @@ impl CommandBufferHandle {
123123
families: None,
124124
}
125125
});
126-
base.views.consume(&head.views);
126+
base.views
127+
.consume_by_extend(&head.views)
128+
.unwrap();
127129

128130
let stages = all_buffer_stages() | all_image_stages();
129131
unsafe {
@@ -194,7 +196,7 @@ pub fn command_encoder_begin_render_pass(
194196
} else {
195197
extent = Some(view.extent);
196198
}
197-
trackers.views.query(at.attachment, &view.life_guard.ref_count);
199+
trackers.views.query(at.attachment, &view.life_guard.ref_count, DummyUsage);
198200
let query = trackers.textures.query(
199201
view.texture_id.value,
200202
&view.texture_id.ref_count,
@@ -237,7 +239,7 @@ pub fn command_encoder_begin_render_pass(
237239
} else {
238240
extent = Some(view.extent);
239241
}
240-
trackers.views.query(at.attachment, &view.life_guard.ref_count);
242+
trackers.views.query(at.attachment, &view.life_guard.ref_count, DummyUsage);
241243
let query = trackers.textures.query(
242244
view.texture_id.value,
243245
&view.texture_id.ref_count,

src/command/render.rs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -175,13 +175,7 @@ pub extern "C" fn wgpu_render_pass_set_bind_group(
175175
let bind_group_guard = HUB.bind_groups.read();
176176
let bind_group = &bind_group_guard[bind_group_id];
177177

178-
pass.trackers.buffers
179-
.consume_by_extend(&bind_group.used.buffers)
180-
.unwrap();
181-
pass.trackers.textures
182-
.consume_by_extend(&bind_group.used.textures)
183-
.unwrap();
184-
pass.trackers.views.consume(&bind_group.used.views);
178+
pass.trackers.consume_by_extend(&bind_group.used);
185179

186180
if let Some(pipeline_layout_id) = pass.binder.provide_entry(index as usize, bind_group_id, bind_group) {
187181
let pipeline_layout_guard = HUB.pipeline_layouts.read();

src/device.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::{binding_model, command, conv, pipeline, resource, swap_chain};
22
use crate::hub::HUB;
3-
use crate::track::{TrackerSet, TrackPermit};
3+
use crate::track::{DummyUsage, TrackerSet, TrackPermit};
44
use crate::{
55
LifeGuard, RefCount, Stored, SubmissionIndex,
66
BufferMapAsyncStatus, BufferMapOperation,
@@ -640,13 +640,13 @@ pub fn device_track_view(
640640
let device_id = HUB.textures
641641
.read()
642642
[texture_id].device_id.value;
643-
let initialized = HUB.devices
643+
let query = HUB.devices
644644
.read()
645645
[device_id].trackers
646646
.lock()
647647
.views
648-
.query(view_id, &ref_count);
649-
assert!(initialized);
648+
.query(view_id, &ref_count, DummyUsage);
649+
assert!(query.initialized);
650650
}
651651

652652
#[cfg(feature = "local")]
@@ -905,7 +905,7 @@ pub fn device_create_bind_group(
905905
}
906906
binding_model::BindingResource::TextureView(id) => {
907907
let view = &texture_view_guard[id];
908-
used.views.query(id, &view.life_guard.ref_count);
908+
used.views.query(id, &view.life_guard.ref_count, DummyUsage);
909909
used.textures
910910
.transit(
911911
view.texture_id.value,
@@ -1599,6 +1599,7 @@ pub fn swap_chain_populate_textures(
15991599
trackers.views.query(
16001600
view_id.value,
16011601
&view_id.ref_count,
1602+
DummyUsage,
16021603
);
16031604

16041605
swap_chain.frames.push(swap_chain::Frame {

src/track.rs

Lines changed: 18 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,15 @@ bitflags! {
5656
pub trait GenericUsage {
5757
fn is_exclusive(&self) -> bool;
5858
}
59+
#[derive(Clone, Copy, Debug, PartialEq)]
60+
pub struct DummyUsage;
61+
impl BitOr for DummyUsage {
62+
type Output = Self;
63+
fn bitor(self, other: Self) -> Self {
64+
other
65+
}
66+
}
67+
5968
impl GenericUsage for BufferUsageFlags {
6069
fn is_exclusive(&self) -> bool {
6170
BufferUsageFlags::WRITE_ALL.intersects(*self)
@@ -66,6 +75,11 @@ impl GenericUsage for TextureUsageFlags {
6675
TextureUsageFlags::WRITE_ALL.intersects(*self)
6776
}
6877
}
78+
impl GenericUsage for DummyUsage {
79+
fn is_exclusive(&self) -> bool {
80+
false
81+
}
82+
}
6983

7084
#[derive(Clone)]
7185
struct Track<U> {
@@ -82,11 +96,7 @@ pub struct Tracker<I, U> {
8296
}
8397
pub type BufferTracker = Tracker<BufferId, BufferUsageFlags>;
8498
pub type TextureTracker = Tracker<TextureId, TextureUsageFlags>;
85-
pub struct DummyTracker<I> {
86-
map: FastHashMap<Index, (RefCount, Epoch)>,
87-
_phantom: PhantomData<I>,
88-
}
89-
pub type TextureViewTracker = DummyTracker<TextureViewId>;
99+
pub type TextureViewTracker = Tracker<TextureViewId, DummyUsage>;
90100

91101
pub struct TrackerSet {
92102
pub buffers: BufferTracker,
@@ -111,53 +121,9 @@ impl TrackerSet {
111121
self.textures
112122
.consume_by_extend(&other.textures)
113123
.unwrap();
114-
self.views.consume(&other.views);
115-
}
116-
}
117-
118-
impl<I: NewId> DummyTracker<I> {
119-
pub fn new() -> Self {
120-
DummyTracker {
121-
map: FastHashMap::default(),
122-
_phantom: PhantomData,
123-
}
124-
}
125-
126-
/// Remove an id from the tracked map.
127-
pub(crate) fn remove(&mut self, id: I) -> bool {
128-
match self.map.remove(&id.index()) {
129-
Some((_, epoch)) => {
130-
assert_eq!(epoch, id.epoch());
131-
true
132-
}
133-
None => false,
134-
}
135-
}
136-
137-
/// Get the last usage on a resource.
138-
pub(crate) fn query(&mut self, id: I, ref_count: &RefCount) -> bool {
139-
match self.map.entry(id.index()) {
140-
Entry::Vacant(e) => {
141-
e.insert((ref_count.clone(), id.epoch()));
142-
true
143-
}
144-
Entry::Occupied(e) => {
145-
assert_eq!(e.get().1, id.epoch());
146-
false
147-
}
148-
}
149-
}
150-
151-
/// Consume another tacker.
152-
pub fn consume(&mut self, other: &Self) {
153-
for (&index, &(ref ref_count, epoch)) in &other.map {
154-
self.query(I::new(index, epoch), ref_count);
155-
}
156-
}
157-
158-
/// Return an iterator over used resources keys.
159-
pub fn used<'a>(&'a self) -> impl 'a + Iterator<Item = I> {
160-
self.map.iter().map(|(&index, &(_, epoch))| I::new(index, epoch))
124+
self.views
125+
.consume_by_extend(&other.views)
126+
.unwrap();
161127
}
162128
}
163129

0 commit comments

Comments
 (0)