From 5d7e22e5dcf8981f9ba65088b81c1c6d456efef3 Mon Sep 17 00:00:00 2001 From: David Edmundson Date: Wed, 25 Oct 2017 18:03:22 +0100 Subject: [PATCH] Fix viewport on vertically stacked monitors Summary: We want to translate by the monitor position, so that needs to be the negative of the position. But Kwin/KScreen treats 0 as the top of all monitors. GL treats 0 as bottom, so that all needs inverting. Hence this should be a positive y value for the viewport. BUG: 386099 BUG: 385655 Test Plan: Had two monitors Side by side was - fine Stacked vertically - still fine Modded X code to extend in y instead of x. 3 monitors worked fine. Nested wayland only seems to support one screen? Reviewers: #plasma Subscribers: plasma-devel, kwin, #kwin Tags: #kwin Differential Revision: https://phabricator.kde.org/D8479 --- plugins/platforms/drm/egl_gbm_backend.cpp | 2 +- plugins/platforms/x11/windowed/egl_x11_backend.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/platforms/drm/egl_gbm_backend.cpp b/plugins/platforms/drm/egl_gbm_backend.cpp index 7083ecfab2..e25ff47d6a 100644 --- a/plugins/platforms/drm/egl_gbm_backend.cpp +++ b/plugins/platforms/drm/egl_gbm_backend.cpp @@ -194,7 +194,7 @@ bool EglGbmBackend::makeContextCurrent(const Output &output) qreal scale = output.output->scale(); - glViewport(-v.x() * scale, (v.height() - overall.height() - v.y()) * scale, + glViewport(-v.x() * scale, (v.height() - overall.height() + v.y()) * scale, overall.width() * scale, overall.height() * scale); return true; } diff --git a/plugins/platforms/x11/windowed/egl_x11_backend.cpp b/plugins/platforms/x11/windowed/egl_x11_backend.cpp index d0e08525f5..c9e649a712 100644 --- a/plugins/platforms/x11/windowed/egl_x11_backend.cpp +++ b/plugins/platforms/x11/windowed/egl_x11_backend.cpp @@ -108,7 +108,7 @@ void EglX11Backend::setupViewport(int screenId) // TODO: are the values correct? qreal scale = screens()->scale(screenId); - glViewport(-v.x(), v.height() - overall.height() - v.y(), overall.width() * scale, overall.height() * scale); + glViewport(-v.x(), v.height() - overall.height() + v.y(), overall.width() * scale, overall.height() * scale); } void EglX11Backend::endRenderingFrameForScreen(int screenId, const QRegion &renderedRegion, const QRegion &damagedRegion)