vulkayes_core/framebuffer/
mod.rs1use 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}