lambda_platform/gfx/
framebuffer.rs1use gfx_hal::{
2 device::Device,
3 image::Extent,
4};
5
6use super::{
7 gpu::Gpu,
8 render_pass::RenderPass,
9 surface::Surface,
10};
11
12#[derive(Debug)]
14pub struct Framebuffer<RenderBackend: gfx_hal::Backend> {
15 frame_buffer: RenderBackend::Framebuffer,
16}
17
18impl<RenderBackend: gfx_hal::Backend> Framebuffer<RenderBackend> {
19 pub fn destroy(self, gpu: &super::gpu::Gpu<RenderBackend>) {
21 unsafe {
22 gpu
23 .internal_logical_device()
24 .destroy_framebuffer(self.frame_buffer);
25 }
26 }
27}
28
29impl<RenderBackend: gfx_hal::Backend> Framebuffer<RenderBackend> {
30 pub(super) fn internal_frame_buffer(&self) -> &RenderBackend::Framebuffer {
32 return &self.frame_buffer;
33 }
34}
35pub struct FramebufferBuilder {}
36
37impl FramebufferBuilder {
38 pub fn new() -> Self {
39 return Self {};
40 }
41
42 pub fn build<RenderBackend: gfx_hal::Backend>(
44 self,
45 gpu: &mut Gpu<RenderBackend>,
46 render_pass: &RenderPass<RenderBackend>,
47 surface: &Surface<RenderBackend>,
48 ) -> Framebuffer<RenderBackend> {
49 let (width, height) = surface.size().expect("A surface without a swapchain cannot be used in a framebeen configured with a swapchain");
50 let image = surface
51 .internal_frame_buffer_attachment()
52 .expect("A surface without a swapchain cannot be used in a frame.");
53
54 let frame_buffer = unsafe {
55 gpu
56 .internal_logical_device()
57 .create_framebuffer(
58 render_pass.internal_render_pass(),
59 vec![image].into_iter(),
60 Extent {
61 width,
62 height,
63 depth: 1,
64 },
65 )
66 .expect("Failed to create a framebuffer")
67 };
68 return Framebuffer { frame_buffer };
69 }
70}