- It turns out that part of the problem was actually on the driver side. - The performance loss is not worth the small visual improvement. - This should ensure low latency at low throughput. - Performance loss seems less than 10% instead of the previous 33%. - It's not needed to set deferred_mixed_pixmap to NULL, because exaDoMigration_mixed will handle that.
Signed-off-by: Maarten Maathuis <madman2...@gmail.com> --- exa/exa.c | 6 +++++- exa/exa_migration_mixed.c | 26 ++++++++++++++++---------- exa/exa_priv.h | 1 + 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/exa/exa.c b/exa/exa.c index a4e294a..abda82e 100644 --- a/exa/exa.c +++ b/exa/exa.c @@ -721,9 +721,13 @@ ExaBlockHandler(int screenNum, pointer blockData, pointer pTimeout, ExaScreenPriv(pScreen); /* Move any deferred results from a software fallback to the driver pixmap */ - if (pExaScr->deferred_mixed_pixmap) + if (pExaScr->deferred_mixed_pixmap) { exaMoveInPixmap_mixed(pExaScr->deferred_mixed_pixmap); + if (pExaScr->deferred_mixed_pixmap == pScreen->GetScreenPixmap(pScreen)) + pExaScr->last_time_front_mixed_pixmap = GetTimeInMillis(); + } + unwrap(pExaScr, pScreen, BlockHandler); (*pScreen->BlockHandler) (screenNum, blockData, pTimeout, pReadmask); wrap(pExaScr, pScreen, BlockHandler, ExaBlockHandler); diff --git a/exa/exa_migration_mixed.c b/exa/exa_migration_mixed.c index 4f49905..320aad9 100644 --- a/exa/exa_migration_mixed.c +++ b/exa/exa_migration_mixed.c @@ -150,18 +150,24 @@ exaDamageReport_mixed(DamagePtr pDamage, RegionPtr pRegion, void *closure) if (!pExaPixmap->use_gpu_copy && exaPixmapHasGpuCopy(pPixmap)) { ExaScreenPriv(pPixmap->drawable.pScreen); - /* Front buffer: Don't wait for the block handler to copy back the data. - * This avoids annoying latency if you encounter a lot of software rendering. + /* Front buffer: Don't wait for the block handler to copy back the data, unless + * it has been moved back in the last 50 ms. This avoids high latency when + * the xserver is busy, while maintaining a decent troughput. */ - if (pPixmap == pScreen->GetScreenPixmap(pScreen)) - exaMoveInPixmap_mixed(pPixmap); - else { - if (pExaScr->deferred_mixed_pixmap && - pExaScr->deferred_mixed_pixmap != pPixmap) - exaMoveInPixmap_mixed(pExaScr->deferred_mixed_pixmap); - - pExaScr->deferred_mixed_pixmap = pPixmap; + if (pPixmap == pScreen->GetScreenPixmap(pScreen)) { + CARD32 now = GetTimeInMillis(); + if ((now - pExaScr->last_time_front_mixed_pixmap) > 50) { + pExaScr->last_time_front_mixed_pixmap = now; + exaMoveInPixmap_mixed(pPixmap); + return; + } } + + if (pExaScr->deferred_mixed_pixmap && + pExaScr->deferred_mixed_pixmap != pPixmap) + exaMoveInPixmap_mixed(pExaScr->deferred_mixed_pixmap); + + pExaScr->deferred_mixed_pixmap = pPixmap; } } diff --git a/exa/exa_priv.h b/exa/exa_priv.h index e5d90d4..cb58a02 100644 --- a/exa/exa_priv.h +++ b/exa/exa_priv.h @@ -185,6 +185,7 @@ typedef struct { CARD32 lastDefragment; CARD32 nextDefragment; PixmapPtr deferred_mixed_pixmap; + CARD32 last_time_front_mixed_pixmap; /* Reference counting for accessed pixmaps */ struct { -- 1.7.4 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel