Skip to content

Commit d980206

Browse files
committed
[update] the surface to be behind a reference counted pointer for rendering and update it's destructor to work properly.
1 parent 739e98b commit d980206

3 files changed

Lines changed: 19 additions & 11 deletions

File tree

crates/lambda-platform/src/gfx/command.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use std::{
22
borrow::Borrow,
33
collections::HashMap,
44
ops::Range,
5+
rc::Rc,
56
};
67

78
use gfx_hal::{
@@ -77,8 +78,8 @@ pub enum Command<RenderBackend: gfx_hal::Backend> {
7778
},
7879
BeginRenderPass {
7980
render_pass: super::render_pass::RenderPass<RenderBackend>,
80-
surface: Box<super::surface::Surface<RenderBackend>>,
81-
frame_buffer: Box<super::framebuffer::Framebuffer<RenderBackend>>,
81+
surface: Rc<super::surface::Surface<RenderBackend>>,
82+
frame_buffer: Rc<super::framebuffer::Framebuffer<RenderBackend>>,
8283
viewport: ViewPort,
8384
},
8485
/// Ends a currently active render pass.

lambda/src/core/render/command.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ impl RenderCommand {
6666
viewport,
6767
} => PlatformRenderCommand::BeginRenderPass {
6868
render_pass: render_pass.into_gfx_render_pass(),
69-
surface: todo!(),
69+
surface: surface_for_context(render_context),
7070
frame_buffer: todo!("FrameBuffer"),
7171
viewport: viewport.into_gfx_viewport(),
7272
},

lambda/src/core/render/mod.rs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ pub mod viewport;
66
pub mod window;
77

88
pub mod internal {
9+
use std::{
10+
borrow::Borrow,
11+
rc::Rc,
12+
};
13+
914
use lambda_platform::gfx::api::RenderingAPI as RenderContext;
1015
pub type RenderBackend = RenderContext::Backend;
1116

@@ -60,14 +65,14 @@ pub mod internal {
6065
/// Gets the surface for the given render context.
6166
pub fn surface_for_context(
6267
context: &super::RenderContext,
63-
) -> &Surface<RenderBackend> {
64-
return &context.surface;
68+
) -> Rc<Surface<RenderBackend>> {
69+
return context.surface.clone();
6570
}
6671
}
6772

6873
use std::{
69-
borrow::Borrow,
7074
mem::swap,
75+
rc::Rc,
7176
};
7277

7378
use lambda_platform::gfx::{
@@ -152,7 +157,7 @@ impl RenderContextBuilder {
152157
name,
153158
instance,
154159
gpu,
155-
surface: Box::new(surface),
160+
surface: Rc::new(surface),
156161
submission_fence: Some(submission_fence),
157162
render_semaphore: Some(render_semaphore),
158163
command_pool: Some(command_pool),
@@ -168,7 +173,7 @@ pub struct RenderContext {
168173
name: String,
169174
instance: internal::Instance<internal::RenderBackend>,
170175
gpu: internal::Gpu<internal::RenderBackend>,
171-
surface: Box<internal::Surface<internal::RenderBackend>>,
176+
surface: Rc<internal::Surface<internal::RenderBackend>>,
172177
submission_fence:
173178
Option<internal::RenderSubmissionFence<internal::RenderBackend>>,
174179
render_semaphore: Option<internal::RenderSemaphore<internal::RenderBackend>>,
@@ -193,8 +198,10 @@ impl RenderContext {
193198
render_pass.take().unwrap().destroy(&self);
194199
}
195200

196-
self.surface.remove_swapchain(&self.gpu);
197-
self.surface.destroy(&self.instance);
201+
// Takes the inner surface and destroys it.
202+
let mut surface = Rc::try_unwrap(self.surface).ok().unwrap();
203+
surface.remove_swapchain(&self.gpu);
204+
surface.destroy(&self.instance);
198205
}
199206

200207
/// Allocates a command buffer and records commands to the GPU.
@@ -220,7 +227,7 @@ impl RenderContext {
220227
self
221228
.gpu
222229
.render_to_surface(
223-
&mut self.surface,
230+
Rc::get_mut(&mut self.surface).expect(""),
224231
self.render_semaphore.as_mut().unwrap(),
225232
)
226233
.expect("Failed to render to the surface");

0 commit comments

Comments
 (0)