Skip to content

Commit cbc6986

Browse files
committed
wgpu: use spirv passthrough and explicit pipeline layout creation
1 parent ba86de1 commit cbc6986

File tree

17 files changed

+137
-33
lines changed

17 files changed

+137
-33
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,5 @@ glam = { version = "0.30.9", default-features = false }
3232
bytemuck = { version = "1.24.0", features = ["derive"] }
3333
raw-window-handle = "0.6.2"
3434
winit = "0.30.0"
35-
cfg-if = "1.0.0"
35+
env_logger = "0.11.8"
3636
anyhow = "1.0.98"

generated/graphics/ash/cargo-gpu/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,6 @@ glam = { version = "0.30.9", default-features = false }
2929
bytemuck = { version = "1.24.0", features = ["derive"] }
3030
raw-window-handle = "0.6.2"
3131
winit = "0.30.0"
32-
cfg-if = "1.0.0"
32+
env_logger = "0.11.8"
3333
anyhow = "1.0.98"
3434

generated/graphics/ash/spirv-builder/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ glam = { version = "0.30.9", default-features = false }
3030
bytemuck = { version = "1.24.0", features = ["derive"] }
3131
raw-window-handle = "0.6.2"
3232
winit = "0.30.0"
33-
cfg-if = "1.0.0"
33+
env_logger = "0.11.8"
3434
anyhow = "1.0.98"
3535

3636
# Optimize build scripts, copied from rust-gpu's repo

generated/graphics/wgpu/cargo-gpu/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,6 @@ glam = { version = "0.30.9", default-features = false }
2929
bytemuck = { version = "1.24.0", features = ["derive"] }
3030
raw-window-handle = "0.6.2"
3131
winit = "0.30.0"
32-
cfg-if = "1.0.0"
32+
env_logger = "0.11.8"
3333
anyhow = "1.0.98"
3434

generated/graphics/wgpu/cargo-gpu/mygraphics/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ mygraphics-shaders = { path = "../mygraphics-shaders" }
1717
# API
1818
wgpu.workspace = true
1919
pollster.workspace = true
20+
env_logger.workspace = true
2021

2122
# other
2223
raw-window-handle.workspace = true

generated/graphics/wgpu/cargo-gpu/mygraphics/src/wgpu_renderer/mod.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ mod renderer;
1010
mod swapchain;
1111

1212
pub fn main() -> anyhow::Result<()> {
13+
env_logger::init();
1314
pollster::block_on(main_inner())
1415
}
1516

