Skip to content

Commit b4bcea8

Browse files
committed
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 #1058 when this code is used for postprocessing, where this resulted in the same transform being applied twice.
1 parent 1118aa2 commit b4bcea8

File tree

1 file changed

+19
-12
lines changed

1 file changed

+19
-12
lines changed

src/backend/kms/surface/mod.rs

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -159,25 +159,32 @@ impl MirroringState {
159159
format: Fourcc,
160160
output: &Output,
161161
) -> Result<Self> {
162-
let size = output
163-
.current_mode()
164-
.map(|mode| mode.size)
165-
.unwrap_or_default()
166-
.to_logical(1)
167-
.to_buffer(1, Transform::Normal);
168-
let opaque_regions = vec![Rectangle::from_loc_and_size((0, 0), size)];
169-
170-
let texture = Offscreen::<GlesTexture>::create_buffer(renderer, format, size)?;
171-
let transform = output.current_transform();
162+
// Apply inverse of output transform to mode size to get correct size
163+
// for an untransformed render.
164+
let size = output.current_transform().invert().transform_size(
165+
output
166+
.current_mode()
167+
.map(|mode| mode.size)
168+
.unwrap_or_default(),
169+
);
170+
let buffer_size = size.to_logical(1).to_buffer(1, Transform::Normal);
171+
let opaque_regions = vec![Rectangle::from_loc_and_size((0, 0), buffer_size)];
172+
173+
let texture = Offscreen::<GlesTexture>::create_buffer(renderer, format, buffer_size)?;
172174
let texture_buffer = TextureRenderBuffer::from_texture(
173175
renderer,
174176
texture,
175177
1,
176-
transform,
178+
Transform::Normal,
177179
Some(opaque_regions),
178180
);
179181

180-
let damage_tracker = OutputDamageTracker::from_output(output);
182+
// Don't use `from_output` to avoid applying output transform
183+
let damage_tracker = OutputDamageTracker::new(
184+
size,
185+
output.current_scale().fractional_scale(),
186+
Transform::Normal,
187+
);
181188

182189
Ok(MirroringState {
183190
texture: texture_buffer,

0 commit comments

Comments
 (0)