From 536484e9dae289cc5590d35e18096ba24e7d0f1f Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Tue, 27 Aug 2024 12:21:04 -0700 Subject: [PATCH] screencopy: Use buffer age of `0` for render to temporary buffer It seems we allocate a new `GlesRenderbuffer` every time we screencopy to an shm buffer. We probably should use a more complicated approach to do proper damage tracking without any unnecessary copies, and re-using the GPU buffer, but as long as this allocates a buffer the age of that buffer should be treated as `0`. Fixes corruption in cosmic-workspaces when shm screencopy is used. (For instance, when Cosmic is run with software rendering.) --- src/wayland/handlers/screencopy/render.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/wayland/handlers/screencopy/render.rs b/src/wayland/handlers/screencopy/render.rs index 592406fe..5db5f656 100644 --- a/src/wayland/handlers/screencopy/render.rs +++ b/src/wayland/handlers/screencopy/render.rs @@ -219,7 +219,7 @@ pub fn render_workspace_to_buffer( buffer: &WlBuffer, renderer: &mut R, dt: &'d mut OutputDamageTracker, - age: usize, + mut age: usize, additional_damage: Vec>, draw_cursor: bool, common: &mut Common, @@ -303,6 +303,7 @@ pub fn render_workspace_to_buffer( let render_buffer = Offscreen::::create_buffer(renderer, format, size) .map_err(DTError::Rendering)?; + age = 0; render_workspace::<_, _, GlesRenderbuffer>( None, renderer, @@ -457,7 +458,7 @@ pub fn render_window_to_buffer( buffer: &WlBuffer, renderer: &mut R, dt: &'d mut OutputDamageTracker, - age: usize, + mut age: usize, additional_damage: Vec>, draw_cursor: bool, common: &mut Common, @@ -563,6 +564,7 @@ pub fn render_window_to_buffer( let render_buffer = Offscreen::::create_buffer(renderer, format, size) .map_err(DTError::Rendering)?; + age = 0; renderer.bind(render_buffer).map_err(DTError::Rendering)?; } @@ -694,7 +696,7 @@ pub fn render_cursor_to_buffer( buffer: &WlBuffer, renderer: &mut R, dt: &'d mut OutputDamageTracker, - age: usize, + mut age: usize, additional_damage: Vec>, common: &mut Common, seat: &Seat, @@ -752,6 +754,7 @@ pub fn render_cursor_to_buffer( let render_buffer = Offscreen::::create_buffer(renderer, format, size) .map_err(DTError::Rendering)?; + age = 0; renderer.bind(render_buffer).map_err(DTError::Rendering)?; }