Skip to content

Commit de68005

Browse files
committed
winit 30: upgrade ash template
1 parent 062a29f commit de68005

6 files changed

Lines changed: 273 additions & 198 deletions

File tree

generated/graphics/ash/cargo-gpu/mygraphics/src/ash_renderer/mod.rs

Lines changed: 89 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,17 @@ use crate::ash_renderer::swapchain::MySwapchainManager;
44
use crate::util::enable_debug_layer;
55
use ash::util::read_spv;
66
use mygraphics_shaders::ShaderConstants;
7-
use raw_window_handle::HasDisplayHandle as _;
8-
use winit::event_loop::ActiveEventLoop;
7+
use raw_window_handle::HasDisplayHandle;
8+
use std::sync::Arc;
9+
use std::time::Instant;
10+
use winit::event_loop::EventLoop;
911
use winit::{
10-
event::{Event, WindowEvent},
11-
event_loop::{ControlFlow, EventLoop},
12+
application::ApplicationHandler,
13+
dpi::LogicalSize,
14+
event::{ElementState, KeyEvent, WindowEvent},
15+
event_loop::ActiveEventLoop,
16+
keyboard::{Key, NamedKey},
17+
window::{Window, WindowId},
1218
};
1319

1420
pub mod buffer;
@@ -20,73 +26,92 @@ pub mod single_command_buffer;
2026
pub mod swapchain;
2127

2228
pub fn main() -> anyhow::Result<()> {
23-
// runtime setup
2429
let event_loop = EventLoop::new()?;
25-
// FIXME(eddyb) incomplete `winit` upgrade, follow the guides in:
26-
// https://github.com/rust-windowing/winit/releases/tag/v0.30.0
27-
#[allow(deprecated)]
28-
let window = event_loop.create_window(
29-
winit::window::Window::default_attributes()
30-
.with_title("Rust GPU - ash")
31-
.with_inner_size(winit::dpi::LogicalSize::new(
32-
f64::from(1280),
33-
f64::from(720),
34-
)),
35-
)?;
30+
let mut app = App::default();
31+
event_loop.run_app(&mut app)?;
32+
Ok(())
33+
}
3634

37-
let extensions = ash_window::enumerate_required_extensions(window.display_handle()?.as_raw())?;
38-
let device = MyDevice::new(extensions, enable_debug_layer())?;
39-
let mut swapchain = MySwapchainManager::new(device.clone(), window)?;
40-
let mut renderer = MyRenderer::new(device.clone(), swapchain.surface_format.format)?;
35+
#[derive(Default)]
36+
pub struct App(Option<State>);
4137

