vulkayes_core/framebuffer/
mod.rs

1use std::{fmt, num::NonZeroU32, ops::Deref};
2
3use ash::{version::DeviceV1_0, vk};
4
5use crate::prelude::{HasHandle, HostMemoryAllocator, ImageView, RenderPass, Vrc};
6
7pub mod error;
8
9pub struct Framebuffer {
10	render_pass: Vrc<RenderPass>,
11	attachments: Vec<Vrc<ImageView>>,
12	framebuffer: vk::Framebuffer,
13	host_memory_allocator: HostMemoryAllocator
14}
15impl Framebuffer {
16	pub fn new(
17		render_pass: Vrc<RenderPass>,
18		attachments: impl Iterator<Item = Vrc<ImageView>>,
19		dimensions: [NonZeroU32; 2],
20		layers: NonZeroU32,
21		host_memory_allocator: HostMemoryAllocator
22	) -> Result<Vrc<Self>, error::FramebufferError> {
23		let attachments = collect_iter_faster!(attachments, 8);
24
25		#[cfg(feature = "runtime_implicit_validations")]
26		{
27			if !crate::util::validations::validate_all_match(
28				std::iter::once(render_pass.device())
29					.chain(attachments.iter().map(|a| a.image().device()))
30			) {
31				return Err(error::FramebufferError::RenderPassAttachmentsDeviceMismatch)
32			}
33		};
34
35		let attachment_handles = collect_iter_faster!(attachments.iter().map(|a| a.handle()), 8);
36
37		let create_info = vk::FramebufferCreateInfo::builder()
38			.render_pass(render_pass.handle())
39			.attachments(&attachment_handles)
40			.width(dimensions[0].get())
41			.height(dimensions[1].get())
42			.layers(layers.get());
43
44		unsafe {
45			Self::from_create_info(render_pass, attachments, create_info, host_memory_allocator)
46		}
47	}
48
49	pub unsafe fn from_create_info(
50		render_pass: Vrc<RenderPass>,
51		attachments: Vec<Vrc<ImageView>>,
52		create_info: impl Deref<Target = vk::FramebufferCreateInfo>,
53		host_memory_allocator: HostMemoryAllocator
54	) -> Result<Vrc<Self>, error::FramebufferError> {
55		log_trace_common!(
56			"Creating framebuffer:",
57			render_pass,
58			create_info.deref(),
59			host_memory_allocator
60		);
61
62		let framebuffer = render_pass
63			.device()
64			.create_framebuffer(create_info.deref(), host_memory_allocator.as_ref())?;
65
66		Ok(Vrc::new(Framebuffer {
67			render_pass,
68			attachments,
69			framebuffer,
70			host_memory_allocator
71		}))
72	}
73
74	pub const fn render_pass(&self) -> &Vrc<RenderPass> {
75		&self.render_pass
76	}
77
78	pub const fn attachments(&self) -> &Vec<Vrc<ImageView>> {
79		&self.attachments
80	}
81}
82impl_common_handle_traits! {
83	impl HasHandle<vk::Framebuffer>, Deref, Borrow, Eq, Hash, Ord for Framebuffer {
84		target = { framebuffer }
85	}
86}
87impl Drop for Framebuffer {
88	fn drop(&mut self) {
89		log_trace_common!("Dropping", self);
90
91		unsafe {
92			self.render_pass
93				.device()
94				.destroy_framebuffer(self.framebuffer, self.host_memory_allocator.as_ref())
95		}
96	}
97}
98impl fmt::Debug for Framebuffer {
99	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
100		f.debug_struct("Framebuffer")
101			.field("render_pass", &self.render_pass)
102			.field("attachments", &self.attachments)
103			.field("framebuffer", &self.safe_handle())
104			.field("host_memory_allocator", &self.host_memory_allocator)
105			.finish()
106	}
107}