[PATCH] exa/mixed: Partially restore deferred pixmap handling for frontbuffer.
Maarten Maathuis
madman2003 at gmail.com
Wed Feb 9 12:11:43 PST 2011
On Wed, Feb 9, 2011 at 9:09 PM, Maarten Maathuis <madman2003 at 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 <madman2003 at 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.
More information about the xorg-devel
mailing list