librashader/librashader-runtime-vk/src/framebuffer.rs

147 lines
4.5 KiB
Rust
Raw Normal View History

2022-12-07 02:05:10 -05:00
use crate::error;
2023-01-09 22:54:54 -05:00
use crate::filter_chain::Vulkan;
2022-12-11 01:06:28 -05:00
use crate::renderpass::VulkanRenderPass;
2023-01-09 22:54:54 -05:00
use crate::texture::OwnedTexture;
2022-12-21 21:39:31 -05:00
use ash::vk;
2023-01-09 22:54:54 -05:00
use ash::vk::{ImageAspectFlags, ImageViewType};
2022-12-21 21:39:31 -05:00
use librashader_common::Size;
2022-12-07 02:05:10 -05:00
pub struct VulkanFramebuffer {
pub device: ash::Device,
pub framebuffer: vk::Framebuffer,
}
impl Drop for VulkanFramebuffer {
fn drop(&mut self) {
unsafe {
if self.framebuffer != vk::Framebuffer::null() {
self.device.destroy_framebuffer(self.framebuffer, None);
}
}
}
}
2022-12-22 01:30:14 -05:00
pub struct OwnedFramebuffer {
pub size: Size<u32>,
pub image: OwnedTexture,
pub render_pass: VulkanRenderPass,
pub framebuffer: VulkanFramebuffer,
pub view: vk::ImageView,
}
impl OwnedFramebuffer {
2022-12-21 21:39:31 -05:00
pub fn new(
2022-12-22 01:30:14 -05:00
vulkan: &Vulkan,
2022-12-21 21:39:31 -05:00
size: Size<u32>,
render_pass: VulkanRenderPass,
2022-12-22 01:30:14 -05:00
max_miplevels: u32,
2022-12-21 21:39:31 -05:00
) -> error::Result<Self> {
2022-12-22 01:30:14 -05:00
let image = OwnedTexture::new(vulkan, size, render_pass.format, max_miplevels)?;
let fb_view = image.create_texture_view()?;
let framebuffer = unsafe {
vulkan.device.create_framebuffer(
&vk::FramebufferCreateInfo::builder()
.render_pass(render_pass.handle)
.attachments(&[image.image_view])
2022-12-29 00:50:48 -05:00
.width(image.image.size.width)
.height(image.image.size.height)
2022-12-22 01:30:14 -05:00
.layers(1)
.build(),
None,
)?
2022-12-07 02:05:10 -05:00
};
2022-12-22 01:30:14 -05:00
Ok(OwnedFramebuffer {
size,
image,
view: fb_view,
render_pass,
framebuffer: VulkanFramebuffer {
device: vulkan.device.clone(),
framebuffer,
},
})
2022-12-07 02:05:10 -05:00
}
2022-12-22 01:30:14 -05:00
}
2022-12-07 02:05:10 -05:00
#[derive(Debug, Clone)]
pub(crate) struct OutputFramebuffer {
pub framebuffer: vk::Framebuffer,
2022-12-22 01:30:14 -05:00
pub size: Size<u32>,
pub viewport: vk::Viewport,
2022-12-22 01:30:14 -05:00
}
2022-12-07 02:05:10 -05:00
//
// pub struct OutputFramebuffer<'a> {
// device: ash::Device,
// render_pass: &'a VulkanRenderPass,
// pub handle: vk::Framebuffer,
// pub size: Size<u32>,
// pub image: vk::Image,
// pub image_view: vk::ImageView,
// }
//
// impl<'a> OutputFramebuffer<'a> {
// pub fn new(vulkan: &Vulkan, render_pass: &'a VulkanRenderPass, image: vk::Image, size: Size<u32>) -> error::Result<OutputFramebuffer<'a>> {
// let image_subresource = vk::ImageSubresourceRange::builder()
// .base_mip_level(0)
// .base_array_layer(0)
// .level_count(1)
// .layer_count(1)
// .aspect_mask(ImageAspectFlags::COLOR)
// .build();
//
// let swizzle_components = vk::ComponentMapping::builder()
// .r(vk::ComponentSwizzle::R)
// .g(vk::ComponentSwizzle::G)
// .b(vk::ComponentSwizzle::B)
// .a(vk::ComponentSwizzle::A)
// .build();
//
// let mut view_info = vk::ImageViewCreateInfo::builder()
// .view_type(ImageViewType::TYPE_2D)
// .format(render_pass.format.into())
// .image(image.clone())
// .subresource_range(image_subresource)
// .components(swizzle_components)
// .build();
//
// let image_view = unsafe { vulkan.device.create_image_view(&view_info, None)? };
//
// let framebuffer = unsafe {
// vulkan.device.create_framebuffer(
// &vk::FramebufferCreateInfo::builder()
// .render_pass(render_pass.handle)
// .attachments(&[image_view])
// .width(size.width)
// .height(size.height)
// .layers(1)
// .build(),
// None,
// )?
// };
//
// Ok(OutputFramebuffer {
// device: vulkan.device.clone(),
// image,
// image_view,
// render_pass,
// size,
// handle: framebuffer,
// })
// }
//
// pub fn get_renderpass_begin_info(&self, area: vk::Rect2D, clear: Option<&[vk::ClearValue]>) -> vk::RenderPassBeginInfo {
// let mut builder = vk::RenderPassBeginInfo::builder()
// .render_pass(self.render_pass.handle)
// .framebuffer(self.handle)
// .render_area(area);
//
// if let Some(clear) = clear {
// builder = builder.clear_values(clear)
// }
//
// builder.build()
// }
2023-01-09 22:54:54 -05:00
// }