demo_vk/graphics/
mod.rs

1pub mod streaming_renderer;
2pub mod vulkan;
3
4use {
5    crate::graphics::vulkan::VulkanContext, ash::vk, bon::builder,
6    nalgebra::Matrix4,
7};
8
9pub fn ortho_projection(aspect: f32, height: f32) -> Matrix4<f32> {
10    let w = height * aspect;
11    let h = height;
12    #[rustfmt::skip]
13    let projection = Matrix4::new(
14        2.0 / w,  0.0,     0.0, 0.0,
15        0.0,     -2.0 / h, 0.0, 0.0,
16        0.0,      0.0,     1.0, 0.0,
17        0.0,      0.0,     0.0, 1.0,
18    );
19    projection
20}
21
22/// Write a pipeline barrier to the command buffer to transition the image
23/// layout.
24#[builder]
25pub fn image_memory_barrier(
26    ctx: &VulkanContext,
27    command_buffer: vk::CommandBuffer,
28    image: vk::Image,
29    old_layout: vk::ImageLayout,
30    new_layout: vk::ImageLayout,
31    src_access_mask: vk::AccessFlags,
32    dst_access_mask: vk::AccessFlags,
33    #[builder(default = vk::PipelineStageFlags::ALL_COMMANDS)]
34    src_stage_mask: vk::PipelineStageFlags,
35    #[builder(default = vk::PipelineStageFlags::ALL_COMMANDS)]
36    dst_stage_mask: vk::PipelineStageFlags,
37) {
38    let is_depth = dst_access_mask
39        .contains(vk::AccessFlags::DEPTH_STENCIL_ATTACHMENT_READ)
40        || dst_access_mask
41            .contains(vk::AccessFlags::DEPTH_STENCIL_ATTACHMENT_WRITE)
42        || src_access_mask
43            .contains(vk::AccessFlags::DEPTH_STENCIL_ATTACHMENT_READ)
44        || src_access_mask
45            .contains(vk::AccessFlags::DEPTH_STENCIL_ATTACHMENT_WRITE);
46    let image_memory_barrier = vk::ImageMemoryBarrier {
47        old_layout,
48        new_layout,
49        src_access_mask,
50        dst_access_mask,
51        image,
52        subresource_range: vk::ImageSubresourceRange {
53            aspect_mask: if is_depth {
54                vk::ImageAspectFlags::DEPTH
55            } else {
56                vk::ImageAspectFlags::COLOR
57            },
58            base_mip_level: 0,
59            level_count: 1,
60            base_array_layer: 0,
61            layer_count: 1,
62        },
63        ..Default::default()
64    };
65    unsafe {
66        ctx.cmd_pipeline_barrier(
67            command_buffer,
68            src_stage_mask,
69            dst_stage_mask,
70            vk::DependencyFlags::empty(),
71            &[],
72            &[],
73            &[image_memory_barrier],
74        );
75    }
76}