File libqt5-reduce-flushes-with-repaint-GL-composition.patch of Package libqt5-qtbase.2170

From 1b61390856ce336c82f7b99def574775893bf4f2 Mon Sep 17 00:00:00 2001
From: Laszlo Agocs <laszlo.agocs@theqtcompany.com>
Date: Tue, 1 Dec 2015 12:31:14 +0100
Subject: [PATCH] Reduce flushes with repaint() when GL-based compositing is
 active

Task-number: QTBUG-49655
Change-Id: I7a5d08f681a7d87709aac745154730764040e922
Reviewed-by: Paul Olav Tvete <paul.tvete@theqtcompany.com>
---
 src/gui/kernel/qwindow_p.h                           |  2 ++
 src/gui/painting/qplatformbackingstore.cpp           |  2 ++
 .../qopenglcompositorbackingstore.cpp                |  3 +++
 src/widgets/kernel/qwidgetbackingstore.cpp           | 20 ++++++++++++++++++++
 4 files changed, 27 insertions(+)

diff --git a/src/gui/kernel/qwindow_p.h b/src/gui/kernel/qwindow_p.h
index 23a6d80..6880eda 100644
--- a/src/gui/kernel/qwindow_p.h
+++ b/src/gui/kernel/qwindow_p.h
@@ -50,6 +50,7 @@
 #include <qpa/qplatformwindow.h>
 
 #include <QtCore/private/qobject_p.h>
+#include <QtCore/qelapsedtimer.h>
 #include <QtGui/QIcon>
 
 QT_BEGIN_NAMESPACE
@@ -187,6 +188,7 @@ public:
 #endif
 
     bool compositing;
+    QElapsedTimer lastComposeTime;
 };
 
 
diff --git a/src/gui/painting/qplatformbackingstore.cpp b/src/gui/painting/qplatformbackingstore.cpp
index 4e26d8f..cda2446 100644
--- a/src/gui/painting/qplatformbackingstore.cpp
+++ b/src/gui/painting/qplatformbackingstore.cpp
@@ -301,6 +301,8 @@ void QPlatformBackingStore::composeAndFlush(QWindow *window, const QRegion &regi
         return;
     }
 
+    QWindowPrivate::get(window)->lastComposeTime.start();
+
     QOpenGLFunctions *funcs = context->functions();
     funcs->glViewport(0, 0, window->width() * window->devicePixelRatio(), window->height() * window->devicePixelRatio());
     funcs->glClearColor(0, 0, 0, translucentBackground ? 0 : 1);
diff --git a/src/platformsupport/platformcompositor/qopenglcompositorbackingstore.cpp b/src/platformsupport/platformcompositor/qopenglcompositorbackingstore.cpp
index 6f71fb6..fee3146 100644
--- a/src/platformsupport/platformcompositor/qopenglcompositorbackingstore.cpp
+++ b/src/platformsupport/platformcompositor/qopenglcompositorbackingstore.cpp
@@ -35,6 +35,7 @@
 #include <QtGui/QWindow>
 #include <QtGui/QPainter>
 #include <qpa/qplatformbackingstore.h>
+#include <private/qwindow_p.h>
 
 #include "qopenglcompositorbackingstore_p.h"
 #include "qopenglcompositor_p.h"
@@ -198,6 +199,8 @@ void QOpenGLCompositorBackingStore::composeAndFlush(QWindow *window, const QRegi
 
     dstCtx->makeCurrent(dstWin);
 
+    QWindowPrivate::get(window)->lastComposeTime.start();
+
     m_textures->clear();
     for (int i = 0; i < textures->count(); ++i)
         m_textures->appendTexture(textures->source(i), textures->textureId(i), textures->geometry(i),
diff --git a/src/widgets/kernel/qwidgetbackingstore.cpp b/src/widgets/kernel/qwidgetbackingstore.cpp
index b86c376..1718700 100644
--- a/src/widgets/kernel/qwidgetbackingstore.cpp
+++ b/src/widgets/kernel/qwidgetbackingstore.cpp
@@ -448,6 +448,26 @@ void QWidgetBackingStore::sendUpdateRequest(QWidget *widget, UpdateTime updateTi
     if (!widget)
         return;
 
+#ifndef QT_NO_OPENGL
+    // Having every repaint() leading to a sync/flush is bad as it causes
+    // compositing and waiting for vsync each and every time. Change to
+    // UpdateLater, except for approx. once per frame to prevent starvation in
+    // case the control does not get back to the event loop.
+    QWidget *w = widget->window();
+    if (updateTime == UpdateNow && w && w->windowHandle() && QWindowPrivate::get(w->windowHandle())->compositing) {
+        int refresh = 60;
+        QScreen *ws = w->windowHandle()->screen();
+        if (ws)
+            refresh = ws->refreshRate();
+        QWindowPrivate *wd = QWindowPrivate::get(w->windowHandle());
+        if (wd->lastComposeTime.isValid()) {
+            const qint64 elapsed = wd->lastComposeTime.elapsed();
+            if (elapsed <= qint64(1000.0f / refresh))
+                updateTime = UpdateLater;
+       }
+    }
+#endif
+
     switch (updateTime) {
     case UpdateLater:
         updateRequestSent = true;
-- 
2.6.4

openSUSE Build Service is sponsored by