vka 0.0.4

A minimal vulkan wrapper
Documentation
#![allow(unused, deprecated)]
use std::time::Duration;
use std::time::Instant;

use ash::vk;
use glam::vec4;

pub use vka::*;
use winit::dpi::PhysicalSize;
use winit::event::Event;
use winit::event::WindowEvent;
use winit::event_loop;
use winit::event_loop::EventLoop;
use winit::platform::wayland::WindowAttributesExtWayland;
use winit::window::WindowAttributes;

pub fn main() -> vka::Result<()> {
    env_logger::init();
    let event_loop = EventLoop::new()?;
    let window = event_loop.create_window(WindowAttributes::default().with_inner_size(PhysicalSize::new(800, 600)))?;
    let rd = RenderingDevice::new(&RenderingDeviceDesc::with_window(&window).with_gpu_validation())?;
    let color_image = rd.image_create(&ImageDesc::new_2d(vk::Format::R8G8B8A8_UNORM, 128, 128).usage(vk::ImageUsageFlags::COLOR_ATTACHMENT))?;
    let rpass = rd.render_pass_create(&vka::RenderPassDesc {
        attachments: &[vka::Attachment {
            format: vk::Format::B8G8R8A8_UNORM,
            samples: 1,
            layout: vk::ImageLayout::COLOR_ATTACHMENT_OPTIMAL,
            ops: vka::Operations::Color {
                load: vka::LoadOp::Clear(vec4(1.0, 1.0, 0.0, 1.0)),
                store: vka::StoreOp::Store,
            },
        }],
        subpasses: &[vka::Subpass {
            colors: &[(0, None)],
            bind_point: vk::PipelineBindPoint::GRAPHICS,
            ..Default::default()
        }],
    });

    let mut fps_timer = Instant::now();
    let mut frame_count = 0;
    let mut fps = 0.0;

    event_loop.run(|event, event_loop| match event {
        Event::WindowEvent { event, .. } => match event {
            WindowEvent::RedrawRequested => {
                let frame = rd.acquire_swapchain_image().unwrap();
                rd.record(|dev, cmd| {
                    rd.begin_render_pass(
                        cmd,
                        &rpass,
                        &[rd.image_full_view(&frame)],
                        vk::Rect2D {
                            offset: vk::Offset2D::default(),
                            extent: rd.get_swapchain_extent(),
                        },
                    );
                    rd.end_render_pass(cmd, &rpass);
                    rd.barrier_image(cmd, &frame, vk::ImageLayout::PRESENT_SRC_KHR);
                });
                rd.submit();
                rd.present();

                frame_count += 1;
                let elapsed = fps_timer.elapsed();
                if elapsed >= Duration::from_secs(1) {
                    fps = frame_count as f64 / elapsed.as_secs_f64();
                    println!("FPS: {:.2}", fps);
                    frame_count = 0;
                    fps_timer = Instant::now();
                }

                window.request_redraw();
            }
            WindowEvent::CloseRequested => {
                event_loop.exit();
            }
            _ => (),
        },
        _ => (),
    });
    Ok(())
}