Skip to content

Commit 062a29f

Browse files
goldnorFirestar99
authored andcommitted
winit 30: upgrade wgpu template
1 parent 2f87d36 commit 062a29f

3 files changed

Lines changed: 357 additions & 273 deletions

File tree

  • generated/graphics/wgpu
    • cargo-gpu/mygraphics/src/wgpu_renderer
    • spirv-builder/mygraphics/src/wgpu_renderer
  • graphics/mygraphics/src/wgpu_renderer
Lines changed: 119 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1,111 +1,139 @@
1+
use crate::wgpu_renderer::renderer::MyRenderer;
12
use crate::wgpu_renderer::swapchain::MySwapchainManager;
23
use anyhow::Context;
34
use mygraphics_shaders::ShaderConstants;
5+
use pollster::block_on;
46
use std::sync::Arc;
5-
use winit::event::{Event, WindowEvent};
6-
use winit::event_loop::{ActiveEventLoop, ControlFlow, EventLoop};
7+
use std::time::Instant;
8+
use winit::event_loop::EventLoop;
9+
use winit::{
10+
application::ApplicationHandler,
11+
dpi::LogicalSize,
12+
event::{ElementState, KeyEvent, WindowEvent},
13+
event_loop::ActiveEventLoop,
14+
keyboard::{Key, NamedKey},
15+
window::{Window, WindowId},
16+
};
717

818
mod render_pipeline;
919
mod renderer;
1020
mod swapchain;
1121

1222
pub fn main() -> anyhow::Result<()> {
1323
env_logger::init();
14-
pollster::block_on(main_inner())
24+
let event_loop = EventLoop::new()?;
25+
let mut app = App::default();
26+
event_loop.run_app(&mut app)?;
27+
Ok(())
1528
}
1629

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-
);
30+
#[derive(Default)]
31+
pub struct App(Option<State>);
3332

34-
let instance = wgpu::Instance::new(wgpu::InstanceDescriptor::new_with_display_handle_from_env(
35-
Box::new(event_loop.owned_display_handle()),
36-
));
37-
let surface = instance.create_surface(window.clone())?;
38-
let adapter =
39-
wgpu::util::initialize_adapter_from_env_or_default(&instance, Some(&surface)).await?;
33+
impl ApplicationHandler for App {
34+
fn resumed(&mut self, event_loop: &ActiveEventLoop) {
35+
if self.0.is_none() {
36+
self.0 = Some(block_on(State::new(event_loop)).unwrap());
37+
}
38+
}
4039

41-
let required_features = wgpu::Features::IMMEDIATES;
42-
let required_limits = wgpu::Limits {
43-
max_immediate_size: 128,
44-
..Default::default()
45-
};
46-
let (device, queue) = adapter
47-
.request_device(&wgpu::DeviceDescriptor {
48-
label: None,
49-
required_features,
50-
required_limits,
51-
experimental_features: wgpu::ExperimentalFeatures::disabled(),
52-
memory_hints: wgpu::MemoryHints::Performance,
53-
trace: Default::default(),
54-
})
55-
.await
56-
.context("Failed to create device")?;
40+
fn window_event(&mut self, event_loop: &ActiveEventLoop, id: WindowId, event: WindowEvent) {
41+
let state = self.0.as_mut().unwrap();
42+
state.window_event(event_loop, id, event).unwrap();
43+
}
44+
}
5745

58-
let mut swapchain = MySwapchainManager::new(
59-
instance.clone(),
60-
adapter.clone(),
61-
device.clone(),
62-
window,
63-
surface,
64-
);
65-
let renderer = renderer::MyRenderer::new(device, queue, swapchain.format())?;
46+
struct State {
47+
start: Instant,
48+
window: Arc<Window>,
49+
renderer: MyRenderer,
50+
swapchain: MySwapchainManager<'static>,
51+
}
6652

