diff --git a/src/gfx_api.rs b/src/gfx_api.rs index 3bb4acba..ca7cadac 100644 --- a/src/gfx_api.rs +++ b/src/gfx_api.rs @@ -257,23 +257,8 @@ pub enum ResetStatus { pub trait GfxFramebuffer: Debug { fn physical_size(&self) -> (i32, i32); - fn full_region(&self) -> Region { - let (width, height) = self.physical_size(); - Region::new2(Rect::new_sized_unchecked(0, 0, width, height)) - } - - fn render( - &self, - acquire_sync: AcquireSync, - release_sync: ReleaseSync, - ops: &[GfxApiOpt], - clear: Option<&Color>, - ) -> Result, GfxError> { - self.render_with_region(acquire_sync, release_sync, ops, clear, &self.full_region()) - } - fn render_with_region( - &self, + self: Rc, acquire_sync: AcquireSync, release_sync: ReleaseSync, ops: &[GfxApiOpt], @@ -300,8 +285,24 @@ pub trait GfxInternalFramebuffer: GfxFramebuffer { } impl dyn GfxFramebuffer { + pub fn render( + self: &Rc, + acquire_sync: AcquireSync, + release_sync: ReleaseSync, + ops: &[GfxApiOpt], + clear: Option<&Color>, + ) -> Result, GfxError> { + self.clone() + .render_with_region(acquire_sync, release_sync, ops, clear, &self.full_region()) + } + + fn full_region(&self) -> Region { + let (width, height) = self.physical_size(); + Region::new2(Rect::new_sized_unchecked(0, 0, width, height)) + } + pub fn clear( - &self, + self: &Rc, acquire_sync: AcquireSync, release_sync: ReleaseSync, ) -> Result, GfxError> { @@ -309,7 +310,7 @@ impl dyn GfxFramebuffer { } pub fn clear_with( - &self, + self: &Rc, acquire_sync: AcquireSync, release_sync: ReleaseSync, r: f32, @@ -334,7 +335,7 @@ impl dyn GfxFramebuffer { } pub fn copy_texture( - &self, + self: &Rc, fb_acquire_sync: AcquireSync, fb_release_sync: ReleaseSync, texture: &Rc, @@ -365,7 +366,7 @@ impl dyn GfxFramebuffer { } pub fn render_custom( - &self, + self: &Rc, acquire_sync: AcquireSync, release_sync: ReleaseSync, scale: Scale, @@ -407,13 +408,13 @@ impl dyn GfxFramebuffer { } pub fn perform_render_pass( - &self, + self: &Rc, acquire_sync: AcquireSync, release_sync: ReleaseSync, pass: &GfxRenderPass, region: &Region, ) -> Result, GfxError> { - self.render_with_region( + self.clone().render_with_region( acquire_sync, release_sync, &pass.ops, @@ -423,7 +424,7 @@ impl dyn GfxFramebuffer { } pub fn render_output( - &self, + self: &Rc, acquire_sync: AcquireSync, release_sync: ReleaseSync, node: &OutputNode, @@ -449,7 +450,7 @@ impl dyn GfxFramebuffer { } pub fn render_node( - &self, + self: &Rc, acquire_sync: AcquireSync, release_sync: ReleaseSync, node: &dyn Node, @@ -478,7 +479,7 @@ impl dyn GfxFramebuffer { } pub fn render_hardware_cursor( - &self, + self: &Rc, acquire_sync: AcquireSync, release_sync: ReleaseSync, cursor: &dyn Cursor, diff --git a/src/gfx_apis/gl/renderer/framebuffer.rs b/src/gfx_apis/gl/renderer/framebuffer.rs index 8da5ccbe..edd03187 100644 --- a/src/gfx_apis/gl/renderer/framebuffer.rs +++ b/src/gfx_apis/gl/renderer/framebuffer.rs @@ -100,14 +100,16 @@ impl GfxFramebuffer for Framebuffer { } fn render_with_region( - &self, + self: Rc, acquire_sync: AcquireSync, _release_sync: ReleaseSync, ops: &[GfxApiOpt], clear: Option<&Color>, _region: &Region, ) -> Result, GfxError> { - self.render(acquire_sync, ops, clear).map_err(|e| e.into()) + (*self) + .render(acquire_sync, ops, clear) + .map_err(|e| e.into()) } fn format(&self) -> &'static Format { diff --git a/src/gfx_apis/vulkan/image.rs b/src/gfx_apis/vulkan/image.rs index 79292272..197577f2 100644 --- a/src/gfx_apis/vulkan/image.rs +++ b/src/gfx_apis/vulkan/image.rs @@ -531,7 +531,7 @@ impl GfxFramebuffer for VulkanImage { } fn render_with_region( - &self, + self: Rc, acquire_sync: AcquireSync, release_sync: ReleaseSync, ops: &[GfxApiOpt], @@ -539,7 +539,7 @@ impl GfxFramebuffer for VulkanImage { region: &Region, ) -> Result, GfxError> { self.renderer - .execute(self, acquire_sync, release_sync, ops, clear, region) + .execute(&self, acquire_sync, release_sync, ops, clear, region) .map_err(|e| e.into()) } diff --git a/src/gfx_apis/vulkan/renderer.rs b/src/gfx_apis/vulkan/renderer.rs index eb9ad378..f36c64f5 100644 --- a/src/gfx_apis/vulkan/renderer.rs +++ b/src/gfx_apis/vulkan/renderer.rs @@ -158,6 +158,7 @@ pub(super) struct PendingFrame { point: u64, renderer: Rc, cmd: Cell>>, + _fb: Rc, _textures: Vec, wait_semaphores: Cell>>, waiter: Cell>>, @@ -1008,7 +1009,7 @@ impl VulkanRenderer { } } - fn create_pending_frame(self: &Rc, buf: Rc) { + fn create_pending_frame(self: &Rc, buf: Rc, fb: &Rc) { zone!("create_pending_frame"); let point = self.allocate_point(); let mut memory = self.memory.borrow_mut(); @@ -1016,6 +1017,7 @@ impl VulkanRenderer { point, renderer: self.clone(), cmd: Cell::new(Some(buf)), + _fb: fb.clone(), _textures: mem::take(&mut memory.textures), wait_semaphores: Cell::new(mem::take(&mut memory.wait_semaphores)), waiter: Cell::new(None), @@ -1037,7 +1039,7 @@ impl VulkanRenderer { pub fn execute( self: &Rc, - fb: &VulkanImage, + fb: &Rc, fb_acquire_sync: AcquireSync, fb_release_sync: ReleaseSync, opts: &[GfxApiOpt], @@ -1102,7 +1104,7 @@ impl VulkanRenderer { fn try_execute( self: &Rc, - fb: &VulkanImage, + fb: &Rc, fb_acquire_sync: AcquireSync, fb_release_sync: ReleaseSync, opts: &[GfxApiOpt], @@ -1127,7 +1129,7 @@ impl VulkanRenderer { self.submit(buf.buffer)?; self.import_release_semaphore(fb, fb_release_sync); self.store_layouts(fb); - self.create_pending_frame(buf); + self.create_pending_frame(buf, fb); Ok(()) } diff --git a/src/it/test_gfx_api.rs b/src/it/test_gfx_api.rs index 0ec94b1d..1cd262af 100644 --- a/src/it/test_gfx_api.rs +++ b/src/it/test_gfx_api.rs @@ -377,7 +377,7 @@ impl GfxFramebuffer for TestGfxFb { } fn render_with_region( - &self, + self: Rc, _acquire_sync: AcquireSync, _release_sync: ReleaseSync, ops: &[GfxApiOpt],