n-buffering and client behaviour

Kevin DuBois kevin.dubois at canonical.com
Tue Apr 23 17:46:35 UTC 2013


On 04/22/2013 11:18 PM, Christopher James Halse Rogers wrote:
> I dislike that <shift>+<enter> is send.
>
> On Tue, 2013-04-23 at 15:41 +1000, Christopher James Halse Rogers wrote:
>> Hey all.
>>
>> While I'm shepherding various Mesa patches upstream
> … I'll use the time in-between review cycles to implement triple
> buffering in order to implement eglSwapInteral(0) so that our benchmarks
> are less useless.
>
> There are two broad approaches here: the client always has exactly one
> buffer, or the client library potentially has more than one buffer.
>
> In the former the server sends a single buffer on surface creation and
> in response to each next_buffer() request, but internally keeps
> n-buffers available and coordinates handing off buffers to the
> compositor component and the client library. The server is responsible
> for determining whether next_buffer() should block or not.
>
> In the latter case the server hands out two buffers on surface creation
> and a single buffer in response to next_buffer(). The client library
> then determines whether next_buffer() blocks.
>
> The latter case allows eglSwapInterval(0) to not hit IPC for each frame,
> which will result in higher benchmark numbers, but for regular clients
> the IPC overhead should not be anywhere near the same proportion of
> rendering time, so IPC-per-frame might generate more realistic numbers.
I am also less concerned about ipc-per-frame because, like you, i think 
the rendering time (or the effect of composition bypass) will outweigh 
the ipc-per-frame cost.
>
> I'm therefore leaning towards the former approach - the client always
> has exactly one buffer, and needs to round-trip to the server each
> frame, even with eglSwapInterval(0).
>
> Thoughts?
>
>
I know you're aware of this, but just to remind others on the list that 
we're talking about logical ownership, not what is actually mmap-ed at 
any one time, because of Android requirements.

Our swapper currently implements triple buffering (although there's no 
option to force triple buffering, other than changing a constructor and 
recompiling) If its not working currently, its more a matter of fixing 
and adding an additional option than of implementing. This uses the 
model that the client always logically owns one buffer, so I think that 
we are in agreement that 'the former approach' is the one we like 
better. I don't like the idea of having the client provide some 
synchronization because it spreads the synchronization out across the 
ipc boundary. Given how tricky it can be to diagnose graphical glitches 
that pop up because of bad sync, having just one nugget of code in the 
server that provides us with sync is a great win.

N buffering is interesting. :) We disable it in the code because we 
really haven't had a driving case that requires it. From a quick bout of 
thinking, I think that n buffering makes the most sense when the client 
/requires/ that it logically owns more than buffer. Like, if a client 
requires 2 buffers at the same time, we could keep a full pipeline with 
1 buffer owned by the compositor, 1 in reserve, and 2 in client 
ownership (quad-buffering).

I think that we can coordinate the client owning more than buffer 
without any client sync for it to work, but let's wait until we have a 
driving case (i'm thinking of the Mali cores, which I've heard really 
like this) to work through those details.

Cheers,
Kevin



More information about the Mir-devel mailing list