vkobject_rs/
framebuffer.rs

1
2use crate::prelude::*;
3use std::{
4	fmt::{self, Debug, Formatter},
5	ptr::null,
6	sync::Arc,
7};
8
9/// A framebuffer
10pub struct VulkanFramebuffer {
11	/// The `VulkanDevice` is the associated device
12	pub device: Arc<VulkanDevice>,
13
14	/// The size of the framebuffer
15	size: VkExtent2D,
16
17	/// The handle to the framebuffer
18	framebuffer: VkFramebuffer,
19}
20
21impl VulkanFramebuffer {
22	/// Create the `VulkanFramebuffer`
23	pub fn new_from_views(device: Arc<VulkanDevice>, extent: &VkExtent2D, renderpass: VkRenderPass, attachments: &[VkImageView]) -> Result<Self, VulkanError> {
24		let vkcore = device.vkcore.clone();
25		let framebuffer_ci = VkFramebufferCreateInfo {
26			sType: VkStructureType::VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
27			pNext: null(),
28			flags: 0,
29			renderPass: renderpass,
30			attachmentCount: attachments.len() as u32,
31			pAttachments: attachments.as_ptr(),
32			width: extent.width,
33			height: extent.height,
34			layers: 1,
35		};
36		let mut framebuffer: VkFramebuffer = null();
37		vkcore.vkCreateFramebuffer(device.get_vk_device(), &framebuffer_ci, null(), &mut framebuffer)?;
38		Ok(Self {
39			device,
40			size: *extent,
41			framebuffer,
42		})
43	}
44
45	/// Create the `VulkanFramebuffer` from a bunch of textures
46	pub fn new(device: Arc<VulkanDevice>, extent: &VkExtent2D, renderpass: &VulkanRenderPass, attachments: &[Arc<VulkanTexture>]) -> Result<Self, VulkanError> {
47		let attachments: Vec<VkImageView> = attachments.iter().map(|t|t.get_vk_image_view()).collect();
48		Self::new_from_views(device, extent, renderpass.get_vk_renderpass(), &attachments)
49	}
50
51	/// Get the size of the framebuffer
52	pub fn get_size(&self) -> &VkExtent2D {
53		&self.size
54	}
55
56	/// Get the `VkFramebuffer`
57	pub(crate) fn get_vk_framebuffer(&self) -> VkFramebuffer {
58		self.framebuffer
59	}
60}
61
62impl Debug for VulkanFramebuffer {
63	fn fmt(&self, f: &mut Formatter) -> fmt::Result {
64		f.debug_struct("VulkanFramebuffer")
65		.field("size", &self.size)
66		.field("framebuffer", &self.framebuffer)
67		.finish()
68	}
69}
70
71impl Drop for VulkanFramebuffer {
72	fn drop(&mut self) {
73		proceed_run(self.device.vkcore.vkDestroyFramebuffer(self.device.get_vk_device(), self.framebuffer, null()))
74	}
75}
76
77unsafe impl Send for VulkanFramebuffer {}
78unsafe impl Sync for VulkanFramebuffer {}