[PATCH] exa/mixed: Partially restore deferred pixmap handling for frontbuffer.

Michel Dänzer michel at daenzer.net
Thu Feb 10 02:01:51 PST 2011


On Mit, 2011-02-09 at 21:09 +0100, Maarten Maathuis wrote: 
> - It turns out that part of the problem was actually on the driver side.

I did express my suspicion about that during the review...

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

Sounds better indeed.


> @@ -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 {

Please use

	if (pPixmap == pScreen->GetScreenPixmap(pScreen)) {
	    CARD32 now = GetTimeInMillis();
	    if ((now - pExaScr->last_time_front_mixed_pixmap) > 50) {
		[...]
		return;
	    }
	}

	if (pExaScr->deferred_mixed_pixmap &&
	    pExaScr->deferred_mixed_pixmap != pPixmap)
    [...]

rather than duplicating the else blocks.

(BTW indentation looks wrong again)


Shouldn't pExaScr->last_time_front_mixed_pixmap be updated in
ExaBlockHandler() as well?


-- 
Earthling Michel Dänzer           |                http://www.vmware.com
Libre software enthusiast         |          Debian, X and DRI developer



More information about the xorg-devel mailing list