diff --git a/libkwineffects/kwinglutils.h b/libkwineffects/kwinglutils.h --- a/libkwineffects/kwinglutils.h +++ b/libkwineffects/kwinglutils.h @@ -775,9 +775,21 @@ s_virtualScreenGeometry = g; } + /** + * The scale of the OpenGL window currently being rendered to + * + * @returns the ratio between the virtual geometry space the rendering + * system uses and the target + * @since 5.11.3 + */ + static void setVirtualScreenScale(qreal s) { + s_virtualScreenScale = s; + } + private: GLVertexBufferPrivate* const d; static QRect s_virtualScreenGeometry; + static qreal s_virtualScreenScale; }; } // namespace diff --git a/libkwineffects/kwinglutils.cpp b/libkwineffects/kwinglutils.cpp --- a/libkwineffects/kwinglutils.cpp +++ b/libkwineffects/kwinglutils.cpp @@ -1950,6 +1950,7 @@ // GLVertexBuffer //********************************* QRect GLVertexBuffer::s_virtualScreenGeometry; +qreal GLVertexBuffer::s_virtualScreenScale; GLVertexBuffer::GLVertexBuffer(UsageHint hint) : d(new GLVertexBufferPrivate(hint)) @@ -2123,7 +2124,10 @@ } else { // Clip using scissoring foreach (const QRect &r, region.rects()) { - glScissor(r.x() - s_virtualScreenGeometry.x(), s_virtualScreenGeometry.height() + s_virtualScreenGeometry.y() - r.y() - r.height(), r.width(), r.height()); + glScissor((r.x() - s_virtualScreenGeometry.x()) * s_virtualScreenScale, + (s_virtualScreenGeometry.height() + s_virtualScreenGeometry.y() - r.y() - r.height()) * s_virtualScreenScale, + r.width() * s_virtualScreenScale, + r.height() * s_virtualScreenScale); glDrawElementsBaseVertex(GL_TRIANGLES, count, GL_UNSIGNED_SHORT, nullptr, first); } } @@ -2135,7 +2139,10 @@ } else { // Clip using scissoring foreach (const QRect &r, region.rects()) { - glScissor(r.x() - s_virtualScreenGeometry.x(), s_virtualScreenGeometry.height() + s_virtualScreenGeometry.y() - r.y() - r.height(), r.width(), r.height()); + glScissor((r.x() - s_virtualScreenGeometry.x()) * s_virtualScreenScale, + (s_virtualScreenGeometry.height() + s_virtualScreenGeometry.y() - r.y() - r.height()) * s_virtualScreenScale, + r.width() * s_virtualScreenScale, + r.height() * s_virtualScreenScale); glDrawArrays(primitiveMode, first, count); } } diff --git a/scene_opengl.cpp b/scene_opengl.cpp --- a/scene_opengl.cpp +++ b/scene_opengl.cpp @@ -755,6 +755,7 @@ QRegion repaint = m_backend->prepareRenderingForScreen(i); GLVertexBuffer::setVirtualScreenGeometry(geo); GLRenderTarget::setVirtualScreenGeometry(geo); + GLVertexBuffer::setVirtualScreenScale(screens()->scale(i)); GLRenderTarget::setVirtualScreenScale(screens()->scale(i)); const GLenum status = glGetGraphicsResetStatus(); @@ -785,6 +786,7 @@ } GLVertexBuffer::setVirtualScreenGeometry(screens()->geometry()); GLRenderTarget::setVirtualScreenGeometry(screens()->geometry()); + GLVertexBuffer::setVirtualScreenScale(1); GLRenderTarget::setVirtualScreenScale(1); int mask = 0;