- Apps like xterm can trigger a lot of fallback rendering.
- This can lead to (annoyingly) high latencies, because you
  have to wait for the block handler.
- You need a driver that doesn't directly access the front
  buffer to trigger this (NV50+ nouveau for example).
- Repeatingly doing dmesg on an xterm with a bitmap font
  will reveal that you never see part of the text.
- I have recieved at least one complaint in the past of slow
  terminal performance, which was related to core font
  rendering.
- This does sacrifice some throughput, roughly 33% slower.

Reviewed-by: Michel Dänzer <[email protected]>
Signed-off-by: Maarten Maathuis <[email protected]>
---
 exa/exa_migration_mixed.c |   17 +++++++++++++----
 1 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/exa/exa_migration_mixed.c b/exa/exa_migration_mixed.c
index fb47151..4f49905 100644
--- a/exa/exa_migration_mixed.c
+++ b/exa/exa_migration_mixed.c
@@ -138,6 +138,7 @@ void
 exaDamageReport_mixed(DamagePtr pDamage, RegionPtr pRegion, void *closure)
 {
     PixmapPtr pPixmap = closure;
+    ScreenPtr pScreen = pPixmap->drawable.pScreen;
     ExaPixmapPriv(pPixmap);
 
     /* Move back results of software rendering on system memory copy of mixed 
driver
@@ -149,10 +150,18 @@ exaDamageReport_mixed(DamagePtr pDamage, RegionPtr 
pRegion, void *closure)
     if (!pExaPixmap->use_gpu_copy && exaPixmapHasGpuCopy(pPixmap)) {
        ExaScreenPriv(pPixmap->drawable.pScreen);
 
-       if (pExaScr->deferred_mixed_pixmap &&
-           pExaScr->deferred_mixed_pixmap != pPixmap)
-           exaMoveInPixmap_mixed(pExaScr->deferred_mixed_pixmap);
-       pExaScr->deferred_mixed_pixmap = pPixmap;
+       /* 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.
+        */
+       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;
+       }
     }
 }
 
-- 
1.7.4.rc2

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to