Skip to content

Commit 1f662d7

Browse files
committed
wgpu 27: update example-runner-wgpu
1 parent b4695e3 commit 1f662d7

File tree

3 files changed

+56
-41
lines changed

3 files changed

+56
-41
lines changed

examples/runners/wgpu/src/compute.rs

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99
//! The individual Collatz sequence lengths are computed via a computer shader on the GPU.
1010
1111
use crate::{CompiledShaderModules, Options, maybe_watch};
12+
use std::borrow::Cow;
1213

1314
use std::time::Duration;
1415
use wgpu::util::DeviceExt;
16+
use wgpu::{ExperimentalFeatures, ShaderSource};
1517

1618
pub fn start(options: &Options) {
1719
env_logger::init();
@@ -48,14 +50,19 @@ async fn start_internal(options: &Options, compiled_shader_modules: CompiledShad
4850
);
4951
}
5052
if options.force_spirv_passthru {
51-
required_features |= wgpu::Features::SPIRV_SHADER_PASSTHROUGH;
53+
required_features |= wgpu::Features::EXPERIMENTAL_PASSTHROUGH_SHADERS;
5254
}
5355

5456
let (device, queue) = adapter
5557
.request_device(&wgpu::DeviceDescriptor {
5658
label: None,
5759
required_features,
5860
required_limits: wgpu::Limits::default(),
61+
experimental_features: if options.force_spirv_passthru {
62+
unsafe { ExperimentalFeatures::enabled() }
63+
} else {
64+
ExperimentalFeatures::disabled()
65+
},
5966
memory_hints: wgpu::MemoryHints::Performance,
6067
trace: Default::default(),
6168
})
@@ -75,16 +82,18 @@ async fn start_internal(options: &Options, compiled_shader_modules: CompiledShad
7582
let module = compiled_shader_modules.spv_module_for_entry_point(entry_point);
7683
let module = if options.force_spirv_passthru {
7784
unsafe {
78-
device.create_shader_module_passthrough(wgpu::ShaderModuleDescriptorPassthrough::SpirV(
79-
module,
80-
))
85+
let spirv = match &module.source {
86+
ShaderSource::SpirV(spirv) => spirv,
87+
_ => unreachable!(),
88+
};
89+
device.create_shader_module_passthrough(wgpu::ShaderModuleDescriptorPassthrough {
90+
label: module.label,
91+
spirv: Some(Cow::Borrowed(spirv)),
92+
..Default::default()
93+
})
8194
}
8295
} else {
83-
let wgpu::ShaderModuleDescriptorSpirV { label, source } = module;
84-
device.create_shader_module(wgpu::ShaderModuleDescriptor {
85-
label,
86-
source: wgpu::ShaderSource::SpirV(source),
87-
})
96+
device.create_shader_module(module)
8897
};
8998

9099
let top = 2u32.pow(20);
@@ -230,7 +239,7 @@ async fn start_internal(options: &Options, compiled_shader_modules: CompiledShad
230239
buffer_slice.map_async(wgpu::MapMode::Read, |r| r.unwrap());
231240
// NOTE(eddyb) `poll` should return only after the above callbacks fire
232241
// (see also https://github.com/gfx-rs/wgpu/pull/2698 for more details).
233-
device.poll(wgpu::PollType::Wait).unwrap();
242+
device.poll(wgpu::PollType::wait_indefinitely()).unwrap();
234243

235244
if timestamping
236245
&& let (Some(timestamp_readback_buffer), Some(timestamp_period)) =

examples/runners/wgpu/src/graphics.rs

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::{CompiledShaderModules, Options, maybe_watch};
2-
use wgpu::ShaderModuleDescriptorPassthrough;
2+
use std::borrow::Cow;
3+
use wgpu::{ExperimentalFeatures, ShaderModuleDescriptor, ShaderSource};
34

45
use shared::ShaderConstants;
56
use std::slice;
@@ -77,7 +78,7 @@ async fn run(
7778

7879
let mut required_features = wgpu::Features::PUSH_CONSTANTS;
7980
if options.force_spirv_passthru {
80-
required_features |= wgpu::Features::SPIRV_SHADER_PASSTHROUGH;
81+
required_features |= wgpu::Features::EXPERIMENTAL_PASSTHROUGH_SHADERS;
8182
}
8283
let required_limits = wgpu::Limits {
8384
max_push_constant_size: 128,
@@ -90,6 +91,11 @@ async fn run(
9091
label: None,
9192
required_features,
9293
required_limits,
94+
experimental_features: if options.force_spirv_passthru {
95+
unsafe { ExperimentalFeatures::enabled() }
96+
} else {
97+
ExperimentalFeatures::disabled()
98+
},
9399
memory_hints: wgpu::MemoryHints::Performance,
94100
trace: Default::default(),
95101
})
@@ -438,8 +444,12 @@ fn create_pipeline(
438444
if options.emulate_push_constants_with_storage_buffer {
439445
let (ds, b) = (0, 0);
440446

441-
for (_, shader_module_descr) in &mut compiled_shader_modules.named_spv_modules {
442-
let w = shader_module_descr.source.to_mut();
447+
for (_, module) in &mut compiled_shader_modules.named_spv_modules {
448+
let spirv = match &mut module.source {
449+
ShaderSource::SpirV(spirv) => spirv,
450+
_ => unreachable!(),
451+
};
452+
let w = spirv.to_mut();
443453
assert_eq!((w[0], w[4]), (0x07230203, 0));
444454
let mut last_op_decorate_start = None;
445455
let mut i = 5;
@@ -467,39 +477,30 @@ fn create_pipeline(
467477
}
468478

469479
// FIXME(eddyb) automate this decision by default.
470-
let create_module = |module| {
480+
let create_module = |module: ShaderModuleDescriptor<'_>| {
471481
if options.force_spirv_passthru {
472482
unsafe {
473-
device.create_shader_module_passthrough(ShaderModuleDescriptorPassthrough::SpirV(
474-
module,
475-
))
483+
let spirv = match &module.source {
484+
ShaderSource::SpirV(spirv) => spirv,
485+
_ => unreachable!(),
486+
};
487+
device.create_shader_module_passthrough(wgpu::ShaderModuleDescriptorPassthrough {
488+
label: module.label,
489+
spirv: Some(Cow::Borrowed(spirv)),
490+
..Default::default()
491+
})
476492
}
477493
} else {
478-
let wgpu::ShaderModuleDescriptorSpirV { label, source } = module;
479-
device.create_shader_module(wgpu::ShaderModuleDescriptor {
480-
label,
481-
source: wgpu::ShaderSource::SpirV(source),
482-
})
494+
device.create_shader_module(module)
483495
}
484496
};
485497

486498
let vs_entry_point = shaders::main_vs;
487499
let fs_entry_point = shaders::main_fs;
488-
489500
let vs_module_descr = compiled_shader_modules.spv_module_for_entry_point(vs_entry_point);
490501
let fs_module_descr = compiled_shader_modules.spv_module_for_entry_point(fs_entry_point);
491-
492-
// HACK(eddyb) avoid calling `device.create_shader_module` twice unnecessarily.
493-
let vs_fs_same_module = std::ptr::eq(&vs_module_descr.source[..], &fs_module_descr.source[..]);
494-
495502
let vs_module = &create_module(vs_module_descr);
496-
let fs_module;
497-
let fs_module = if vs_fs_same_module {
498-
vs_module
499-
} else {
500-
fs_module = create_module(fs_module_descr);
501-
&fs_module
502-
};
503+
let fs_module = &create_module(fs_module_descr);
503504

504505
device.create_render_pipeline(&wgpu::RenderPipelineDescriptor {
505506
cache: None,

examples/runners/wgpu/src/lib.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ use clap::Parser;
7474
use clap::ValueEnum;
7575
use std::borrow::Cow;
7676
use strum::{Display, EnumString};
77+
use wgpu::ShaderSource;
7778

7879
// NOTE(eddyb) while this could theoretically work on the web, it needs more work.
7980
#[cfg(not(any(target_os = "android", target_arch = "wasm32")))]
@@ -90,19 +91,23 @@ pub enum RustGPUShader {
9091
}
9192

9293
struct CompiledShaderModules {
93-
named_spv_modules: Vec<(Option<String>, wgpu::ShaderModuleDescriptorSpirV<'static>)>,
94+
named_spv_modules: Vec<(Option<String>, wgpu::ShaderModuleDescriptor<'static>)>,
9495
}
9596

9697
impl CompiledShaderModules {
9798
fn spv_module_for_entry_point<'a>(
9899
&'a self,
99100
wanted_entry: &str,
100-
) -> wgpu::ShaderModuleDescriptorSpirV<'a> {
101+
) -> wgpu::ShaderModuleDescriptor<'a> {
101102
for (name, spv_module) in &self.named_spv_modules {
102103
if name.as_ref().is_none_or(|name| name == wanted_entry) {
103-
return wgpu::ShaderModuleDescriptorSpirV {
104+
let spirv = match &spv_module.source {
105+
ShaderSource::SpirV(spirv) => spirv,
106+
_ => unreachable!(),
107+
};
108+
return wgpu::ShaderModuleDescriptor {
104109
label: name.as_deref(),
105-
source: Cow::Borrowed(&spv_module.source),
110+
source: ShaderSource::SpirV(Cow::Borrowed(spirv)),
106111
};
107112
}
108113
}
@@ -158,9 +163,9 @@ fn maybe_watch(
158163
// FIXME(eddyb) this reallocates all the data pointlessly, there is
159164
// not a good reason to use `ShaderModuleDescriptorSpirV` specifically.
160165
let spirv = Cow::Owned(wgpu::util::make_spirv_raw(&data).into_owned());
161-
wgpu::ShaderModuleDescriptorSpirV {
166+
wgpu::ShaderModuleDescriptor {
162167
label: None,
163-
source: spirv,
168+
source: ShaderSource::SpirV(spirv),
164169
}
165170
};
166171
CompiledShaderModules {

0 commit comments

Comments
 (0)