-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmod.rs
More file actions
97 lines (89 loc) · 3.5 KB
/
mod.rs
File metadata and controls
97 lines (89 loc) · 3.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
use crate::ash_renderer::device::MyDevice;
use crate::ash_renderer::graphics::{MyRenderPipelineManager, MyRenderer};
use crate::ash_renderer::swapchain::MySwapchainManager;
use crate::enable_debug_layer;
use ash::util::read_spv;
use mygraphics_shaders::ShaderConstants;
use raw_window_handle::HasDisplayHandle as _;
use winit::event_loop::ActiveEventLoop;
use winit::{
event::{Event, WindowEvent},
event_loop::{ControlFlow, EventLoop},
};
pub mod device;
pub mod graphics;
pub mod single_command_buffer;
pub mod swapchain;
pub fn main() -> anyhow::Result<()> {
// runtime setup
let event_loop = EventLoop::new()?;
// FIXME(eddyb) incomplete `winit` upgrade, follow the guides in:
// https://github.com/rust-windowing/winit/releases/tag/v0.30.0
#[allow(deprecated)]
let window = event_loop.create_window(
winit::window::Window::default_attributes()
.with_title("Rust GPU - ash")
.with_inner_size(winit::dpi::LogicalSize::new(
f64::from(1280),
f64::from(720),
)),
)?;
let extensions = ash_window::enumerate_required_extensions(window.display_handle()?.as_raw())?;
let device = MyDevice::new(extensions, enable_debug_layer())?;
let mut swapchain = MySwapchainManager::new(device.clone(), window)?;
let mut renderer = MyRenderer::new(MyRenderPipelineManager::new(
device.clone(),
swapchain.surface_format.format,
get_shaders()?,
)?)?;
let start = std::time::Instant::now();
let mut event_handler =
move |event: Event<_>, event_loop_window_target: &ActiveEventLoop| match event {
Event::AboutToWait => swapchain.render(|frame| {
let extent = frame.extent;
let push_constants = ShaderConstants {
width: extent.width,
height: extent.height,
time: start.elapsed().as_secs_f32(),
};
renderer.render_frame(frame, push_constants)?;
Ok(())
}),
Event::WindowEvent { event, .. } => {
match event {
WindowEvent::KeyboardInput {
event:
winit::event::KeyEvent {
logical_key:
winit::keyboard::Key::Named(winit::keyboard::NamedKey::Escape),
state: winit::event::ElementState::Pressed,
..
},
..
}
| WindowEvent::CloseRequested => event_loop_window_target.exit(),
WindowEvent::Resized(_) => {
swapchain.should_recreate();
}
_ => {}
}
Ok(())
}
_ => {
event_loop_window_target.set_control_flow(ControlFlow::Poll);
Ok(())
}
};
// FIXME(eddyb) incomplete `winit` upgrade, follow the guides in:
// https://github.com/rust-windowing/winit/releases/tag/v0.30.0
#[allow(deprecated)]
event_loop.run(move |event, event_loop_window_target| {
event_handler(event, event_loop_window_target).unwrap();
})?;
Ok(())
}
pub fn get_shaders() -> anyhow::Result<Vec<u32>> {
// set in the build script
const SPV_BYTES: &[u8] = include_bytes!(env!("SHADER_SPV_PATH"));
Ok(read_spv(&mut std::io::Cursor::new(SPV_BYTES))?)
}