@@ -35,7 +36,8 @@ pub async fn main_inner() -> anyhow::Result<()> {
3536
let adapter =
3637
wgpu::util::initialize_adapter_from_env_or_default(&instance, Some(&surface)).await?;
3738

38-
let required_features = wgpu::Features::PUSH_CONSTANTS;
39+
let required_features =
40+
wgpu::Features::PUSH_CONSTANTS | wgpu::Features::EXPERIMENTAL_PASSTHROUGH_SHADERS;
3941
let required_limits = wgpu::Limits {
4042
max_push_constant_size: 128,
4143
..Default::default()
@@ -45,7 +47,7 @@ pub async fn main_inner() -> anyhow::Result<()> {
4547
label: None,
4648
required_features,
4749
required_limits,
48-
experimental_features: wgpu::ExperimentalFeatures::disabled(),
50+
experimental_features: unsafe { wgpu::ExperimentalFeatures::enabled() },
4951
memory_hints: wgpu::MemoryHints::Performance,
5052
trace: Default::default(),
5153
})

generated/graphics/wgpu/cargo-gpu/mygraphics/src/wgpu_renderer/render_pipeline.rs

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
use mygraphics_shaders::ShaderConstants;
22
use wgpu::{
3-
include_spirv, ColorTargetState, ColorWrites, Device, FragmentState, FrontFace,
4-
MultisampleState, PolygonMode, PrimitiveState, PrimitiveTopology, RenderPass, RenderPipeline,
5-
RenderPipelineDescriptor, ShaderStages, TextureFormat, VertexState,
3+
ColorTargetState, ColorWrites, Device, FragmentState, FrontFace, MultisampleState,
4+
PipelineLayoutDescriptor, PolygonMode, PrimitiveState, PrimitiveTopology, PushConstantRange,
5+
RenderPass, RenderPipeline, RenderPipelineDescriptor, ShaderModuleDescriptorPassthrough,
6+
ShaderRuntimeChecks, ShaderStages, TextureFormat, VertexState,
67
};
78

89
pub struct MyRenderPipeline {
@@ -11,14 +12,44 @@ pub struct MyRenderPipeline {
1112

1213
impl MyRenderPipeline {
1314
pub fn new(device: &Device, out_format: TextureFormat) -> anyhow::Result<Self> {
14-
let module = device.create_shader_module(include_spirv!(env!("SHADER_SPV_PATH")));
15+
// Workaround in wgpu 27.0.1 where the macro expansion of `include_spirv_raw!` doesn't compile
16+
// see https://github.com/gfx-rs/wgpu/pull/8250
17+
// let module = unsafe {
18+
// device.create_shader_module_passthrough(include_spirv_raw!(env!("SHADER_SPV_PATH")))
19+
// };
20+
let module = unsafe {
21+
device.create_shader_module_passthrough(ShaderModuleDescriptorPassthrough {
22+
label: Some(env!("SHADER_SPV_PATH")),
23+
entry_point: "".to_owned(),
24+
num_workgroups: (0, 0, 0),
25+
runtime_checks: ShaderRuntimeChecks::unchecked(),
26+
spirv: Some(wgpu::util::make_spirv_raw(include_bytes!(env!(
27+
"SHADER_SPV_PATH"
28+
)))),
29+
dxil: None,
30+
msl: None,
31+
hlsl: None,
32+
glsl: None,
33+
wgsl: None,
34+
})
35+
};
36+
37+
let layout = device.create_pipeline_layout(&PipelineLayoutDescriptor {
38+
label: Some("MyRenderPipeline layout"),
39+
bind_group_layouts: &[],
40+
push_constant_ranges: &[PushConstantRange {
41+
stages: ShaderStages::VERTEX_FRAGMENT,
42+
range: 0..size_of::<ShaderConstants>() as u32,
43+
}],
44+
});
45+
1546
Ok(Self {
1647
pipeline: device.create_render_pipeline(&RenderPipelineDescriptor {
1748
label: Some("MyRenderPipeline"),
18-
layout: None,
49+
layout: Some(&layout),
1950
vertex: VertexState {
2051
module: &module,
21-
entry_point: None,
52+
entry_point: Some("main_vs"),
2253
compilation_options: Default::default(),
2354
buffers: &[],
2455
},
@@ -35,7 +66,7 @@ impl MyRenderPipeline {
3566
multisample: MultisampleState::default(),
3667
fragment: Some(FragmentState {
3768
module: &module,
38-
entry_point: None,
69+
entry_point: Some("main_fs"),
3970
compilation_options: Default::default(),
4071
targets: &[Some(ColorTargetState {
4172
format: out_format,

generated/graphics/wgpu/spirv-builder/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ glam = { version = "0.30.9", default-features = false }
3030
bytemuck = { version = "1.24.0", features = ["derive"] }
3131
raw-window-handle = "0.6.2"
3232
winit = "0.30.0"
33-
cfg-if = "1.0.0"
33+
env_logger = "0.11.8"
3434
anyhow = "1.0.98"
3535

3636
# Optimize build scripts, copied from rust-gpu's repo

generated/graphics/wgpu/spirv-builder/mygraphics/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ mygraphics-shaders = { path = "../mygraphics-shaders" }
2121
# API
2222
wgpu.workspace = true
2323
pollster.workspace = true
24+
env_logger.workspace = true
2425

2526
# other
2627
raw-window-handle.workspace = true

0 commit comments

Comments
 (0)