97 lines
3.1 KiB
Rust
97 lines
3.1 KiB
Rust
pub mod instance;
|
|
pub mod render;
|
|
|
|
pub mod frame_counter;
|
|
|
|
pub use instance::EngineInstance;
|
|
use instance::{window::Resolution, Window};
|
|
|
|
use ash::vk;
|
|
|
|
pub const WINDOW_WIDTH: u32 = 1280;
|
|
pub const WINDOW_HEIGHT: u32 = 720;
|
|
|
|
pub const DEFAULT_RES: Resolution = Resolution {
|
|
width: WINDOW_WIDTH,
|
|
height: WINDOW_HEIGHT,
|
|
};
|
|
|
|
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
dotenvy::dotenv().ok();
|
|
env_logger::init();
|
|
|
|
let window = Window::init(DEFAULT_RES.clone())?;
|
|
let mut instance = EngineInstance::init(&window)?;
|
|
|
|
render::render_loop(&window, &mut instance, move |e| {
|
|
let next_image = (e.swapchain.current_image + 1) % e.swapchain.amount_of_images as usize;
|
|
|
|
unsafe {
|
|
e.device
|
|
.wait_for_fences(
|
|
&[e.swapchain.may_begin_drawing[e.swapchain.current_image]],
|
|
true,
|
|
std::u64::MAX,
|
|
)
|
|
.expect("fence-waiting");
|
|
|
|
e.device
|
|
.reset_fences(&[e.swapchain.may_begin_drawing[e.swapchain.current_image]])
|
|
.expect("resetting fences");
|
|
}
|
|
|
|
let (image_index, _) = unsafe {
|
|
e.swapchain
|
|
.swapchain_loader
|
|
.acquire_next_image(
|
|
e.swapchain.swapchain,
|
|
std::u64::MAX,
|
|
e.swapchain.image_available[e.swapchain.current_image],
|
|
vk::Fence::null(),
|
|
)
|
|
.expect("image acquisition trouble")
|
|
};
|
|
|
|
let semaphores_available = [e.swapchain.image_available[e.swapchain.current_image]];
|
|
let waiting_stages = [vk::PipelineStageFlags::COLOR_ATTACHMENT_OUTPUT];
|
|
let semaphores_finished = [e.swapchain.rendering_finished[e.swapchain.current_image]];
|
|
let commandbuffers = [e.commandbuffers[image_index as usize]];
|
|
let submit_info = [vk::SubmitInfo::default()
|
|
.wait_semaphores(&semaphores_available)
|
|
.wait_dst_stage_mask(&waiting_stages)
|
|
.command_buffers(&commandbuffers)
|
|
.signal_semaphores(&semaphores_finished)];
|
|
|
|
let queue = e.queues.graphics_queue.as_ref().unwrap().queue;
|
|
unsafe {
|
|
e.device
|
|
.queue_submit(
|
|
queue,
|
|
&submit_info,
|
|
e.swapchain.may_begin_drawing[e.swapchain.current_image],
|
|
)
|
|
.expect("queue submission");
|
|
};
|
|
|
|
let swapchains = [e.swapchain.swapchain];
|
|
let indices = [image_index];
|
|
let present_info = vk::PresentInfoKHR::default()
|
|
.wait_semaphores(&semaphores_finished)
|
|
.swapchains(&swapchains)
|
|
.image_indices(&indices);
|
|
unsafe {
|
|
e.swapchain
|
|
.swapchain_loader
|
|
.queue_present(queue, &present_info)
|
|
.expect("queue presentation");
|
|
};
|
|
|
|
let frameid = e.framecount.frame_count();
|
|
let frametime = e.framecount.new_frame();
|
|
println!("frame {}: {} ms", frameid, frametime.as_secs_f32() * 1000.0);
|
|
|
|
e.swapchain.current_image = next_image;
|
|
})?;
|
|
|
|
Ok(())
|
|
}
|