Skip to content

Commit 2a5636e

Browse files
committed
generated
1 parent 622db2f commit 2a5636e

File tree

14 files changed

+735
-5
lines changed

14 files changed

+735
-5
lines changed

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: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ unexpected_cfgs = { level = "allow", check-cfg = ['cfg(target_arch, values("spir
1818
[workspace.dependencies]
1919
# API
2020
wgpu = { version = "27.0.1", default-features = false, features = ["std", "parking_lot", "vulkan", "vulkan-portability", "spirv", "wgsl"] }
21+
pollster = "0.4.0"
2122

2223
# rust-gpu
2324
cargo-gpu = { git = "https://github.com/Rust-GPU/cargo-gpu", rev = "bf24eb6060e0c7b0013eceddd23b5d7cee68f4cc" }
@@ -28,6 +29,6 @@ glam = { version = "0.30.9", default-features = false }
2829
bytemuck = { version = "1.24.0", features = ["derive"] }
2930
raw-window-handle = "0.6.2"
3031
winit = "0.30.0"
31-
cfg-if = "1.0.0"
32+
env_logger = "0.11.8"
3233
anyhow = "1.0.98"
3334

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ mygraphics-shaders = { path = "../mygraphics-shaders" }
1616

1717
# API
1818
wgpu.workspace = true
19+
pollster.workspace = true
20+
env_logger.workspace = true
1921

2022
# other
2123
raw-window-handle.workspace = true
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
use crate::wgpu_renderer::swapchain::MySwapchainManager;
2+
use anyhow::Context;
3+
use mygraphics_shaders::ShaderConstants;
4+
use std::sync::Arc;
5+
use winit::event::{Event, WindowEvent};
6+
use winit::event_loop::{ActiveEventLoop, ControlFlow, EventLoop};
7+
8+
mod render_pipeline;
9+
mod renderer;
10+
mod swapchain;
11+
12+
pub fn main() -> anyhow::Result<()> {
13+
env_logger::init();
14+
pollster::block_on(main_inner())
15+
}
16+
17+
pub async fn main_inner() -> anyhow::Result<()> {
18+
// env_logger::init();
19+
let event_loop = EventLoop::new()?;
20+
// FIXME(eddyb) incomplete `winit` upgrade, follow the guides in:
21+
// https://github.com/rust-windowing/winit/releases/tag/v0.30.0
22+
#[allow(deprecated)]
23+
let window = Arc::new(
24+
event_loop.create_window(
25+
winit::window::Window::default_attributes()
26+
.with_title("Rust GPU - wgpu")
27+
.with_inner_size(winit::dpi::LogicalSize::new(
28+
f64::from(1280),
29+
f64::from(720),
30+
)),
31+
)?,
32+
);
33+
34+
let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor::from_env_or_default());
35+
let surface = instance.create_surface(window.clone())?;
36+
let adapter =
37+
wgpu::util::initialize_adapter_from_env_or_default(&instance, Some(&surface)).await?;
38+
39+
let required_features =
40+
wgpu::Features::PUSH_CONSTANTS | wgpu::Features::EXPERIMENTAL_PASSTHROUGH_SHADERS;
41+
let required_limits = wgpu::Limits {
42+
max_push_constant_size: 128,
43+
..Default::default()
44+
};
45+
let (device, queue) = adapter
46+
.request_device(&wgpu::DeviceDescriptor {
47+
label: None,
48+
required_features,
49+
required_limits,
50+
experimental_features: unsafe { wgpu::ExperimentalFeatures::enabled() },
51+
memory_hints: wgpu::MemoryHints::Performance,
52+
trace: Default::default(),
53+
})
54+
.await
55+
.context("Failed to create device")?;
56+
57+
let mut swapchain = MySwapchainManager::new(adapter.clone(), device.clone(), window, surface);
58+
let renderer = renderer::MyRenderer::new(device, queue, swapchain.format())?;
59+
60+
let start = std::time::Instant::now();
61+
let mut event_handler =
62+
move |event: Event<_>, event_loop_window_target: &ActiveEventLoop| match event {
63+
Event::AboutToWait => swapchain.render(|render_target| {
64+
renderer.render(
65+
&ShaderConstants {
66+
time: start.elapsed().as_secs_f32(),
67+
width: render_target.texture().width(),
68+
height: render_target.texture().height(),
69+
},
70+
render_target,
71+
);
72+
}),
73+
Event::WindowEvent { event, .. } => {
74+
match event {
75+
WindowEvent::KeyboardInput {
76+
event:
77+
winit::event::KeyEvent {
78+
logical_key:
79+
winit::keyboard::Key::Named(winit::keyboard::NamedKey::Escape),
80+
state: winit::event::ElementState::Pressed,
81+
..
82+
},
83+
..
84+
}
85+
| WindowEvent::CloseRequested => event_loop_window_target.exit(),
86+
WindowEvent::Resized(_) => swapchain.should_recreate(),
87+
_ => {}
88+
}
89+
Ok(())
90+
}
91+
_ => {
92+
event_loop_window_target.set_control_flow(ControlFlow::Poll);
93+
Ok(())
94+
}
95+
};
96+
97+
// FIXME(eddyb) incomplete `winit` upgrade, follow the guides in:
98+
// https://github.com/rust-windowing/winit/releases/tag/v0.30.0
99+
#[allow(deprecated)]
100+
event_loop.run(move |event, event_loop_window_target| {
101+
event_handler(event, event_loop_window_target).unwrap();
102+
})?;
103+
Ok(())
104+
}
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
use mygraphics_shaders::ShaderConstants;
2+
use wgpu::{
3+
ColorTargetState, ColorWrites, Device, FragmentState, FrontFace, MultisampleState,
4+
PipelineLayoutDescriptor, PolygonMode, PrimitiveState, PrimitiveTopology, PushConstantRange,
5+
RenderPass, RenderPipeline, RenderPipelineDescriptor, ShaderModuleDescriptorPassthrough,
6+
ShaderRuntimeChecks, ShaderStages, TextureFormat, VertexState,
7+
};
8+
9+
pub struct MyRenderPipeline {
10+
pipeline: RenderPipeline,
11+
}
12+
13+
impl MyRenderPipeline {
14+
pub fn new(device: &Device, out_format: TextureFormat) -> anyhow::Result<Self> {
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+
46+
Ok(Self {
47+
pipeline: device.create_render_pipeline(&RenderPipelineDescriptor {
48+
label: Some("MyRenderPipeline"),
49+
layout: Some(&layout),
50+
vertex: VertexState {
51+
module: &module,
52+
entry_point: Some("main_vs"),
53+
compilation_options: Default::default(),
54+
buffers: &[],
55+
},
56+
primitive: PrimitiveState {
57+
topology: PrimitiveTopology::TriangleList,
58+
strip_index_format: None,
59+
front_face: FrontFace::Ccw,
60+
cull_mode: None,
61+
unclipped_depth: false,
62+
polygon_mode: PolygonMode::Fill,
63+
conservative: false,
64+
},
65+
depth_stencil: None,
66+
multisample: MultisampleState::default(),
67+
fragment: Some(FragmentState {
68+
module: &module,
69+
entry_point: Some("main_fs"),
70+
compilation_options: Default::default(),
71+
targets: &[Some(ColorTargetState {
72+
format: out_format,
73+
blend: None,
74+
write_mask: ColorWrites::ALL,
75+
})],
76+
}),
77+
multiview: None,
78+
cache: None,
79+
}),
80+
})
81+
}
82+
83+
pub fn draw(&self, rpass: &mut RenderPass<'_>, shader_constants: &ShaderConstants) {
84+
rpass.set_pipeline(&self.pipeline);
85+
rpass.set_push_constants(
86+
ShaderStages::VERTEX_FRAGMENT,
87+
0,
88+
bytemuck::bytes_of(shader_constants),
89+
);
90+
rpass.draw(0..3, 0..1);
91+
}
92+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
use crate::wgpu_renderer::render_pipeline::MyRenderPipeline;
2+
use mygraphics_shaders::ShaderConstants;
3+
use wgpu::wgt::CommandEncoderDescriptor;
4+
use wgpu::{
5+
Color, Device, LoadOp, Operations, Queue, RenderPassColorAttachment, RenderPassDescriptor,
6+
StoreOp, TextureFormat, TextureView,
7+
};
8+
9+
pub struct MyRenderer {
10+
pub device: Device,
11+
pub queue: Queue,
12+
pipeline: MyRenderPipeline,
13+
}
14+
15+
impl MyRenderer {
16+
pub fn new(device: Device, queue: Queue, out_format: TextureFormat) -> anyhow::Result<Self> {
17+
Ok(Self {
18+
pipeline: MyRenderPipeline::new(&device, out_format)?,
19+
device,
20+
queue,
21+
})
22+
}
23+
24+
pub fn render(&self, shader_constants: &ShaderConstants, output: TextureView) {
25+
let mut cmd = self
26+
.device
27+
.create_command_encoder(&CommandEncoderDescriptor {
28+
label: Some("main draw"),
29+
});
30+
31+
let mut rpass = cmd.begin_render_pass(&RenderPassDescriptor {
32+
label: Some("main renderpass"),
33+
color_attachments: &[Some(RenderPassColorAttachment {
34+
view: &output,
35+
depth_slice: None,
36+
resolve_target: None,
37+
ops: Operations {
38+
load: LoadOp::Clear(Color::BLACK),
39+
store: StoreOp::Store,
40+
},
41+
})],
42+
depth_stencil_attachment: None,
43+
timestamp_writes: None,
44+
occlusion_query_set: None,
45+
});
46+
self.pipeline.draw(&mut rpass, shader_constants);
47+
drop(rpass);
48+
49+
self.queue.submit(std::iter::once(cmd.finish()));
50+
}
51+
}

0 commit comments

Comments
 (0)