42-
let start = std::time::Instant::now();
43-
let mut event_handler =
44-
move |event: Event<_>, event_loop_window_target: &ActiveEventLoop| match event {
45-
Event::AboutToWait => swapchain.render(|frame| {
46-
let extent = frame.extent;
47-
let shader_constants = ShaderConstants {
48-
width: extent.width,
49-
height: extent.height,
50-
time: start.elapsed().as_secs_f32(),
51-
};
38+
impl ApplicationHandler for App {
39+
fn resumed(&mut self, event_loop: &ActiveEventLoop) {
40+
if self.0.is_none() {
41+
self.0 = Some(State::new(event_loop).unwrap());
42+
}
43+
}
5244

53-
renderer.render_frame(frame, &shader_constants)?;
54-
Ok(())
55-
}),
56-
Event::WindowEvent { event, .. } => {
57-
match event {
58-
WindowEvent::KeyboardInput {
59-
event:
60-
winit::event::KeyEvent {
61-
logical_key:
62-
winit::keyboard::Key::Named(winit::keyboard::NamedKey::Escape),
63-
state: winit::event::ElementState::Pressed,
64-
..
65-
},
66-
..
67-
}
68-
| WindowEvent::CloseRequested => event_loop_window_target.exit(),
69-
WindowEvent::Resized(_) => {
70-
swapchain.should_recreate();
71-
}
72-
_ => {}
73-
}
45+
fn window_event(&mut self, event_loop: &ActiveEventLoop, id: WindowId, event: WindowEvent) {
46+
let state = self.0.as_mut().unwrap();
47+
state.window_event(event_loop, id, event).unwrap();
48+
}
49+
}
50+
51+
struct State {
52+
start: Instant,
53+
window: Arc<Window>,
54+
renderer: MyRenderer,
55+
swapchain: MySwapchainManager,
56+
}
7457

75-
Ok(())
58+
impl State {
59+
fn new(event_loop: &ActiveEventLoop) -> anyhow::Result<Self> {
60+
let window = Arc::new(
61+
event_loop.create_window(
62+
Window::default_attributes()
63+
.with_title("Rust GPU - ash")
64+
.with_inner_size(LogicalSize::new(1280, 720)),
65+
)?,
66+
);
67+
68+
let extensions =
69+
ash_window::enumerate_required_extensions(window.display_handle()?.as_raw())?;
70+
let device = MyDevice::new(extensions, enable_debug_layer())?;
71+
let swapchain = MySwapchainManager::new(device.clone(), window.clone())?;
72+
let renderer = MyRenderer::new(device.clone(), swapchain.surface_format.format)?;
73+
Ok(Self {
74+
start: Instant::now(),
75+
window,
76+
swapchain,
77+
renderer,
78+
})
79+
}
80+
81+
fn window_event(
82+
&mut self,
83+
event_loop: &ActiveEventLoop,
84+
_id: WindowId,
85+
event: WindowEvent,
86+
) -> anyhow::Result<()> {
87+
match event {
88+
WindowEvent::RedrawRequested => {
89+
self.swapchain.render(|frame| {
90+
let extend = frame.extent;
91+
let shader_constants = ShaderConstants {
92+
width: extend.width,
93+
height: extend.height,
94+
time: self.start.elapsed().as_secs_f32(),
95+
};
96+
self.renderer.render_frame(frame, &shader_constants)
97+
})?;
98+
self.window.request_redraw();
7699
}
77-
_ => {
78-
event_loop_window_target.set_control_flow(ControlFlow::Poll);
79-
Ok(())
100+
WindowEvent::KeyboardInput {
101+
event:
102+
KeyEvent {
103+
logical_key: Key::Named(NamedKey::Escape),
104+
state: ElementState::Pressed,
105+
..
106+
},
107+
..
80108
}
81-
};
82-
83-
// FIXME(eddyb) incomplete `winit` upgrade, follow the guides in:
84-
// https://github.com/rust-windowing/winit/releases/tag/v0.30.0
85-
#[allow(deprecated)]
86-
event_loop.run(move |event, event_loop_window_target| {
87-
event_handler(event, event_loop_window_target).unwrap();
88-
})?;
89-
Ok(())
109+
| WindowEvent::CloseRequested => event_loop.exit(),
110+
WindowEvent::Resized(_) => self.swapchain.should_recreate(),
111+
_ => (),
112+
}
113+
Ok(())
114+
}
90115
}
91116

92117
pub fn get_shaders() -> anyhow::Result<Vec<u32>> {

generated/graphics/ash/cargo-gpu/mygraphics/src/ash_renderer/swapchain.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ impl SwapchainSync {
4040
/// Intentionally kept simple and does not offer support for multiple frames in flight
4141
pub struct MySwapchainManager {
4242
pub device: Arc<MyDevice>,
43-
pub window: winit::window::Window,
43+
pub window: Arc<winit::window::Window>,
4444
pub surface: vk::SurfaceKHR,
4545
pub surface_format: vk::SurfaceFormatKHR,
4646
pub surface_capabilities: vk::SurfaceCapabilitiesKHR,
@@ -61,7 +61,7 @@ struct ActiveSwapchain {
6161
}
6262

6363
impl MySwapchainManager {
64-
pub fn new(device: Arc<MyDevice>, window: winit::window::Window) -> anyhow::Result<Self> {
64+
pub fn new(device: Arc<MyDevice>, window: Arc<winit::window::Window>) -> anyhow::Result<Self> {
6565
unsafe {
6666
let surface_ext = &device.surface_ext;
6767

generated/graphics/ash/spirv-builder/mygraphics/src/ash_renderer/mod.rs

Lines changed: 89 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,17 @@ use crate::ash_renderer::swapchain::MySwapchainManager;
44
use crate::util::enable_debug_layer;
55
use ash::util::read_spv;
66
use mygraphics_shaders::ShaderConstants;
7-
use raw_window_handle::HasDisplayHandle as _;
8-
use winit::event_loop::ActiveEventLoop;
7+
use raw_window_handle::HasDisplayHandle;
8+
use std::sync::Arc;
9+
use std::time::Instant;
10+
use winit::event_loop::EventLoop;
911
use winit::{
10-
event::{Event, WindowEvent},
11-
event_loop::{ControlFlow, EventLoop},
12+
application::ApplicationHandler,
13+
dpi::LogicalSize,
14+
event::{ElementState, KeyEvent, WindowEvent},
15+
event_loop::ActiveEventLoop,
16+
keyboard::{Key, NamedKey},
17+
window::{Window, WindowId},
1218
};
1319

1420
pub mod buffer;
@@ -20,73 +26,92 @@ pub mod single_command_buffer;
2026
pub mod swapchain;
2127

2228
pub fn main() -> anyhow::Result<()> {
23-
// runtime setup
2429
let event_loop = EventLoop::new()?;
25-
// FIXME(eddyb) incomplete `winit` upgrade, follow the guides in:
26-
// https://github.com/rust-windowing/winit/releases/tag/v0.30.0
27-
#[allow(deprecated)]
28-
let window = event_loop.create_window(
29-
winit::window::Window::default_attributes()
30-
.with_title("Rust GPU - ash")
31-
.with_inner_size(winit::dpi::LogicalSize::new(
32-
f64::from(1280),
33-
f64::from(720),
34-
)),
35-
)?;
30+
let mut app = App::default();
31+
event_loop.run_app(&mut app)?;
32+
Ok(())
33+
}
3634

37-
let extensions = ash_window::enumerate_required_extensions(window.display_handle()?.as_raw())?;
38-
let device = MyDevice::new(extensions, enable_debug_layer())?;
39-
let mut swapchain = MySwapchainManager::new(device.clone(), window)?;
40-
let mut renderer = MyRenderer::new(device.clone(), swapchain.surface_format.format)?;
35+
#[derive(Default)]
36+
pub struct App(Option<State>);
4137

42-
let start = std::time::Instant::now();
43-
let mut event_handler =
44-
move |event: Event<_>, event_loop_window_target: &ActiveEventLoop| match event {
45-
Event::AboutToWait => swapchain.render(|frame| {
46-
let extent = frame.extent;
47-
let shader_constants = ShaderConstants {
48-
width: extent.width,
49-
height: extent.height,
50-
time: start.elapsed().as_secs_f32(),
51-
};
38+
impl ApplicationHandler for App {
39+
fn resumed(&mut self, event_loop: &ActiveEventLoop) {
40+
if self.0.is_none() {
41+
self.0 = Some(State::new(event_loop).unwrap());
42+
}
43+
}
5244

53-
renderer.render_frame(frame, &shader_constants)?;
54-
Ok(())
55-
}),
56-
Event::WindowEvent { event, .. } => {
57-
match event {
58-
WindowEvent::KeyboardInput {
59-
event:
60-
winit::event::KeyEvent {
61-
logical_key:
62-
winit::keyboard::Key::Named(winit::keyboard::NamedKey::Escape),
63-
state: winit::event::ElementState::Pressed,
64-
..
65-
},
66-
..
67-
}
68-
| WindowEvent::CloseRequested => event_loop_window_target.exit(),
69-
WindowEvent::Resized(_) => {
70-
swapchain.should_recreate();
71-
}
72-
_ => {}
73-
}
45+
fn window_event(&mut self, event_loop: &ActiveEventLoop, id: WindowId, event: WindowEvent) {
46+
let state = self.0.as_mut().unwrap();
47+
state.window_event(event_loop, id, event).unwrap();
48+
}
49+
}
50+
51+
struct State {
52+
start: Instant,
53+
window: Arc<Window>,
54+
renderer: MyRenderer,
55+
swapchain: MySwapchainManager,
56+
}
7457

75-
Ok(())
58+
impl State {
59+
fn new(event_loop: &ActiveEventLoop) -> anyhow::Result<Self> {
60+
let window = Arc::new(
61+
event_loop.create_window(
62+
Window::default_attributes()
63+
.with_title("Rust GPU - ash")
64+
.with_inner_size(LogicalSize::new(1280, 720)),
65+
)?,
66+
);
67+
68+
let extensions =
69+
ash_window::enumerate_required_extensions(window.display_handle()?.as_raw())?;
70+
let device = MyDevice::new(extensions, enable_debug_layer())?;
71+
let swapchain = MySwapchainManager::new(device.clone(), window.clone())?;
72+
let renderer = MyRenderer::new(device.clone(), swapchain.surface_format.format)?;
73+
Ok(Self {
74+
start: Instant::now(),
75+
window,
76+
swapchain,
77+
renderer,
78+
})
79+
}
80+
81+
fn window_event(
82+
&mut self,
83+
event_loop: &ActiveEventLoop,
84+
_id: WindowId,
85+
event: WindowEvent,
86+
) -> anyhow::Result<()> {
87+
match event {
88+
WindowEvent::RedrawRequested => {
89+
self.swapchain.render(|frame| {
90+
let extend = frame.extent;
91+
let shader_constants = ShaderConstants {
92+
width: extend.width,
93+
height: extend.height,
94+
time: self.start.elapsed().as_secs_f32(),
95+
};
96+
self.renderer.render_frame(frame, &shader_constants)
97+
})?;
98+
self.window.request_redraw();
7699
}
77-
_ => {
78-
event_loop_window_target.set_control_flow(ControlFlow::Poll);
79-
Ok(())
100+
WindowEvent::KeyboardInput {
101+
event:
102+
KeyEvent {
103+
logical_key: Key::Named(NamedKey::Escape),
104+
state: ElementState::Pressed,
105+
..
106+
},
107+
..
80108
}
81-
};
82-
83-
// FIXME(eddyb) incomplete `winit` upgrade, follow the guides in:
84-
// https://github.com/rust-windowing/winit/releases/tag/v0.30.0
85-
#[allow(deprecated)]
86-
event_loop.run(move |event, event_loop_window_target| {
87-
event_handler(event, event_loop_window_target).unwrap();
88-
})?;
89-
Ok(())
109+
| WindowEvent::CloseRequested => event_loop.exit(),
110+
WindowEvent::Resized(_) => self.swapchain.should_recreate(),
111+
_ => (),
112+
}
113+
Ok(())
114+
}
90115
}
91116

92117
pub fn get_shaders() -> anyhow::Result<Vec<u32>> {

generated/graphics/ash/spirv-builder/mygraphics/src/ash_renderer/swapchain.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ impl SwapchainSync {
4040
/// Intentionally kept simple and does not offer support for multiple frames in flight
4141
pub struct MySwapchainManager {
4242
pub device: Arc<MyDevice>,
43-
pub window: winit::window::Window,
43+
pub window: Arc<winit::window::Window>,
4444
pub surface: vk::SurfaceKHR,
4545
pub surface_format: vk::SurfaceFormatKHR,
4646
pub surface_capabilities: vk::SurfaceCapabilitiesKHR,
@@ -61,7 +61,7 @@ struct ActiveSwapchain {
6161
}
6262

6363
impl MySwapchainManager {
64-
pub fn new(device: Arc<MyDevice>, window: winit::window::Window) -> anyhow::Result<Self> {
64+
pub fn new(device: Arc<MyDevice>, window: Arc<winit::window::Window>) -> anyhow::Result<Self> {
6565
unsafe {
6666
let surface_ext = &device.surface_ext;
6767

0 commit comments

Comments
 (0)