From: Philipp Kerling Date: Wed, 16 Aug 2017 10:37:27 +0000 (+0200) Subject: wayland: Add wl_drm listener immediately upon bind X-Git-Tag: android-x86-8.1-r1~153 X-Git-Url: http://git.osdn.net/view?p=android-x86%2Fhardware-intel-common-libva.git;a=commitdiff_plain;h=9ca99eb84cdb6ea638af567f6074c53fa51a416c wayland: Add wl_drm listener immediately upon bind Events on wl_drm could get lost if the listener is bound only after the roundtrip is complete. While it is correct that to get all wl_drm events at most two roundtrips are required, in fact one roundtrip may be enough if another thread flushes and reads from the connection in parallel to the initial libva wl_registry roundtrip. It is thus too late to call wl_drm_add_listener after the roundtrip. Fixes: #101 --- diff --git a/va/wayland/va_wayland_drm.c b/va/wayland/va_wayland_drm.c index 552f243..d8c4ec9 100644 --- a/va/wayland/va_wayland_drm.c +++ b/va/wayland/va_wayland_drm.c @@ -154,7 +154,8 @@ registry_handle_global( uint32_t version ) { - struct va_wayland_drm_context *wl_drm_ctx = data; + VADisplayContextP const pDisplayContext = data; + struct va_wayland_drm_context * const wl_drm_ctx = pDisplayContext->opaque; if (strcmp(interface, "wl_drm") == 0) { /* bind to at most version 2, but also support version 1 if @@ -164,6 +165,13 @@ registry_handle_global( wl_drm_ctx->drm = wl_registry_bind(wl_drm_ctx->registry, name, &wl_drm_interface, (version < 2) ? version : 2); + + if (wl_drm_ctx->drm + && wl_drm_add_listener(wl_drm_ctx->drm, &drm_listener, pDisplayContext) != 0) { + va_wayland_error("could not add listener to wl_drm"); + wl_drm_destroy(wl_drm_ctx->drm); + wl_drm_ctx->drm = NULL; + } } } @@ -259,7 +267,7 @@ va_wayland_drm_create(VADisplayContextP pDisplayContext) va_wayland_error("could not create wl_registry"); goto end; } - if (wl_registry_add_listener(wl_drm_ctx->registry, ®istry_listener, wl_drm_ctx) != 0) { + if (wl_registry_add_listener(wl_drm_ctx->registry, ®istry_listener, pDisplayContext) != 0) { va_wayland_error("could not add listener to wl_registry"); goto end; } @@ -273,11 +281,6 @@ va_wayland_drm_create(VADisplayContextP pDisplayContext) /* Do not print an error, the compositor might just not support wl_drm */ if (!wl_drm_ctx->drm) goto end; - - if (wl_drm_add_listener(wl_drm_ctx->drm, &drm_listener, pDisplayContext) != 0) { - va_wayland_error("could not add listener to wl_drm"); - goto end; - } if (!wayland_roundtrip_queue(ctx->native_dpy, wl_drm_ctx->queue)) goto end; if (drm_state->fd < 0) {