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.
This commit is contained in:
Ian Douglas Scott 2025-08-27 13:03:58 -07:00 committed by Victoria Brekenfeld
parent 9cc68dcbcc
commit 3f74a22cca

View file

@ -1657,6 +1657,11 @@ fn send_screencopy_result<'a>(
let mut render_buffer; let mut render_buffer;
let buffer = frame.buffer(); let buffer = frame.buffer();
let mut shm_buffer = false; let mut shm_buffer = false;
let buffer_size = buffer_dimensions(&buffer).ok_or(RenderError::<
<GlMultiRenderer as RendererSuper>::Error,
>::Rendering(
MultiError::ImportFailed
))?;
let mut fb = if let Ok(dmabuf) = get_dmabuf(&buffer) { let mut fb = if let Ok(dmabuf) = get_dmabuf(&buffer) {
dmabuf_clone = dmabuf.clone(); dmabuf_clone = dmabuf.clone();
Some( Some(
@ -1666,10 +1671,6 @@ fn send_screencopy_result<'a>(
) )
} else { } else {
shm_buffer = true; shm_buffer = true;
let size =
buffer_dimensions(&buffer).ok_or(RenderError::<
<GlMultiRenderer as RendererSuper>::Error,
>::Rendering(MultiError::ImportFailed))?;
let format = with_buffer_contents(&buffer, |_, _, data| shm_format_to_fourcc(data.format)) let format = with_buffer_contents(&buffer, |_, _, data| shm_format_to_fourcc(data.format))
.map_err(|_| OutputNoMode)? // eh, we have to do some error .map_err(|_| OutputNoMode)? // eh, we have to do some error
.expect("We should be able to convert all hardcoded shm screencopy formats"); .expect("We should be able to convert all hardcoded shm screencopy formats");
@ -1682,8 +1683,9 @@ fn send_screencopy_result<'a>(
{ {
None None
} else { } else {
render_buffer = Offscreen::<GlesRenderbuffer>::create_buffer(renderer, format, size) render_buffer =
.map_err(RenderError::<<GlMultiRenderer as RendererSuper>::Error>::Rendering)?; Offscreen::<GlesRenderbuffer>::create_buffer(renderer, format, buffer_size)
.map_err(RenderError::<<GlMultiRenderer as RendererSuper>::Error>::Rendering)?;
Some( Some(
renderer renderer
.bind(&mut render_buffer) .bind(&mut render_buffer)
@ -1716,14 +1718,16 @@ fn send_screencopy_result<'a>(
let adjusted = damage let adjusted = damage
.iter() .iter()
.copied() .copied()
.map(|mut d| { .map(|rect| {
d.size = d let logical = rect.to_logical(1);
.size logical
.to_logical(1) .to_buffer(
.to_buffer(1, output_transform) 1,
.to_logical(1, Transform::Normal) output_transform.invert(),
.to_physical(1); &buffer_size.to_logical(1, output_transform),
d )
.to_logical(1, Transform::Normal, &buffer_size)
.to_physical(1)
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();