From: Pekka Paalanen <pekka.paala...@collabora.co.uk> Explain carefully why we need two roundtrips, not just one, not just dispatch and roundtrip, but two roundtrips after creating the wl_registry object.
Signed-off-by: Pekka Paalanen <pekka.paala...@collabora.co.uk> --- clients/simple-shm.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/clients/simple-shm.c b/clients/simple-shm.c index c1cb386..996a8a9 100644 --- a/clients/simple-shm.c +++ b/clients/simple-shm.c @@ -388,6 +388,36 @@ create_display(void) wl_display_roundtrip(display->display); + /* + * Why do we need two roundtrips here? + * + * wl_display_get_registry() sends a request to the server, to which + * the server replies by emitting the wl_registry.global events. + * The first wl_display_roundtrip() sends wl_display.sync. The server + * first processes the wl_display.get_registry which includes sending + * the global events, and then processes the sync. Therefore when the + * sync (roundtrip) returns, we are guaranteed to have received and + * processed all the global events. + * + * While we are inside the first wl_display_roundtrip(), incoming + * events are dispatched, which causes registry_handle_global() to + * be called for each global. One of these globals is wl_shm. + * registry_handle_global() sends wl_registry.bind request for the + * wl_shm global. However, wl_registry.bind request is sent only after + * the first wl_display.sync, so the reply to the sync comes before + * the initial events of the wl_shm object. + * + * When the reply to the first sync comes, the server may or may not + * have sent initial wl_shm events. Therefore we need the second + * wl_display_roundtrip() call here. + * + * The server processes the wl_registry.bind for wl_shm first, and + * the second wl_display.sync next. During our second call to + * wl_display_roundtrip() the initial wl_shm events are received and + * processed. Finally, when the reply to the second wl_display.sync + * arrives, it guarantees we have processed all wl_shm initial events. + */ + if (!(display->formats & (1 << WL_SHM_FORMAT_XRGB8888))) { fprintf(stderr, "WL_SHM_FORMAT_XRGB32 not available\n"); exit(1); -- 2.0.4 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel