Add an optional egl_backend callback to check that the required Wayland interfaces are available.
Signed-off-by: Olivier Fourdan <ofour...@redhat.com> --- hw/xwayland/xwayland-glamor.c | 9 +++++++++ hw/xwayland/xwayland.c | 4 ++++ hw/xwayland/xwayland.h | 7 +++++++ 3 files changed, 20 insertions(+) diff --git a/hw/xwayland/xwayland-glamor.c b/hw/xwayland/xwayland-glamor.c index 6ae274c08..aeb0b27b9 100644 --- a/hw/xwayland/xwayland-glamor.c +++ b/hw/xwayland/xwayland-glamor.c @@ -162,6 +162,15 @@ xwl_glamor_init_wl_registry(struct xwl_screen *xwl_screen, interface, id, version); } +Bool +xwl_glamor_has_wl_interface(struct xwl_screen *xwl_screen) +{ + if (xwl_screen->egl_backend.has_wl_interface) + return xwl_screen->egl_backend.has_wl_interface(xwl_screen); + + return TRUE; +} + struct wl_buffer * xwl_glamor_pixmap_get_wl_buffer(PixmapPtr pixmap, unsigned short width, diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c index 4dd8f3810..d831291ca 100644 --- a/hw/xwayland/xwayland.c +++ b/hw/xwayland/xwayland.c @@ -1091,6 +1091,10 @@ xwl_screen_init(ScreenPtr pScreen, int argc, char **argv) return FALSE; #ifdef XWL_HAS_GLAMOR + if (xwl_screen->glamor && !xwl_glamor_has_wl_interface(xwl_screen)) { + ErrorF("Missing Wayland interfaces required for glamor, falling back to sw\n"); + xwl_screen->glamor = 0; + } if (xwl_screen->glamor && !xwl_glamor_init(xwl_screen)) { ErrorF("Failed to initialize glamor, falling back to sw\n"); xwl_screen->glamor = 0; diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h index ff746114c..62cb40f08 100644 --- a/hw/xwayland/xwayland.h +++ b/hw/xwayland/xwayland.h @@ -120,6 +120,12 @@ struct xwl_screen { const char *name, uint32_t id, uint32_t version); + /* Check that the required Wayland interfaces are available. + * This callback is optional. + */ + Bool (*has_wl_interface)(struct xwl_screen *xwl_screen); + + /* Called before glamor has been initialized. Backends should setup a * valid, glamor compatible EGL context in this hook. */ @@ -429,6 +435,7 @@ void xwl_glamor_init_wl_registry(struct xwl_screen *xwl_screen, struct wl_registry *registry, uint32_t id, const char *interface, uint32_t version); +Bool xwl_glamor_has_wl_interface(struct xwl_screen *xwl_screen); void xwl_glamor_post_damage(struct xwl_window *xwl_window, PixmapPtr pixmap, RegionPtr region); Bool xwl_glamor_allow_commits(struct xwl_window *xwl_window); -- 2.17.0 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: https://lists.x.org/mailman/listinfo/xorg-devel