lambda_platform/gfx/
framebuffer.rs

1use 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/// Framebuffer for the given render backend.
13#[derive(Debug)]
14pub struct Framebuffer<RenderBackend: gfx_hal::Backend> {
15  frame_buffer: RenderBackend::Framebuffer,
16}
17
18impl<RenderBackend: gfx_hal::Backend> Framebuffer<RenderBackend> {
19  /// Destroys the framebuffer from the given GPU.
20  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  /// Retrieve a reference to the internal frame buffer.
31  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  /// Build a frame buffer on a given GPU for the given surface.
43  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}