diff options
author | Kimmo Hämäläinen <kimmo.hamalainen@nokia.com> | 2010-10-14 17:16:38 +0300 |
---|---|---|
committer | Kimmo Hämäläinen <kimmo.hamalainen@nokia.com> | 2010-10-14 17:16:38 +0300 |
commit | e958701087fbfb0b38b0aa6b05d548cad2b970fc (patch) | |
tree | b31d52ec95decaf297f27462f8b89132b17c7303 | |
parent | 26d8eebe44fc6f28afe49f5e3d9a78ba41a356bd (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.cpp | 22 | ||||
-rw-r--r-- | src/mcompositemanager_p.h | 1 | ||||
-rw-r--r-- | src/mcompositewindow.cpp | 10 | ||||
-rw-r--r-- | src/mtexturepixmapitem_egl.cpp | 11 |
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, |