From 32f9ff3cac70299b1e4806c0aaae9e4667de8033 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Mon, 23 Dec 2024 15:19:09 -0800 Subject: [PATCH] Use untransformed texture in `MirroringState::new_with_renderer` Apply inverse of output transform to mode to get render size, and apply no transform during rendering. The transform of the output being mirrored from shouldn't affect the final render. Fixes issues when source output for mirroring has a transform, and also fixes issues in https://github.com/pop-os/cosmic-comp/pull/1058 when this code is used for postprocessing, where this resulted in the same transform being applied twice. --- src/backend/kms/surface/mod.rs | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/backend/kms/surface/mod.rs b/src/backend/kms/surface/mod.rs index 0f361bc1..37b27f70 100644 --- a/src/backend/kms/surface/mod.rs +++ b/src/backend/kms/surface/mod.rs @@ -159,25 +159,32 @@ impl MirroringState { format: Fourcc, output: &Output, ) -> Result { - let size = output - .current_mode() - .map(|mode| mode.size) - .unwrap_or_default() - .to_logical(1) - .to_buffer(1, Transform::Normal); - let opaque_regions = vec![Rectangle::from_size(size)]; + // Apply inverse of output transform to mode size to get correct size + // for an untransformed render. + let size = output.current_transform().invert().transform_size( + output + .current_mode() + .map(|mode| mode.size) + .unwrap_or_default(), + ); + let buffer_size = size.to_logical(1).to_buffer(1, Transform::Normal); + let opaque_regions = vec![Rectangle::from_size(buffer_size)]; - let texture = Offscreen::::create_buffer(renderer, format, size)?; - let transform = output.current_transform(); + let texture = Offscreen::::create_buffer(renderer, format, buffer_size)?; let texture_buffer = TextureRenderBuffer::from_texture( renderer, texture, 1, - transform, + Transform::Normal, Some(opaque_regions), ); - let damage_tracker = OutputDamageTracker::from_output(output); + // Don't use `from_output` to avoid applying output transform + let damage_tracker = OutputDamageTracker::new( + size, + output.current_scale().fractional_scale(), + Transform::Normal, + ); Ok(MirroringState { texture: texture_buffer,