Keith Whitwell wrote:
> This seems wrong to me -- the client doesn't need to sleep - all it's going 
> to do is build a command buffer targeting the new backbuffer.  There's no 
> problem with that, it should be the preserve of the GPU scheduler (TTM or 
> GEM) to ensure those commands (once submitted) don't get executed until the 
> buffer is available - otherwise you're potentially pausing your application 
> for no good reason.  The app should be throttled if it gets more than a 
> couple of frames ahead, but there should be 100% overlap with hardware 
> otherwise.
>
> If you need  a solution that doesn't rely on the buffer manager, perhaps 
> resort to triple-buffering, or else create a new buffer and return that in 
> DRI2GetBuffers (and let the scanout one be freed once the flip is done). 
>
> It seems like arbitrating command execution against on-hardware buffers 
> should be the preserve of the kernel memory manager & other actors shouldn't 
> be double-guessing that.
>   
I agree.

It would be fairly trivial to use TTMs synchronization mechanisms to put 
special fences on buffers with outstanding flips. These fences signal 
when a "software flipper" engine has programmed a flip. Any command 
submission involving these buffers while fenced will effectively put the 
rendering client to sleep. Rendering to other buffers, including a 
potential third buffer would continue undisturbed. Pinning and unpinning 
of scanouts would take place at command submission time as detailed before.
Of course, in the case of AIGLX, the X server might temporarily be put 
to sleep, which might not be fully optimal.

A "software flipper" engine would be a simple vblank irq handler that 
flips and signals the flipper fence when the previous fences of the 
buffers (if present) have signaled (to finish any outstanding rendering 
before flipping).

I guess GEM's buffer object busy lists be used to accomodate something 
similar?

/Thomas


> Keith
> ________________________________________
> From: Kristian Høgsberg [...@bitplanet.net]
> Sent: Tuesday, August 18, 2009 11:46 AM
> To: Thomas Hellström
> Cc: Kristian Høgsberg; Jesse Barnes; dri-de...@lists.sf.net
> Subject: Re: [PATCH] Add modesetting pageflip ioctl and corresponding drm     
>   event
>
> We don't put clients to sleep until they try to render to the new
> backbuffer.  For direct rendering this happens when the client calls
> DRI2GetBuffers() after having called DRI2SwapBuffers().  If the flip
> is not yet finished at that time, we restart the X request and suspend
> the client.  When the drm event fires it is read by the ddx driver,
> which then calls DRI2SwapComplete() which will wake the client up
> again.  For AIGLX, we suspend the client in __glXForceCurrent(), but
> the wakeup happens the same way.
>   




------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to