Skip to content

Commit 0fc0b35

Browse files
JMS55a1phyrcwfitzgerald
authored
Transition resources (gfx-rs#6678)
* WIP * Fix typo * WIP: Implement structure of command_encoder_transition_resources * WIP * More work * Clippy * Fix web build * Use new types for API, more docs * Add very basic test * Try to fix test cfg * Fix merge * Missed commit * Use wgt types instead of hal types * Implement `Clone` for `ShaderModule` (gfx-rs#6939) * Move to dispatch trait, move more things to wgt * Move existing code to use new wgt types * Fixes * Format import * Format another file * Fixes * Make module private * Fix imports * Fix test imports * Rexport types * Fix imports * Fix import --------- Co-authored-by: Alphyr <[email protected]> Co-authored-by: Connor Fitzgerald <[email protected]>
1 parent d8e7ab1 commit 0fc0b35

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+807
-551
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,7 @@ By @ErichDonGubler in [#6456](https://github.com/gfx-rs/wgpu/pull/6456), [#6148]
284284
- Image atomic support in shaders. By @atlv24 in [#6706](https://github.com/gfx-rs/wgpu/pull/6706)
285285
- 64 bit image atomic support in shaders. By @atlv24 in [#5537](https://github.com/gfx-rs/wgpu/pull/5537)
286286
- Add `no_std` support to `wgpu-types`. By @bushrat011899 in [#6892](https://github.com/gfx-rs/wgpu/pull/6892).
287+
- Added `CommandEncoder::transition_resources()` for native API interop, and allowing users to slightly optimize barriers. By @JMS55 in [6678](https://github.com/gfx-rs/wgpu/pull/6678).
287288

288289
##### Vulkan
289290

tests/tests/root.rs

+1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ mod texture_blit;
5454
mod texture_bounds;
5555
mod texture_view_creation;
5656
mod transfer;
57+
mod transition_resources;
5758
mod vertex_formats;
5859
mod vertex_indices;
5960
mod write_texture;

tests/tests/transition_resources.rs

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
use wgpu_test::{gpu_test, GpuTestConfiguration};
2+
3+
#[gpu_test]
4+
static TRANSITION_RESOURCES: GpuTestConfiguration = GpuTestConfiguration::new().run_sync(|ctx| {
5+
let texture = ctx.device.create_texture(&wgpu::TextureDescriptor {
6+
label: None,
7+
size: wgpu::Extent3d {
8+
width: 32,
9+
height: 32,
10+
depth_or_array_layers: 1,
11+
},
12+
mip_level_count: 1,
13+
sample_count: 1,
14+
dimension: wgpu::TextureDimension::D2,
15+
format: wgpu::TextureFormat::Rgba8Unorm,
16+
usage: wgpu::TextureUsages::RENDER_ATTACHMENT | wgpu::TextureUsages::TEXTURE_BINDING,
17+
view_formats: &[],
18+
});
19+
20+
let mut encoder = ctx
21+
.device
22+
.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None });
23+
24+
encoder.transition_resources(
25+
std::iter::empty(),
26+
[wgpu::TextureTransition {
27+
texture: &texture,
28+
selector: None,
29+
state: wgpu::TextureUses::COLOR_TARGET,
30+
}]
31+
.into_iter(),
32+
);
33+
34+
ctx.queue.submit([encoder.finish()]);
35+
});

wgpu-core/src/command/bundle.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -683,7 +683,7 @@ fn set_index_buffer(
683683
state
684684
.trackers
685685
.buffers
686-
.merge_single(&buffer, hal::BufferUses::INDEX)?;
686+
.merge_single(&buffer, wgt::BufferUses::INDEX)?;
687687

688688
buffer.same_device(&state.device)?;
689689
buffer.check_usage(wgt::BufferUsages::INDEX)?;
@@ -725,7 +725,7 @@ fn set_vertex_buffer(
725725
state
726726
.trackers
727727
.buffers
728-
.merge_single(&buffer, hal::BufferUses::VERTEX)?;
728+
.merge_single(&buffer, wgt::BufferUses::VERTEX)?;
729729

730730
buffer.same_device(&state.device)?;
731731
buffer.check_usage(wgt::BufferUsages::VERTEX)?;
@@ -864,7 +864,7 @@ fn multi_draw_indirect(
864864
state
865865
.trackers
866866
.buffers
867-
.merge_single(&buffer, hal::BufferUses::INDIRECT)?;
867+
.merge_single(&buffer, wgt::BufferUses::INDIRECT)?;
868868

869869
buffer.same_device(&state.device)?;
870870
buffer.check_usage(wgt::BufferUsages::INDIRECT)?;

wgpu-core/src/command/clear.rs

+11-8
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,14 @@ use crate::{
1515
ParentDevice, ResourceErrorIdent, Texture, TextureClearMode,
1616
},
1717
snatch::SnatchGuard,
18-
track::{TextureSelector, TextureTrackerSetSingle},
18+
track::TextureTrackerSetSingle,
1919
};
2020

2121
use thiserror::Error;
22-
use wgt::{math::align_to, BufferAddress, BufferUsages, ImageSubresourceRange, TextureAspect};
22+
use wgt::{
23+
math::align_to, BufferAddress, BufferUsages, ImageSubresourceRange, TextureAspect,
24+
TextureSelector,
25+
};
2326

2427
/// Error encountered while attempting a clear.
2528
#[derive(Clone, Debug, Error)]
@@ -107,7 +110,7 @@ impl Global {
107110
let dst_pending = cmd_buf_data
108111
.trackers
109112
.buffers
110-
.set_single(&dst_buffer, hal::BufferUses::COPY_DST);
113+
.set_single(&dst_buffer, wgt::BufferUses::COPY_DST);
111114

112115
let snatch_guard = dst_buffer.device.snatchable_lock.read();
113116
let dst_raw = dst_buffer.try_raw(&snatch_guard)?;
@@ -269,12 +272,12 @@ pub(crate) fn clear_texture<T: TextureTrackerSetSingle>(
269272

270273
// Issue the right barrier.
271274
let clear_usage = match dst_texture.clear_mode {
272-
TextureClearMode::BufferCopy => hal::TextureUses::COPY_DST,
275+
TextureClearMode::BufferCopy => wgt::TextureUses::COPY_DST,
273276
TextureClearMode::RenderPass {
274277
is_color: false, ..
275-
} => hal::TextureUses::DEPTH_STENCIL_WRITE,
278+
} => wgt::TextureUses::DEPTH_STENCIL_WRITE,
276279
TextureClearMode::Surface { .. } | TextureClearMode::RenderPass { is_color: true, .. } => {
277-
hal::TextureUses::COLOR_TARGET
280+
wgt::TextureUses::COLOR_TARGET
278281
}
279282
TextureClearMode::None => {
280283
return Err(ClearError::NoValidTextureClearMode(
@@ -455,7 +458,7 @@ fn clear_texture_via_render_passes(
455458
mip_level,
456459
depth_or_layer,
457460
),
458-
usage: hal::TextureUses::COLOR_TARGET,
461+
usage: wgt::TextureUses::COLOR_TARGET,
459462
},
460463
resolve_target: None,
461464
ops: hal::AttachmentOps::STORE,
@@ -473,7 +476,7 @@ fn clear_texture_via_render_passes(
473476
mip_level,
474477
depth_or_layer,
475478
),
476-
usage: hal::TextureUses::DEPTH_STENCIL_WRITE,
479+
usage: wgt::TextureUses::DEPTH_STENCIL_WRITE,
477480
},
478481
depth_ops: hal::AttachmentOps::STORE,
479482
stencil_ops: hal::AttachmentOps::STORE,

wgpu-core/src/command/compute.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -938,7 +938,7 @@ fn dispatch_indirect(
938938
let src_transition = state
939939
.intermediate_trackers
940940
.buffers
941-
.set_single(&buffer, hal::BufferUses::STORAGE_READ_ONLY);
941+
.set_single(&buffer, wgt::BufferUses::STORAGE_READ_ONLY);
942942
let src_barrier =
943943
src_transition.map(|transition| transition.into_hal(&buffer, &state.snatch_guard));
944944
unsafe {
@@ -949,8 +949,8 @@ fn dispatch_indirect(
949949
state.raw_encoder.transition_buffers(&[hal::BufferBarrier {
950950
buffer: params.dst_buffer,
951951
usage: hal::StateTransition {
952-
from: hal::BufferUses::INDIRECT,
953-
to: hal::BufferUses::STORAGE_READ_WRITE,
952+
from: wgt::BufferUses::INDIRECT,
953+
to: wgt::BufferUses::STORAGE_READ_WRITE,
954954
},
955955
}]);
956956
}
@@ -996,8 +996,8 @@ fn dispatch_indirect(
996996
state.raw_encoder.transition_buffers(&[hal::BufferBarrier {
997997
buffer: params.dst_buffer,
998998
usage: hal::StateTransition {
999-
from: hal::BufferUses::STORAGE_READ_WRITE,
1000-
to: hal::BufferUses::INDIRECT,
999+
from: wgt::BufferUses::STORAGE_READ_WRITE,
1000+
to: wgt::BufferUses::INDIRECT,
10011001
},
10021002
}]);
10031003
}
@@ -1012,7 +1012,7 @@ fn dispatch_indirect(
10121012
state
10131013
.scope
10141014
.buffers
1015-
.merge_single(&buffer, hal::BufferUses::INDIRECT)?;
1015+
.merge_single(&buffer, wgt::BufferUses::INDIRECT)?;
10161016

10171017
use crate::resource::Trackable;
10181018
state.flush_states(Some(buffer.tracker_index()))?;

wgpu-core/src/command/memory_init.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ impl BakedCommands {
213213
// must already know about it.
214214
let transition = device_tracker
215215
.buffers
216-
.set_single(&buffer, hal::BufferUses::COPY_DST);
216+
.set_single(&buffer, wgt::BufferUses::COPY_DST);
217217

218218
let raw_buf = buffer.try_raw(snatch_guard)?;
219219

wgpu-core/src/command/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ mod render;
1212
mod render_command;
1313
mod timestamp_writes;
1414
mod transfer;
15+
mod transition_resources;
1516

1617
use std::mem::{self, ManuallyDrop};
1718
use std::sync::Arc;

wgpu-core/src/command/query.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ impl Global {
396396
let dst_pending = cmd_buf_data
397397
.trackers
398398
.buffers
399-
.set_single(&dst_buffer, hal::BufferUses::COPY_DST);
399+
.set_single(&dst_buffer, wgt::BufferUses::COPY_DST);
400400

401401
let dst_barrier = dst_pending.map(|pending| pending.into_hal(&dst_buffer, &snatch_guard));
402402

wgpu-core/src/command/ray_tracing.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,9 @@ use crate::{
1717
FastHashSet,
1818
};
1919

20-
use wgt::{math::align_to, BufferUsages, Features};
20+
use wgt::{math::align_to, BufferUsages, BufferUses, Features};
2121

2222
use super::CommandBufferMutable;
23-
use hal::BufferUses;
2423
use std::{
2524
cmp::max,
2625
num::NonZeroU64,

wgpu-core/src/command/render.rs

+16-16
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,15 @@ use crate::{
2929
DestroyedResourceError, Labeled, MissingBufferUsageError, MissingTextureUsageError,
3030
ParentDevice, QuerySet, Texture, TextureView, TextureViewNotRenderableReason,
3131
},
32-
track::{ResourceUsageCompatibilityError, TextureSelector, Tracker, UsageScope},
32+
track::{ResourceUsageCompatibilityError, Tracker, UsageScope},
3333
Label,
3434
};
3535

3636
use arrayvec::ArrayVec;
3737
use thiserror::Error;
3838
use wgt::{
3939
BufferAddress, BufferSize, BufferUsages, Color, DynamicOffset, IndexFormat, ShaderStages,
40-
TextureUsages, TextureViewDimension, VertexStepMode,
40+
TextureSelector, TextureUsages, TextureViewDimension, VertexStepMode,
4141
};
4242

4343
#[cfg(feature = "serde")]
@@ -779,11 +779,11 @@ where
779779
struct RenderAttachment {
780780
texture: Arc<Texture>,
781781
selector: TextureSelector,
782-
usage: hal::TextureUses,
782+
usage: wgt::TextureUses,
783783
}
784784

785785
impl TextureView {
786-
fn to_render_attachment(&self, usage: hal::TextureUses) -> RenderAttachment {
786+
fn to_render_attachment(&self, usage: wgt::TextureUses) -> RenderAttachment {
787787
RenderAttachment {
788788
texture: self.parent.clone(),
789789
selector: self.selector.clone(),
@@ -1049,9 +1049,9 @@ impl<'d> RenderPassInfo<'d> {
10491049
.flags
10501050
.contains(wgt::DownlevelFlags::READ_ONLY_DEPTH_STENCIL)
10511051
{
1052-
hal::TextureUses::DEPTH_STENCIL_READ | hal::TextureUses::RESOURCE
1052+
wgt::TextureUses::DEPTH_STENCIL_READ | wgt::TextureUses::RESOURCE
10531053
} else {
1054-
hal::TextureUses::DEPTH_STENCIL_WRITE
1054+
wgt::TextureUses::DEPTH_STENCIL_WRITE
10551055
};
10561056
render_attachments.push(view.to_render_attachment(usage));
10571057

@@ -1104,7 +1104,7 @@ impl<'d> RenderPassInfo<'d> {
11041104
&mut pending_discard_init_fixups,
11051105
);
11061106
render_attachments
1107-
.push(color_view.to_render_attachment(hal::TextureUses::COLOR_TARGET));
1107+
.push(color_view.to_render_attachment(wgt::TextureUses::COLOR_TARGET));
11081108

11091109
let mut hal_resolve_target = None;
11101110
if let Some(resolve_view) = &at.resolve_target {
@@ -1160,18 +1160,18 @@ impl<'d> RenderPassInfo<'d> {
11601160
TextureInitRange::from(resolve_view.selector.clone()),
11611161
);
11621162
render_attachments
1163-
.push(resolve_view.to_render_attachment(hal::TextureUses::COLOR_TARGET));
1163+
.push(resolve_view.to_render_attachment(wgt::TextureUses::COLOR_TARGET));
11641164

11651165
hal_resolve_target = Some(hal::Attachment {
11661166
view: resolve_view.try_raw(snatch_guard)?,
1167-
usage: hal::TextureUses::COLOR_TARGET,
1167+
usage: wgt::TextureUses::COLOR_TARGET,
11681168
});
11691169
}
11701170

11711171
color_attachments_hal.push(Some(hal::ColorAttachment {
11721172
target: hal::Attachment {
11731173
view: color_view.try_raw(snatch_guard)?,
1174-
usage: hal::TextureUses::COLOR_TARGET,
1174+
usage: wgt::TextureUses::COLOR_TARGET,
11751175
},
11761176
resolve_target: hal_resolve_target,
11771177
ops: at.hal_ops(),
@@ -1333,7 +1333,7 @@ impl<'d> RenderPassInfo<'d> {
13331333
depth_stencil_attachment: Some(hal::DepthStencilAttachment {
13341334
target: hal::Attachment {
13351335
view: view.try_raw(snatch_guard)?,
1336-
usage: hal::TextureUses::DEPTH_STENCIL_WRITE,
1336+
usage: wgt::TextureUses::DEPTH_STENCIL_WRITE,
13371337
},
13381338
depth_ops,
13391339
stencil_ops,
@@ -2167,7 +2167,7 @@ fn set_index_buffer(
21672167
.info
21682168
.usage_scope
21692169
.buffers
2170-
.merge_single(&buffer, hal::BufferUses::INDEX)?;
2170+
.merge_single(&buffer, wgt::BufferUses::INDEX)?;
21712171

21722172
buffer.same_device_as(cmd_buf.as_ref())?;
21732173

@@ -2216,7 +2216,7 @@ fn set_vertex_buffer(
22162216
.info
22172217
.usage_scope
22182218
.buffers
2219-
.merge_single(&buffer, hal::BufferUses::VERTEX)?;
2219+
.merge_single(&buffer, wgt::BufferUses::VERTEX)?;
22202220

22212221
buffer.same_device_as(cmd_buf.as_ref())?;
22222222

@@ -2496,7 +2496,7 @@ fn multi_draw_indirect(
24962496
.info
24972497
.usage_scope
24982498
.buffers
2499-
.merge_single(&indirect_buffer, hal::BufferUses::INDIRECT)?;
2499+
.merge_single(&indirect_buffer, wgt::BufferUses::INDIRECT)?;
25002500

25012501
indirect_buffer.check_usage(BufferUsages::INDIRECT)?;
25022502
let indirect_raw = indirect_buffer.try_raw(state.snatch_guard)?;
@@ -2573,7 +2573,7 @@ fn multi_draw_indirect_count(
25732573
.info
25742574
.usage_scope
25752575
.buffers
2576-
.merge_single(&indirect_buffer, hal::BufferUses::INDIRECT)?;
2576+
.merge_single(&indirect_buffer, wgt::BufferUses::INDIRECT)?;
25772577

25782578
indirect_buffer.check_usage(BufferUsages::INDIRECT)?;
25792579
let indirect_raw = indirect_buffer.try_raw(state.snatch_guard)?;
@@ -2582,7 +2582,7 @@ fn multi_draw_indirect_count(
25822582
.info
25832583
.usage_scope
25842584
.buffers
2585-
.merge_single(&count_buffer, hal::BufferUses::INDIRECT)?;
2585+
.merge_single(&count_buffer, wgt::BufferUses::INDIRECT)?;
25862586

25872587
count_buffer.check_usage(BufferUsages::INDIRECT)?;
25882588
let count_raw = count_buffer.try_raw(state.snatch_guard)?;

0 commit comments

Comments
 (0)