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
This commit is contained in:
parent
a8867e292d
commit
b68cd3110a
1 changed files with 7 additions and 6 deletions
|
@ -1580,23 +1580,24 @@ QSharedPointer<GLTexture> OpenGLWindow::windowTexture()
|
||||||
return QSharedPointer<GLTexture>(new GLTexture(*frame->texture()));
|
return QSharedPointer<GLTexture>(new GLTexture(*frame->texture()));
|
||||||
} else {
|
} else {
|
||||||
auto effectWindow = window()->effectWindow();
|
auto effectWindow = window()->effectWindow();
|
||||||
const QRect geo = window()->bufferGeometry();
|
const QRect virtualGeometry = window()->bufferGeometry();
|
||||||
QSharedPointer<GLTexture> texture(new GLTexture(GL_RGBA8, geo.size() * window()->bufferScale()));
|
QSharedPointer<GLTexture> texture(new GLTexture(GL_RGBA8, virtualGeometry.size() * window()->bufferScale()));
|
||||||
|
|
||||||
QScopedPointer<GLRenderTarget> framebuffer(new KWin::GLRenderTarget(*texture));
|
QScopedPointer<GLRenderTarget> framebuffer(new KWin::GLRenderTarget(*texture));
|
||||||
GLRenderTarget::pushRenderTarget(framebuffer.data());
|
GLRenderTarget::pushRenderTarget(framebuffer.data());
|
||||||
|
|
||||||
auto renderVSG = GLRenderTarget::virtualScreenGeometry();
|
auto renderVSG = GLRenderTarget::virtualScreenGeometry();
|
||||||
GLVertexBuffer::setVirtualScreenGeometry(geo);
|
const QRect outputGeometry = { virtualGeometry.topLeft(), texture->size() };
|
||||||
GLRenderTarget::setVirtualScreenGeometry(geo);
|
GLVertexBuffer::setVirtualScreenGeometry(outputGeometry);
|
||||||
|
GLRenderTarget::setVirtualScreenGeometry(outputGeometry);
|
||||||
|
|
||||||
QMatrix4x4 mvp;
|
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);
|
WindowPaintData data(effectWindow);
|
||||||
data.setProjectionMatrix(mvp);
|
data.setProjectionMatrix(mvp);
|
||||||
|
|
||||||
performPaint(Scene::PAINT_WINDOW_TRANSFORMED, geo, data);
|
performPaint(Scene::PAINT_WINDOW_TRANSFORMED, outputGeometry, data);
|
||||||
GLRenderTarget::popRenderTarget();
|
GLRenderTarget::popRenderTarget();
|
||||||
GLVertexBuffer::setVirtualScreenGeometry(renderVSG);
|
GLVertexBuffer::setVirtualScreenGeometry(renderVSG);
|
||||||
GLRenderTarget::setVirtualScreenGeometry(renderVSG);
|
GLRenderTarget::setVirtualScreenGeometry(renderVSG);
|
||||||
|
|
Loading…
Reference in a new issue