1use ash::vk::FramebufferCreateInfo;
2
3use crate::{Destroy, Device, ImageView, Instance, NxError, NxResult, RenderPass};
4
5pub struct FrameBufferDescriptor<'a> {
7 width: u32,
8 height: u32,
9 render_pass: Option<&'a RenderPass>,
10 image_view: Option<&'a ImageView>,
11}
12
13impl<'a> FrameBufferDescriptor<'a> {
14 #[inline]
15 pub const fn empty() -> Self {
17 Self {
18 width: 100,
19 height: 100,
20 render_pass: None,
21 image_view: None,
22 }
23 }
24
25 #[inline]
26 pub fn width(mut self, width: u32) -> Self {
28 self.width = width;
29 self
30 }
31
32 #[inline]
33 pub fn height(mut self, height: u32) -> Self {
35 self.height = height;
36 self
37 }
38
39 #[inline]
40 #[must_use]
41 pub fn image_view(mut self, image_view: &'a ImageView) -> Self {
43 self.image_view = Some(image_view);
44 self
45 }
46
47 #[inline]
48 #[must_use]
49 pub fn render_pass(mut self, render_pass: &'a RenderPass) -> Self {
51 self.render_pass = Some(render_pass);
52 self
53 }
54}
55
56pub struct FrameBuffer {
57 pub(crate) frame_buffer: ash::vk::Framebuffer,
58}
59
60impl FrameBuffer {
61 #[inline]
62 pub fn new(device: &Device, descriptor: &FrameBufferDescriptor) -> NxResult<Self> {
68 let render_pass = descriptor.render_pass.unwrap();
69 let image_view = descriptor.image_view.unwrap();
70 let create_info = FramebufferCreateInfo::builder()
71 .width(descriptor.width)
72 .height(descriptor.height)
73 .layers(1)
74 .render_pass(render_pass.render_pass)
75 .attachments(&[image_view.image_view])
76 .build();
77 let frame_buffer = match unsafe { device.device.create_framebuffer(&create_info, None) } {
78 Ok(x) => x,
79 Err(e) => match e {
80 ash::vk::Result::ERROR_OUT_OF_DEVICE_MEMORY => Err(NxError::OutOfDeviceMemory),
81 ash::vk::Result::ERROR_OUT_OF_HOST_MEMORY => Err(NxError::OutOfHostMemory),
82 _ => Err(NxError::Unknown),
83 }?,
84 };
85 Ok(Self { frame_buffer })
86 }
87}
88
89impl Destroy for FrameBuffer {
90 fn instance(&self, _: &Instance) {}
91
92 fn device(&self, device: &Device) {
93 unsafe {
94 device.device.destroy_framebuffer(self.frame_buffer, None);
95 }
96 }
97}