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#[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}