From b68cd3110a2f6a706543f8f38d3a8eede6ba57b1 Mon Sep 17 00:00:00 2001 From: Aleix Pol Date: Thu, 15 Apr 2021 16:38:19 +0200 Subject: [PATCH] Fix streaming of windows when we are using a mix of scales At the moment a streamed screen when the screen scale was differnt buffer scale would render wrong. This change addresses it by compensating it. This change compensates it resizing the rendered viewport to their difference. BUG: 428594 --- src/plugins/scenes/opengl/scene_opengl.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/plugins/scenes/opengl/scene_opengl.cpp b/src/plugins/scenes/opengl/scene_opengl.cpp index f8a82a6ddb..350701524c 100644 --- a/src/plugins/scenes/opengl/scene_opengl.cpp +++ b/src/plugins/scenes/opengl/scene_opengl.cpp @@ -1580,23 +1580,24 @@ QSharedPointer OpenGLWindow::windowTexture() return QSharedPointer(new GLTexture(*frame->texture())); } else { auto effectWindow = window()->effectWindow(); - const QRect geo = window()->bufferGeometry(); - QSharedPointer texture(new GLTexture(GL_RGBA8, geo.size() * window()->bufferScale())); + const QRect virtualGeometry = window()->bufferGeometry(); + QSharedPointer texture(new GLTexture(GL_RGBA8, virtualGeometry.size() * window()->bufferScale())); QScopedPointer framebuffer(new KWin::GLRenderTarget(*texture)); GLRenderTarget::pushRenderTarget(framebuffer.data()); auto renderVSG = GLRenderTarget::virtualScreenGeometry(); - GLVertexBuffer::setVirtualScreenGeometry(geo); - GLRenderTarget::setVirtualScreenGeometry(geo); + const QRect outputGeometry = { virtualGeometry.topLeft(), texture->size() }; + GLVertexBuffer::setVirtualScreenGeometry(outputGeometry); + GLRenderTarget::setVirtualScreenGeometry(outputGeometry); QMatrix4x4 mvp; - mvp.ortho(geo.x(), geo.x() + geo.width(), geo.y(), geo.y() + geo.height(), -1, 1); + mvp.ortho(virtualGeometry.x(), virtualGeometry.x() + virtualGeometry.width(), virtualGeometry.y(), virtualGeometry.y() + virtualGeometry.height(), -1, 1); WindowPaintData data(effectWindow); data.setProjectionMatrix(mvp); - performPaint(Scene::PAINT_WINDOW_TRANSFORMED, geo, data); + performPaint(Scene::PAINT_WINDOW_TRANSFORMED, outputGeometry, data); GLRenderTarget::popRenderTarget(); GLVertexBuffer::setVirtualScreenGeometry(renderVSG); GLRenderTarget::setVirtualScreenGeometry(renderVSG);