Skip to content

Commit ac1b755

Browse files
committed
Stitch mode for insert_barriers
1 parent e974043 commit ac1b755

File tree

5 files changed

+30
-8
lines changed

5 files changed

+30
-8
lines changed

src/command/compute.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::command::bind::{Binder};
22
use crate::hub::HUB;
3-
use crate::track::TrackerSet;
3+
use crate::track::{Stitch, TrackerSet};
44
use crate::{
55
Stored, CommandBuffer,
66
BindGroupId, CommandBufferId, ComputePassId, ComputePipelineId,
@@ -71,6 +71,7 @@ pub extern "C" fn wgpu_compute_pass_set_bind_group(
7171
&mut pass.raw,
7272
&mut pass.trackers,
7373
&bind_group.used,
74+
Stitch::Last,
7475
&*HUB.buffers.read(),
7576
&*HUB.textures.read(),
7677
);

src/command/mod.rs

Lines changed: 4 additions & 3 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::{DummyUsage, TrackerSet};
19+
use crate::track::{DummyUsage, Stitch, TrackerSet};
2020
use crate::conv;
2121
use crate::{
2222
BufferHandle, TextureHandle,
@@ -94,11 +94,12 @@ impl CommandBufferHandle {
9494
raw: &mut <Backend as hal::Backend>::CommandBuffer,
9595
base: &mut TrackerSet,
9696
head: &TrackerSet,
97+
stitch: Stitch,
9798
buffer_guard: &Storage<BufferHandle>,
9899
texture_guard: &Storage<TextureHandle>,
99100
) {
100101
let buffer_barriers = base.buffers
101-
.consume_by_replace(&head.buffers)
102+
.consume_by_replace(&head.buffers, stitch)
102103
.map(|(id, transit)| {
103104
let b = &buffer_guard[id];
104105
trace!("transit buffer {:?} {:?}", id, transit);
@@ -110,7 +111,7 @@ impl CommandBufferHandle {
110111
}
111112
});
112113
let texture_barriers = base.textures
113-
.consume_by_replace(&head.textures)
114+
.consume_by_replace(&head.textures, stitch)
114115
.map(|(id, transit)| {
115116
let t = &texture_guard[id];
116117
trace!("transit texture {:?} {:?}", id, transit);

src/command/render.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::command::bind::Binder;
22
use crate::hub::HUB;
33
use crate::resource::BufferUsageFlags;
4-
use crate::track::TrackerSet;
4+
use crate::track::{Stitch, TrackerSet};
55
use crate::{
66
CommandBuffer, Stored,
77
BindGroupId, BufferId, CommandBufferId, RenderPassId, RenderPipelineId,
@@ -46,6 +46,7 @@ pub extern "C" fn wgpu_render_pass_end_pass(pass_id: RenderPassId) -> CommandBuf
4646
last,
4747
&mut cmb.trackers,
4848
&pass.trackers,
49+
Stitch::Last,
4950
&*HUB.buffers.read(),
5051
&*HUB.textures.read(),
5152
);

src/device.rs

Lines changed: 2 additions & 1 deletion
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::{DummyUsage, TrackerSet, TrackPermit};
3+
use crate::track::{DummyUsage, Stitch, TrackerSet, TrackPermit};
44
use crate::{
55
LifeGuard, RefCount, Stored, SubmissionIndex,
66
BufferMapAsyncStatus, BufferMapOperation,
@@ -1076,6 +1076,7 @@ pub extern "C" fn wgpu_queue_submit(
10761076
&mut transit,
10771077
&mut *trackers,
10781078
&comb.trackers,
1079+
Stitch::Init,
10791080
&*buffer_guard,
10801081
&*texture_guard,
10811082
);

src/track.rs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,16 @@ pub type BufferTracker = Tracker<BufferId, BufferUsageFlags>;
9898
pub type TextureTracker = Tracker<TextureId, TextureUsageFlags>;
9999
pub type TextureViewTracker = Tracker<TextureViewId, DummyUsage>;
100100

101+
//TODO: make this a generic parameter.
102+
/// Mode of stitching to states together.
103+
#[derive(Clone, Copy, Debug)]
104+
pub enum Stitch {
105+
/// Stitch to the init state of the other resource.
106+
Init,
107+
/// Stitch to the last sttate of the other resource.
108+
Last,
109+
}
110+
101111
pub struct TrackerSet {
102112
pub buffers: BufferTracker,
103113
pub textures: TextureTracker,
@@ -209,7 +219,11 @@ impl<I: NewId, U: Copy + GenericUsage + BitOr<Output = U> + PartialEq> Tracker<I
209219

210220
/// Consume another tacker, adding it's transitions to `self`.
211221
/// Transitions the current usage to the new one.
212-
pub fn consume_by_replace<'a>(&'a mut self, other: &'a Self) -> impl 'a + Iterator<Item = (I, Range<U>)> {
222+
pub fn consume_by_replace<'a>(
223+
&'a mut self,
224+
other: &'a Self,
225+
stitch: Stitch,
226+
) -> impl 'a + Iterator<Item = (I, Range<U>)> {
213227
other.map.iter().flat_map(move |(&index, new)| {
214228
match self.map.entry(index) {
215229
Entry::Vacant(e) => {
@@ -222,7 +236,11 @@ impl<I: NewId, U: Copy + GenericUsage + BitOr<Output = U> + PartialEq> Tracker<I
222236
if old == new.init {
223237
None
224238
} else {
225-
Some((I::new(index, new.epoch), old .. new.last))
239+
let state = match stitch {
240+
Stitch::Init => new.init,
241+
Stitch::Last => new.last,
242+
};
243+
Some((I::new(index, new.epoch), old .. state))
226244
}
227245
}
228246
}

0 commit comments

Comments
 (0)