|
|
|
@ -1,20 +1,12 @@
|
|
|
|
|
#[macro_use] |
|
|
|
|
mod util; |
|
|
|
|
|
|
|
|
|
mod conf; |
|
|
|
|
mod hal; |
|
|
|
|
mod render; |
|
|
|
|
|
|
|
|
|
use ash::{version::DeviceV1_0, vk}; |
|
|
|
|
use crate::{render::*, util::{err, log, meta}}; |
|
|
|
|
use std::convert::TryInto; |
|
|
|
|
|
|
|
|
|
serialize! { |
|
|
|
|
conf: |
|
|
|
|
#[derive(Default)] |
|
|
|
|
struct Conf { |
|
|
|
|
log: log::Conf, |
|
|
|
|
render: render::Conf, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
use crate::{render::*, util::{log, meta}}; |
|
|
|
|
|
|
|
|
|
const MAIN_VERT: &'static [u8] = |
|
|
|
|
include_bytes!(concat!(env!("OUT_DIR"), "/main.vert.o")); |
|
|
|
@ -29,7 +21,7 @@ fn draw_frame(
|
|
|
|
|
cmd_buffers: &[CommandBuffer], |
|
|
|
|
queue_graphics: &Queue, |
|
|
|
|
queue_surface: &Queue, |
|
|
|
|
) -> err::Result<()> { |
|
|
|
|
) -> Result<(), vk::Result> { |
|
|
|
|
let image_index = unsafe { |
|
|
|
|
device.swapchain_ext.acquire_next_image( |
|
|
|
|
**swapchain, |
|
|
|
@ -48,12 +40,12 @@ fn draw_frame(
|
|
|
|
|
|
|
|
|
|
let submit_info = [ |
|
|
|
|
vk::SubmitInfo { |
|
|
|
|
wait_semaphore_count: wait_semaphores.len().try_into()?, |
|
|
|
|
wait_semaphore_count: wait_semaphores.len() as u32, |
|
|
|
|
p_wait_semaphores: wait_semaphores.as_ptr(), |
|
|
|
|
p_wait_dst_stage_mask: wait_stages.as_ptr(), |
|
|
|
|
command_buffer_count: submit_cmd_buffers.len().try_into()?, |
|
|
|
|
command_buffer_count: submit_cmd_buffers.len() as u32, |
|
|
|
|
p_command_buffers: submit_cmd_buffers.as_ptr(), |
|
|
|
|
signal_semaphore_count: signal_semaphores.len().try_into()?, |
|
|
|
|
signal_semaphore_count: signal_semaphores.len() as u32, |
|
|
|
|
p_signal_semaphores: signal_semaphores.as_ptr(), |
|
|
|
|
..Default::default() |
|
|
|
|
} |
|
|
|
@ -67,9 +59,9 @@ fn draw_frame(
|
|
|
|
|
let image_indices = [image_index]; |
|
|
|
|
|
|
|
|
|
let present_info = vk::PresentInfoKHR { |
|
|
|
|
wait_semaphore_count: signal_semaphores.len().try_into()?, |
|
|
|
|
wait_semaphore_count: signal_semaphores.len() as u32, |
|
|
|
|
p_wait_semaphores: signal_semaphores.as_ptr(), |
|
|
|
|
swapchain_count: swapchains.len().try_into()?, |
|
|
|
|
swapchain_count: swapchains.len() as u32, |
|
|
|
|
p_swapchains: swapchains.as_ptr(), |
|
|
|
|
p_image_indices: image_indices.as_ptr(), |
|
|
|
|
..Default::default() |
|
|
|
@ -82,11 +74,13 @@ fn draw_frame(
|
|
|
|
|
Ok(()) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fn fallback_main(conf: &Conf, lg: &log::Log) -> err::Result<()> { |
|
|
|
|
let sdl_context = err::from_s(sdl2::init())?; |
|
|
|
|
let sdl_video = err::from_s(sdl_context.video())?; |
|
|
|
|
fn fallback_main( |
|
|
|
|
conf: &conf::Conf, |
|
|
|
|
lg: &log::Log, |
|
|
|
|
) -> Result<(), Box<dyn std::error::Error>> { |
|
|
|
|
let hal = hal::Context::new()?; |
|
|
|
|
|
|
|
|
|
let window = sdl_video.window(meta::name(), 640, 480).vulkan().build()?; |
|
|
|
|
let window = hal::Window::new(&hal, meta::ffi::name(), 640, 480)?; |
|
|
|
|
|
|
|
|
|
let entry = ash::Entry::new()?; |
|
|
|
|
|
|
|
|
@ -175,14 +169,14 @@ fn fallback_main(conf: &Conf, lg: &log::Log) -> err::Result<()> {
|
|
|
|
|
&queue_surface, |
|
|
|
|
); |
|
|
|
|
if let Err(e) = frame { |
|
|
|
|
lg!(lg, Error, "Error rendering frame: {}", e); |
|
|
|
|
lg!(lg, Level::Error, "Error rendering frame: {}", e); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
std::thread::sleep(std::time::Duration::from_secs(3)); |
|
|
|
|
|
|
|
|
|
let seize = unsafe { device.device_wait_idle() }; |
|
|
|
|
if let Err(e) = seize { |
|
|
|
|
lg!(lg, Error, "Error seizing renderer state: {}", e); |
|
|
|
|
lg!(lg, Level::Error, "Error seizing renderer state: {}", e); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Ok(()) |
|
|
|
@ -194,28 +188,24 @@ fn main() {
|
|
|
|
|
.insert_mode("Std", log::Std); |
|
|
|
|
|
|
|
|
|
#[cfg(feature = "color-log")] |
|
|
|
|
let lg = lg.insert_mode("Color", log::Color).set_mode("Color").unwrap(); |
|
|
|
|
|
|
|
|
|
trace!(&lg); |
|
|
|
|
|
|
|
|
|
let (conf, lg) = if let Ok(file) = std::fs::File::open("blonkus.yaml") { |
|
|
|
|
let conf: Result<Conf, _> = serde_yaml::from_reader(file); |
|
|
|
|
match conf { |
|
|
|
|
Ok(conf) => { |
|
|
|
|
(conf, lg) |
|
|
|
|
} |
|
|
|
|
Err(e) => { |
|
|
|
|
lg!(&lg, Error, "Error loading configuration: {}", e); |
|
|
|
|
(Conf::default(), lg) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
lg!(&lg, Info, "No configuration file available. Using defaults."); |
|
|
|
|
(Conf::default(), lg) |
|
|
|
|
}; |
|
|
|
|
let lg = |
|
|
|
|
lg |
|
|
|
|
.insert_mode("Color", log::Color) |
|
|
|
|
.set_mode("Color") |
|
|
|
|
.unwrap(); |
|
|
|
|
|
|
|
|
|
let conf = conf::Conf::read("blonkus.yaml").unwrap_or_else(|err| { |
|
|
|
|
let level = match err { |
|
|
|
|
conf::ErrConfLoad::NoFile => log::Level::Notice, |
|
|
|
|
_ => log::Level::Error, |
|
|
|
|
}; |
|
|
|
|
lg!(&lg, level, "{}", err); |
|
|
|
|
lg!(&lg, Level::Notice, "Using default configuration."); |
|
|
|
|
conf::Conf::default() |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
if let Err(e) = fallback_main(&conf, &lg) { |
|
|
|
|
lg!(&lg, Critical, "Uncaught error: {}", e); |
|
|
|
|
lg!(&lg, Level::Critical, "Uncaught error: {}", e); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|