bedrock/
framebuffer.rs

1//! Vulkan Framebuffer
2
3use crate::ffi_helper::slice_as_ptr_empty_null;
4use crate::*;
5use core::ops::*;
6use derives::implements;
7
8/// Opaque handle to a framebuffer object
9#[derive(VkHandle, VkObject)]
10#[VkObject(type = VkFramebuffer::OBJECT_TYPE)]
11pub struct FramebufferObject<'r, Device: VkHandle<Handle = VkDevice>> {
12    #[handle]
13    pub(crate) handle: VkFramebuffer,
14    pub(crate) parent: Device,
15    pub(crate) _under_resources: core::marker::PhantomData<&'r [Box<dyn crate::VkHandle<Handle = VkImageView> + 'r>]>,
16}
17#[implements]
18impl<Device: VkHandle<Handle = VkDevice>> Drop for FramebufferObject<'_, Device> {
19    #[inline(always)]
20    fn drop(&mut self) {
21        unsafe {
22            crate::vkfn::destroy_framebuffer(self.parent.native_ptr(), self.handle, std::ptr::null());
23        }
24    }
25}
26unsafe impl<Device: VkHandle<Handle = VkDevice> + Sync> Sync for FramebufferObject<'_, Device> {}
27unsafe impl<Device: VkHandle<Handle = VkDevice> + Send> Send for FramebufferObject<'_, Device> {}
28impl<Device: VkHandle<Handle = VkDevice>> DeviceChildHandle for FramebufferObject<'_, Device> {
29    #[inline(always)]
30    fn device_handle(&self) -> VkDevice {
31        self.parent.native_ptr()
32    }
33}
34impl<Device: crate::Device> DeviceChild for FramebufferObject<'_, Device> {
35    type ConcreteDevice = Device;
36
37    #[inline(always)]
38    fn device(&self) -> &Self::ConcreteDevice {
39        &self.parent
40    }
41}
42impl<Device: VkHandle<Handle = VkDevice>> Framebuffer for FramebufferObject<'_, Device> {}
43impl<Device: VkHandle<Handle = VkDevice>> FramebufferObject<'_, Device> {
44    /// Constructs from raw values
45    /// # Safety
46    /// the resource must be created from the device and not freed anywhere
47    pub const unsafe fn manage(handle: VkFramebuffer, parent: Device) -> Self {
48        Self {
49            handle,
50            parent,
51            _under_resources: core::marker::PhantomData,
52        }
53    }
54
55    /// Purges the construct (Drop will not be called for this resource)
56    pub const fn unmanage(self) -> (VkFramebuffer, Device) {
57        let h = self.handle;
58        let p = unsafe { core::ptr::read(&self.parent) };
59        core::mem::forget(self);
60
61        (h, p)
62    }
63}
64impl<'r, Device: VkHandle<Handle = VkDevice> + Clone> FramebufferObject<'r, &'_ Device> {
65    /// Owning parent object by cloning it.
66    #[inline(always)]
67    pub fn clone_parent(self) -> FramebufferObject<'r, Device> {
68        let r = FramebufferObject {
69            handle: self.handle,
70            parent: self.parent.clone(),
71            _under_resources: self._under_resources,
72        };
73        core::mem::forget(self);
74
75        r
76    }
77}
78impl<'r, Device: crate::Device> FramebufferObject<'r, Device> {
79    /// Create a new framebuffer object
80    /// # Failures
81    /// On failure, this command returns
82    ///
83    /// * [`VK_ERROR_OUT_OF_HOST_MEMORY`]
84    /// * [`VK_ERROR_OUT_OF_DEVICE_MEMORY`]
85    #[implements]
86    #[inline]
87    pub fn new(device: Device, info: &FramebufferCreateInfo) -> crate::Result<Self> {
88        Ok(unsafe { Self::manage(device.new_framebuffer_raw(info, None)?, device) })
89    }
90}
91
92#[repr(transparent)]
93#[derive(Clone)]
94pub struct FramebufferCreateInfo<'r, 'rs>(
95    VkFramebufferCreateInfo,
96    core::marker::PhantomData<(
97        &'r dyn VkHandle<Handle = VkRenderPass>,
98        &'rs [&'r dyn VkHandle<Handle = VkImageView>],
99    )>,
100);
101impl<'r, 'rs> FramebufferCreateInfo<'r, 'rs> {
102    #[inline(always)]
103    pub fn new(
104        render_pass: &'r (impl VkHandle<Handle = VkRenderPass> + ?Sized),
105        attachments: &'rs [VkHandleRef<'r, VkImageView>],
106        width: u32,
107        height: u32,
108    ) -> Self {
109        Self(
110            VkFramebufferCreateInfo {
111                sType: VkFramebufferCreateInfo::TYPE,
112                pNext: core::ptr::null(),
113                renderPass: render_pass.native_ptr(),
114                flags: 0,
115                attachmentCount: attachments.len() as _,
116                pAttachments: slice_as_ptr_empty_null(attachments) as *const _,
117                width,
118                height,
119                layers: 1,
120            },
121            core::marker::PhantomData,
122        )
123    }
124
125    pub const unsafe fn from_raw(raw: VkFramebufferCreateInfo) -> Self {
126        Self(raw, core::marker::PhantomData)
127    }
128
129    pub const fn into_raw(self) -> VkFramebufferCreateInfo {
130        self.0
131    }
132
133    pub const fn with_layers(mut self, layers: u32) -> Self {
134        self.0.layers = layers;
135        self
136    }
137}
138
139pub trait Framebuffer: VkHandle<Handle = VkFramebuffer> {}
140DerefContainerBracketImpl!(for Framebuffer {});
141GuardsImpl!(for Framebuffer {});