summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKimmo Hämäläinen <kimmo.hamalainen@nokia.com>2010-10-14 17:16:38 +0300
committerKimmo Hämäläinen <kimmo.hamalainen@nokia.com>2010-10-14 17:16:38 +0300
commite958701087fbfb0b38b0aa6b05d548cad2b970fc (patch)
treeb31d52ec95decaf297f27462f8b89132b17c7303
parent26d8eebe44fc6f28afe49f5e3d9a78ba41a356bd (diff)
Fixes: NB#189519 - compositor calls eglSwapBuffers without rendering anything
- keep non-composited mode when we don't have mapped windows to paint - avoid updating the scene if we don't need to
-rw-r--r--src/mcompositemanager.cpp22
-rw-r--r--src/mcompositemanager_p.h1
-rw-r--r--src/mcompositewindow.cpp10
-rw-r--r--src/mtexturepixmapitem_egl.cpp11
4 files changed, 35 insertions, 9 deletions
diff --git a/src/mcompositemanager.cpp b/src/mcompositemanager.cpp
index 5873592..f57e525 100644
--- a/src/mcompositemanager.cpp
+++ b/src/mcompositemanager.cpp
@@ -1075,6 +1075,17 @@ MCompositeWindow *MCompositeManagerPrivate::getHighestDecorated()
return 0;
}
+bool MCompositeManagerPrivate::haveMappedWindow() const
+{
+ for (int i = stacking_list.size() - 1; i >= 0; --i) {
+ Window w = stacking_list.at(i);
+ MWindowPropertyCache *pc = prop_caches.value(w, 0);
+ if (pc && pc->is_valid && pc->isMapped())
+ return true;
+ }
+ return false;
+}
+
// TODO: merge this with disableCompositing() so that in the end we have
// stacking order sensitive logic
bool MCompositeManagerPrivate::possiblyUnredirectTopmostWindow()
@@ -1121,6 +1132,10 @@ bool MCompositeManagerPrivate::possiblyUnredirectTopmostWindow()
if (pc && pc->is_valid && pc->beingMapped())
return false;
}
+ if (!haveMappedWindow()) {
+ disableCompositing(FORCED);
+ return true;
+ }
if (top && cw && !MCompositeWindow::hasTransitioningWindow()) {
// unredirect the chosen window and any docks and OR windows above it
@@ -2654,7 +2669,8 @@ void MCompositeManagerPrivate::displayOff(bool display_off)
{
if (display_off) {
// keep compositing to have synthetic events to obscure all windows
- enableCompositing(true);
+ if (!haveMappedWindow())
+ enableCompositing(true);
scene()->views()[0]->setUpdatesEnabled(false);
/* stop pinging to save some battery */
for (QHash<Window, MCompositeWindow *>::iterator it = windows.begin();
@@ -2666,7 +2682,6 @@ void MCompositeManagerPrivate::displayOff(bool display_off)
i->propertyCache()->damageTracking(false);
}
} else {
- scene()->views()[0]->setUpdatesEnabled(true);
if (!possiblyUnredirectTopmostWindow())
enableCompositing(false);
/* start pinging again */
@@ -2960,7 +2975,6 @@ void MCompositeManagerPrivate::redirectWindows()
}
if (kids)
XFree(kids);
- scene()->views()[0]->setUpdatesEnabled(true);
// Wait for the MapNotify for the overlay (show() of the graphicsview
// in main() causes it even if we don't map it explicitly)
@@ -3281,7 +3295,7 @@ void MCompositeManagerPrivate::enableRedirection()
compositing = true;
// no delay: application does not need to redraw when maximizing it
scene()->views()[0]->setUpdatesEnabled(true);
- glwidget->update();
+ // NOTE: enableRedirectedRendering() calls glwidget->update() if needed
// At this point everything should be rendered off-screen
emit compositingEnabled();
}
diff --git a/src/mcompositemanager_p.h b/src/mcompositemanager_p.h
index e2750e1..c45f2b6 100644
--- a/src/mcompositemanager_p.h
+++ b/src/mcompositemanager_p.h
@@ -107,6 +107,7 @@ public:
Window getLastVisibleParent(MWindowPropertyCache *pc);
bool possiblyUnredirectTopmostWindow();
+ bool haveMappedWindow() const;
bool isRedirected(Window window);
bool x11EventFilter(XEvent *event);
bool processX11EventFilters(XEvent *event, bool after);
diff --git a/src/mcompositewindow.cpp b/src/mcompositewindow.cpp
index 33c733c..c025834 100644
--- a/src/mcompositewindow.cpp
+++ b/src/mcompositewindow.cpp
@@ -687,8 +687,13 @@ QVariant MCompositeWindow::itemChange(GraphicsItemChange change, const QVariant
p->d->setWindowDebugProperties(window());
}
+ /* disabled to avoid glSwapBuffers call without painting any item (Qt bug)
+ * see NB#189519
if (zvalChanged || change == ItemVisibleHasChanged || change == ItemParentHasChanged)
+ {
p->d->glwidget->update();
+ }
+ */
return QGraphicsItem::itemChange(change, value);
}
@@ -753,7 +758,10 @@ QPainterPath MCompositeWindow::shape() const
Window MCompositeWindow::lastVisibleParent() const
{
MCompositeManager *p = (MCompositeManager *) qApp;
- return p->d->getLastVisibleParent(propertyCache());
+ if (pc && pc->is_valid)
+ return p->d->getLastVisibleParent(pc);
+ else
+ return None;
}
int MCompositeWindow::indexInStack() const
diff --git a/src/mtexturepixmapitem_egl.cpp b/src/mtexturepixmapitem_egl.cpp
index 9272452..7ba56ac 100644
--- a/src/mtexturepixmapitem_egl.cpp
+++ b/src/mtexturepixmapitem_egl.cpp
@@ -258,6 +258,7 @@ void MTexturePixmapItem::updateWindowPixmap(XRectangle *rects, int num)
r += QRegion(rects[i].x, rects[i].y, rects[i].width, rects[i].height);
d->damageRegion = r;
+ bool new_image = false;
if (d->custom_tfp) {
QPixmap qp = QPixmap::fromX11Pixmap(d->windowp);
@@ -265,11 +266,13 @@ void MTexturePixmapItem::updateWindowPixmap(XRectangle *rects, int num)
glBindTexture(GL_TEXTURE_2D, d->textureId);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, img.width(),
img.height(), GL_RGBA, GL_UNSIGNED_BYTE, img.bits());
- } else {
- if (d->egl_image == EGL_NO_IMAGE_KHR)
- saveBackingStore();
+ new_image = true;
+ } else if (d->egl_image == EGL_NO_IMAGE_KHR) {
+ saveBackingStore();
+ new_image = true;
}
- d->glwidget->update();
+ if (new_image || !d->damageRegion.isEmpty())
+ d->glwidget->update();
}
void MTexturePixmapItem::paint(QPainter *painter,