[Nouveau] [PATCH 1/9] dri2: Fix can_exchange() to allow page-flipping on new servers.

Mario Kleiner mario.kleiner at tuebingen.mpg.de
Sun Feb 19 20:59:10 PST 2012

On 02/16/2012 11:04 AM, Michel Dänzer wrote:
> On Don, 2012-02-16 at 00:45 +0100, Mario Kleiner wrote:
>> can_exchange() fails on at least Xorg 1.12+. This fixes
>> it in the same way it was fixed in the ati&  intel ddx.
>> Signed-off-by: Mario Kleiner<mario.kleiner at tuebingen.mpg.de>
>> ---
>>   src/nouveau_dri2.c |    2 +-
>>   1 files changed, 1 insertions(+), 1 deletions(-)
>> diff --git a/src/nouveau_dri2.c b/src/nouveau_dri2.c
>> index 3aa5ec5..5b62425 100644
>> --- a/src/nouveau_dri2.c
>> +++ b/src/nouveau_dri2.c
>> @@ -160,7 +160,7 @@ can_exchange(DrawablePtr draw, PixmapPtr dst_pix, PixmapPtr src_pix)
>>   	return ((DRI2CanFlip(draw)&&  pNv->has_pageflip))&&
>>   		dst_pix->drawable.width == src_pix->drawable.width&&
>>   		dst_pix->drawable.height == src_pix->drawable.height&&
>> -		dst_pix->drawable.depth == src_pix->drawable.depth&&
>> +		dst_pix->drawable.bitsPerPixel == src_pix->drawable.bitsPerPixel&&
>>   		dst_pix->devKind == src_pix->devKind;
>>   }
> Actually, it seems like the pixmap depths really should match, otherwise
> one could end up with the front pixmap depth not matching the window
> depth. Not sure that's a real problem right now, but it seems wonky at
> least...
> Have you investigated why the depths don't match?

Depends on the meaning of "investigated": One of the pixmaps has depth 
24 bits (the pixmap of the root window) the other 32 bits (as requested 
from the client via DRI2GetBuffersWithFormat for RGBA8 visuals). Both 
have 32 bpp. I checked what the intel and ati ddx do. The ati ddx always 
checked for matching drawable.bitsPerPixel since kms pageflip support 
was implemented. The intel ddx does the same, but the code and comments 
suggests they tried both and checking for matching depths probably 
didn't work:

cd xorg/drivers/xf86-video-intel/
git log -p e2615cdeef078dbd2e834b68c437f098a92b941d

So everybody does it like this currently, and it seems to work.

I also just tried setting DefaultDepth to 30 bits on a NV50 card which 
supports this. xdpyinfo confirms a screen depth of 30 bit == 10 bits per 
red/green/blue channel. glxinfo shows that only RGBA8 visuals are 
supported. Here we have a mismatch of depths 30 vs. 24 and the driver 
reverts correctly from page flipping to copy swaps, although i can't see 
immediately what causes it to correctly switch back to copy swaps.


More information about the Nouveau mailing list