- 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%.

Signed-off-by: Maarten Maathuis <madman2...@gmail.com>
---
 exa/exa_migration_mixed.c |   24 +++++++++++++++++++-----
 exa/exa_priv.h            |    1 +
 2 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/exa/exa_migration_mixed.c b/exa/exa_migration_mixed.c
index 4f49905..08839a3 100644
--- a/exa/exa_migration_mixed.c
+++ b/exa/exa_migration_mixed.c
@@ -150,12 +150,26 @@ 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 (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);
+
+                       if (pExaScr->deferred_mixed_pixmap == pPixmap)
+                               pExaScr->deferred_mixed_pixmap = NULL;
+               } else {
+                       if (pExaScr->deferred_mixed_pixmap &&
+                           pExaScr->deferred_mixed_pixmap != pPixmap)
+                           
exaMoveInPixmap_mixed(pExaScr->deferred_mixed_pixmap);
+
+                       pExaScr->deferred_mixed_pixmap = pPixmap;
+               }
+       } else {
                if (pExaScr->deferred_mixed_pixmap &&
                    pExaScr->deferred_mixed_pixmap != pPixmap)
                    exaMoveInPixmap_mixed(pExaScr->deferred_mixed_pixmap);
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

Reply via email to