From 3f74a22cca982de708a4ce2138009ec0b4756cd9 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Wed, 27 Aug 2025 13:03:58 -0700 Subject: [PATCH] kms/surface: Fix transform used for blits Use the same logic used `submit_buffer`. This fixes corruption in OBS when trying to capture a rotated output. --- src/backend/kms/surface/mod.rs | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/backend/kms/surface/mod.rs b/src/backend/kms/surface/mod.rs index 9119feb4..92e99fee 100644 --- a/src/backend/kms/surface/mod.rs +++ b/src/backend/kms/surface/mod.rs @@ -1657,6 +1657,11 @@ fn send_screencopy_result<'a>( let mut render_buffer; let buffer = frame.buffer(); let mut shm_buffer = false; + let buffer_size = buffer_dimensions(&buffer).ok_or(RenderError::< + ::Error, + >::Rendering( + MultiError::ImportFailed + ))?; let mut fb = if let Ok(dmabuf) = get_dmabuf(&buffer) { dmabuf_clone = dmabuf.clone(); Some( @@ -1666,10 +1671,6 @@ fn send_screencopy_result<'a>( ) } else { shm_buffer = true; - let size = - buffer_dimensions(&buffer).ok_or(RenderError::< - ::Error, - >::Rendering(MultiError::ImportFailed))?; let format = with_buffer_contents(&buffer, |_, _, data| shm_format_to_fourcc(data.format)) .map_err(|_| OutputNoMode)? // eh, we have to do some error .expect("We should be able to convert all hardcoded shm screencopy formats"); @@ -1682,8 +1683,9 @@ fn send_screencopy_result<'a>( { None } else { - render_buffer = Offscreen::::create_buffer(renderer, format, size) - .map_err(RenderError::<::Error>::Rendering)?; + render_buffer = + Offscreen::::create_buffer(renderer, format, buffer_size) + .map_err(RenderError::<::Error>::Rendering)?; Some( renderer .bind(&mut render_buffer) @@ -1716,14 +1718,16 @@ fn send_screencopy_result<'a>( let adjusted = damage .iter() .copied() - .map(|mut d| { - d.size = d - .size - .to_logical(1) - .to_buffer(1, output_transform) - .to_logical(1, Transform::Normal) - .to_physical(1); - d + .map(|rect| { + let logical = rect.to_logical(1); + logical + .to_buffer( + 1, + output_transform.invert(), + &buffer_size.to_logical(1, output_transform), + ) + .to_logical(1, Transform::Normal, &buffer_size) + .to_physical(1) }) .collect::>();