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

Reply via email to