egl/wayland: Use per-surface event queues
authorDaniel Stone <daniels@collabora.com>
Fri, 5 May 2017 13:49:09 +0000 (14:49 +0100)
committerDaniel Stone <daniels@collabora.com>
Fri, 19 May 2017 08:36:15 +0000 (09:36 +0100)
commit03dd9a88b0be17ff0ce91e92f6902a9a85ba584a
tree978da64dd573c4a85bc43002dc525ade89482abd
parent8118bc269f39ea0b965752ea89b886b28094db42
egl/wayland: Use per-surface event queues

During display initialisation, we need a separate event queue to handle
the registry events, which is correctly handled. But we also need
separate per-surface event queues to handle swapchain-related events,
such as surface frame events and buffer release events. This avoids two
surfaces from the same EGLDisplay, both current on separate threads,
dispatching each other's events.

Create separate per-surface event queues, create wl_surface and wl_drm
proxy wrapper objects per surface, so we eliminate the race around
sending events to the wrong queue. swrast buffers do not need a
dedicated proxy wrapper, as the wl_shm_pool used to create the
wl_buffers, being transient, can itself be assigned to a queue.

Signed-off-by: Daniel Stone <daniels@collabora.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Fixes: 36b9976e1f99 ("egl/wayland: Avoid race conditions when on non-main thread")
Cc: mesa-stable@lists.freedesktop.org
src/egl/drivers/dri2/egl_dri2.h
src/egl/drivers/dri2/platform_wayland.c