1use crate::ffi_helper::slice_as_ptr_empty_null;
4use crate::*;
5use core::ops::*;
6use derives::implements;
7
8#[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 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 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 #[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 #[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 {});