vulkayes_core/render_pass/
mod.rs1use std::{fmt, ops::Deref};
2
3use ash::{version::DeviceV1_0, vk};
4
5use error::RenderPassError;
6
7use crate::prelude::{Device, HasHandle, HostMemoryAllocator, Transparent, Vrc};
8
9pub mod error;
10pub mod params;
11
12pub mod description;
13
14pub struct RenderPass {
15 device: Vrc<Device>,
16 render_pass: vk::RenderPass,
17 host_memory_allocator: HostMemoryAllocator
18}
19impl RenderPass {
20 pub fn new(
21 device: Vrc<Device>,
22 attachments: &[params::AttachmentDescription],
23 subpasses: &[params::SubpassDescription],
24 dependencies: &[vk::SubpassDependency],
25 host_memory_allocator: HostMemoryAllocator
26 ) -> Result<Vrc<Self>, RenderPassError> {
27 #[cfg(feature = "runtime_implicit_validations")]
28 {
29 if subpasses.len() == 0 {
30 return Err(RenderPassError::SubpassesEmpty)
31 }
32
33 for dependency in dependencies {
34 if dependency.src_stage_mask.is_empty() {
35 return Err(RenderPassError::SrcStageMaskZero)
36 }
37 if dependency.dst_stage_mask.is_empty() {
38 return Err(RenderPassError::DstStageMaskZero)
39 }
40 }
41 }
42
43 let create_info = vk::RenderPassCreateInfo::builder()
44 .attachments(Transparent::transmute_slice_twice(attachments))
45 .subpasses(Transparent::transmute_slice_twice(subpasses))
46 .dependencies(dependencies);
47
48 unsafe { Self::from_create_info(device, create_info, host_memory_allocator) }
49 }
50
51 pub unsafe fn from_create_info(
55 device: Vrc<Device>,
56 create_info: impl Deref<Target = vk::RenderPassCreateInfo>,
57 host_memory_allocator: HostMemoryAllocator
58 ) -> Result<Vrc<Self>, RenderPassError> {
59 if log::log_enabled!(log::Level::Trace) {
60 let create_info = debugize_struct!(
61 create_info;
62 {
63 attachments: *[attachment_count] p_attachments;
64 subpasses: *[subpass_count] p_subpasses;
65 dependencies: *[dependency_count] p_dependencies;
66 }
67 );
68 log_trace_common!(
69 "Creating render pass:",
70 device,
71 create_info.attachments,
72 create_info.subpasses,
73 create_info.dependencies,
74 create_info,
75 host_memory_allocator
76 );
77 }
78
79 let render_pass =
80 device.create_render_pass(create_info.deref(), host_memory_allocator.as_ref())?;
81
82 Ok(Vrc::new(RenderPass {
83 device,
84 render_pass,
85 host_memory_allocator
86 }))
87 }
88
89 #[cfg(feature = "vulkan1_2")]
90 pub unsafe fn from_create_info2(
91 device: Vrc<Device>,
92 create_info: impl Deref<Target = vk::RenderPassCreateInfo2>,
93 host_memory_allocator: HostMemoryAllocator
94 ) -> Result<Vrc<Self>, RenderPassError> {
95 use ash::version::DeviceV1_2;
96
97 log_trace_common!(
98 "Creating render pass 2:",
99 device,
100 create_info.deref(),
101 host_memory_allocator
102 );
103
104 let render_pass =
105 device.create_render_pass2(create_info.deref(), host_memory_allocator.as_ref())?;
106
107 Ok(Vrc::new(RenderPass {
108 device,
109 render_pass,
110 host_memory_allocator
111 }))
112 }
113
114 pub const fn device(&self) -> &Vrc<Device> {
115 &self.device
116 }
117}
118impl_common_handle_traits! {
119 impl HasHandle<vk::RenderPass>, Deref, Borrow, Eq, Hash, Ord for RenderPass {
120 target = { render_pass }
121 }
122}
123impl Drop for RenderPass {
124 fn drop(&mut self) {
125 log_trace_common!("Dropping", self);
126
127 unsafe {
128 self.device
129 .destroy_render_pass(self.render_pass, self.host_memory_allocator.as_ref())
130 }
131 }
132}
133impl fmt::Debug for RenderPass {
134 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
135 f.debug_struct("RenderPass")
136 .field("device", &self.device)
137 .field("render_pass", &self.safe_handle())
138 .field("host_memory_allocator", &self.host_memory_allocator)
139 .finish()
140 }
141}