[PATCH weston v3 07/13] window: implement shm triple-buffering
Bill Spitzak
spitzak at gmail.com
Sat Apr 27 18:41:48 PDT 2013
On 04/27/2013 05:21 AM, Pekka Paalanen wrote:
> 1. There is a window with a main surface and a sub-surface is in
> desync mode. Sub-surface is running independently. Sub-surface has
> buffer B1 reserved by the server on display.
> 2. Application decides the window must resize.
> 3. The sub-surface is set sync.
> 4. Meanwhile the sub-surface component keeps on running: it draws
> and commits buffer B2.
> 5. Due to sync mode, B2 goes into cache instead. B1 is still on
> display. Both B1 and B2 stay reserved indefinitely.
> 6. Application tells sub-surface component to resize, and waits for
> it to do so.
> 7. Sub-surface component obviously does not get a frame callback
> for B2, so it is still waiting on that.
> 8. Sub-surface component gets the command to resize, and needs to
> redraw.
> 9. Sub-surface component draws and commits buffer B3, and acks the
> resize.
> 10. The application gets the ack.
> 11. The application draws and commits the main surface in the new
> size.
> 12. The application reverts the sub-surface mode to desync.
> 13. Due to step 9, the server releases buffer B2.
> 14. The main surface commit causes a server repaint cycle to start.
> 15. The main surface, and the sub-surface with buffer B3 are
> updated atomically on display.
> 16. The server releases buffer B1.
That does sound right.
If the server somehow knew that B2 was not in response to the resize, it
could composite the old buffers for the main surface with B2 and then
free B1. The client for the subsurface could then wait for B1 to be
freed before it starts working on the new resize surface.
I think this could be known by adding some kind of serial numbers in the
set-sync and buffer attach requests. It might be nice to fix this so if
the resize is slow to respond the video playback keeps happening.
However another problem is *after* the resize. The subsurface client may
want to update the frame several times after the resize even if the
parent has not done a commit yet. The compositor cannot use these
buffers because they don't match the main surface, so serial numbers
will not help. So the need for 3 buffers remains there.
In fact there may be a problem without subsurfaces. If a client wants to
update it's drawing 60 times a second, and the compositor for some
reason is not responding, that client probably wants the compositor to
show the *newest* frame when it finally does, not the oldest. So it does
not want to block waiting for the old buffer to be released, and wants
the triple buffering anyway with one buffer always containing the newest
image. I think it would be ok to require compositors to free one of two
outstanding buffers very soon after a third is attached so clients do
not need to track more than that.
More information about the wayland-devel
mailing list