nexg/
frame_buffer.rs

1use ash::vk::FramebufferCreateInfo;
2
3use crate::{Destroy, Device, ImageView, Instance, NxError, NxResult, RenderPass};
4
5/// Stores information needed to create a FrameBuffer.
6pub 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    /// Initializes a new descriptor with default values.
16    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    /// Specifies the width of the FrameBuffer.
27    pub fn width(mut self, width: u32) -> Self {
28        self.width = width;
29        self
30    }
31
32    #[inline]
33    /// Specifies the height of the FrameBuffer.
34    pub fn height(mut self, height: u32) -> Self {
35        self.height = height;
36        self
37    }
38
39    #[inline]
40    #[must_use]
41    /// ImageView used to create the FrameBuffer.
42    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    /// RenderPass used to create the FrameBuffer.
50    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    /// Create a new Framebuffer.
63    /// # Arguments
64    ///
65    /// * `device` - Reference to the appropriate device.
66    /// * `descriptor` - Appropriate FenceDescriptor.
67    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}