summaryrefslogtreecommitdiffstats
path: root/src/widgets/kernel/qwidget.cpp
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@theqtcompany.com>2015-11-18 15:20:14 +0100
committerLaszlo Agocs <laszlo.agocs@theqtcompany.com>2015-11-24 19:28:32 +0000
commit5c7f000cd4c9e3769e8cd4085cf0beee104f9886 (patch)
tree5e704e7e92dd7653bcaa52773f643c36d082e959 /src/widgets/kernel/qwidget.cpp
parenta69c0bb38e8edb985417c10793350e40e401fed3 (diff)
Reduce the number of paint events for QOpenGLWidget
Changes to other widgets in the window, especially special cases like moving dock widgets around, trigger an unfortunately high number of paint events and calls to paintGL(). Let's try to avoid this. There is no need to send out a paint event to a texture-backed widget when it was not explicitly dirtied. Overlaps won't matter since such widgets are not part of the backingstore. Everything else has to work like ordinary widgets, though, it is only the QPaintEvent sending we can optimize away, nothing else. Task-number: QTBUG-49466 Change-Id: I8ef294ba0a6c305d0002a80e85c06db2c2501cf8 Reviewed-by: Paul Olav Tvete <paul.tvete@theqtcompany.com>
Diffstat (limited to 'src/widgets/kernel/qwidget.cpp')
-rw-r--r--src/widgets/kernel/qwidget.cpp13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp
index 0d07eedc0b..94099aac7a 100644
--- a/src/widgets/kernel/qwidget.cpp
+++ b/src/widgets/kernel/qwidget.cpp
@@ -271,6 +271,9 @@ QWidgetPrivate::QWidgetPrivate(int version)
#ifndef QT_NO_IM
, inheritsInputMethodHints(0)
#endif
+#ifndef QT_NO_OPENGL
+ , renderToTextureReallyDirty(1)
+#endif
#if defined(Q_OS_WIN)
, noPaintOnScreen(0)
#endif
@@ -5547,7 +5550,7 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP
<< "geometry ==" << QRect(q->mapTo(q->window(), QPoint(0, 0)), q->size());
#endif
- bool grabbed = false;
+ bool skipPaintEvent = false;
#ifndef QT_NO_OPENGL
if (renderToTexture) {
// This widget renders into a texture which is composed later. We just need to
@@ -5561,14 +5564,18 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP
} else {
// We are not drawing to a backingstore: fall back to QImage
p.drawImage(q->rect(), grabFramebuffer());
- grabbed = true;
+ skipPaintEvent = true;
}
endBackingStorePainting();
}
+ if (renderToTextureReallyDirty)
+ renderToTextureReallyDirty = 0;
+ else
+ skipPaintEvent = true;
}
#endif // QT_NO_OPENGL
- if (!grabbed) {
+ if (!skipPaintEvent) {
//actually send the paint event
sendPaintEvent(toBePainted);
}