67-
let start = std::time::Instant::now();
68-
let mut event_handler =
69-
move |event: Event<_>, event_loop_window_target: &ActiveEventLoop| match event {
70-
Event::AboutToWait => swapchain.render(|render_target| {
71-
renderer.render(
72-
&ShaderConstants {
73-
time: start.elapsed().as_secs_f32(),
74-
width: render_target.texture().width(),
75-
height: render_target.texture().height(),
76-
},
77-
render_target,
78-
)
79-
}),
80-
Event::WindowEvent { event, .. } => {
81-
match event {
82-
WindowEvent::KeyboardInput {
83-
event:
84-
winit::event::KeyEvent {
85-
logical_key:
86-
winit::keyboard::Key::Named(winit::keyboard::NamedKey::Escape),
87-
state: winit::event::ElementState::Pressed,
88-
..
89-
},
90-
..
91-
}
92-
| WindowEvent::CloseRequested => event_loop_window_target.exit(),
93-
WindowEvent::Resized(_) => swapchain.should_recreate(),
94-
_ => {}
95-
}
96-
Ok(())
97-
}
98-
_ => {
99-
event_loop_window_target.set_control_flow(ControlFlow::Poll);
100-
Ok(())
101-
}
53+
impl State {
54+
async fn new(event_loop: &ActiveEventLoop) -> anyhow::Result<Self> {
55+
let window = Arc::new(
56+
event_loop.create_window(
57+
Window::default_attributes()
58+
.with_title("Rust GPU - wgpu")
59+
.with_inner_size(LogicalSize::new(1280, 720)),
60+
)?,
61+
);
62+
63+
let instance =
64+
wgpu::Instance::new(wgpu::InstanceDescriptor::new_with_display_handle_from_env(
65+
Box::new(event_loop.owned_display_handle()),
66+
));
67+
let surface = instance.create_surface(window.clone())?;
68+
let adapter =
69+
wgpu::util::initialize_adapter_from_env_or_default(&instance, Some(&surface)).await?;
70+
71+
let required_features = wgpu::Features::IMMEDIATES;
72+
let required_limits = wgpu::Limits {
73+
max_immediate_size: 128,
74+
..Default::default()
10275
};
76+
let (device, queue) = adapter
77+
.request_device(&wgpu::DeviceDescriptor {
78+
label: None,
79+
required_features,
80+
required_limits,
81+
experimental_features: wgpu::ExperimentalFeatures::disabled(),
82+
memory_hints: wgpu::MemoryHints::Performance,
83+
trace: Default::default(),
84+
})
85+
.await
86+
.context("Failed to create device")?;
10387

104-
// FIXME(eddyb) incomplete `winit` upgrade, follow the guides in:
105-
// https://github.com/rust-windowing/winit/releases/tag/v0.30.0
106-
#[allow(deprecated)]
107-
event_loop.run(move |event, event_loop_window_target| {
108-
event_handler(event, event_loop_window_target).unwrap();
109-
})?;
110-
Ok(())
88+
let swapchain = MySwapchainManager::new(
89+
instance.clone(),
90+
adapter.clone(),
91+
device.clone(),
92+
window.clone(),
93+
surface,
94+
);
95+
let renderer = MyRenderer::new(device, queue, swapchain.format())?;
96+
Ok(Self {
97+
start: Instant::now(),
98+
window,
99+
swapchain,
100+
renderer,
101+
})
102+
}
103+
104+
fn window_event(
105+
&mut self,
106+
event_loop: &ActiveEventLoop,
107+
_id: WindowId,
108+
event: WindowEvent,
109+
) -> anyhow::Result<()> {
110+
match event {
111+
WindowEvent::RedrawRequested => {
112+
self.swapchain.render(|render_target| {
113+
self.renderer.render(
114+
&ShaderConstants {
115+
time: self.start.elapsed().as_secs_f32(),
116+
width: render_target.texture().width(),
117+
height: render_target.texture().height(),
118+
},
119+
render_target,
120+
)
121+
})?;
122+
self.window.request_redraw();
123+
}
124+
WindowEvent::KeyboardInput {
125+
event:
126+
KeyEvent {
127+
logical_key: Key::Named(NamedKey::Escape),
128+
state: ElementState::Pressed,
129+
..
130+
},
131+
..
132+
}
133+
| WindowEvent::CloseRequested => event_loop.exit(),
134+
WindowEvent::Resized(_) => self.swapchain.should_recreate(),
135+
_ => (),
136+
}
137+
Ok(())
138+
}
111139
}

0 commit comments

Comments
 (0)