vkobject_rs/
framebuffer.rs1
2use crate::prelude::*;
3use std::{
4 fmt::{self, Debug, Formatter},
5 ptr::null,
6 sync::Arc,
7};
8
9pub struct VulkanFramebuffer {
11 pub device: Arc<VulkanDevice>,
13
14 size: VkExtent2D,
16
17 framebuffer: VkFramebuffer,
19}
20
21impl VulkanFramebuffer {
22 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 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 pub fn get_size(&self) -> &VkExtent2D {
53 &self.size
54 }
55
56 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 {}