vulkayes_core/render_pass/
mod.rs

1use 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	/// ### Safety
52	///
53	/// See <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkCreateRenderPass.html>.
54	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}