On Wed, Feb 9, 2011 at 9:09 PM, Maarten Maathuis <madman2...@gmail.com> wrote: > - 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 > >
What do you think about this one Michel? Going too far below 50 ms will affect performance seriously (10 ms wouldn't be worth the change for example). And i doubt anyone types more than a 1000 characters per minute :) Maarten. P.S. I screwed up the mailinglist address on the first attempt and got the error after sending a reply to you. -- Far away from the primal instinct, the song seems to fade away, the river get wider between your thoughts and the things we do and say. _______________________________________________ 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