This only implements the "primary_device" part. This allows EGL to work without relying on wl_drm anymore. ---
This simple patch implements version 4, which is still in review on wayland-devel [1]. [1]: https://patchwork.freedesktop.org/series/52370/ src/egl/drivers/dri2/platform_wayland.c | 58 +++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c index dc16a69dfb..6a656df062 100644 --- a/src/egl/drivers/dri2/platform_wayland.c +++ b/src/egl/drivers/dri2/platform_wayland.c @@ -332,10 +332,10 @@ dri2_wl_create_window_surface(_EGLDriver *drv, _EGLDisplay *disp, dri2_surf->dri_drawable = (*createNewDrawable)(dri2_dpy->dri_screen, config, dri2_surf); - if (dri2_surf->dri_drawable == NULL) { + if (dri2_surf->dri_drawable == NULL) { _eglError(EGL_BAD_ALLOC, "createNewDrawable"); goto cleanup_surf_wrapper; - } + } dri2_surf->base.SwapInterval = dri2_dpy->default_swap_interval; @@ -1119,6 +1119,10 @@ drm_handle_device(void *data, struct wl_drm *drm, const char *device) struct dri2_egl_display *dri2_dpy = data; drm_magic_t magic; + if (zwp_linux_dmabuf_v1_get_version(dri2_dpy->wl_dmabuf) >= + ZWP_LINUX_DMABUF_V1_GET_DEFAULT_HINTS_SINCE_VERSION) + return; + dri2_dpy->device_name = strdup(device); if (!dri2_dpy->device_name) return; @@ -1207,6 +1211,46 @@ static const struct zwp_linux_dmabuf_v1_listener dmabuf_listener = { .modifier = dmabuf_handle_modifier, }; +static void dmabuf_hints_handle_primary_device(void *data, + struct zwp_linux_dmabuf_hints_v1 *hints, int fd) +{ + struct dri2_egl_display *dri2_dpy = data; + + dri2_dpy->fd = fd; + dri2_dpy->authenticated = true; + + dri2_dpy->device_name = loader_get_device_name_for_fd(dri2_dpy->fd); + if (!dri2_dpy->device_name) { + _eglError(EGL_BAD_ALLOC, "wayland-egl: failed to get device name " + "for default GPU"); + } + + zwp_linux_dmabuf_hints_v1_destroy(hints); +} + +static void dmabuf_hints_ignore_modifier(void *data, + struct zwp_linux_dmabuf_hints_v1 *hints, uint32_t format, + uint32_t modifier_hi, uint32_t modifier_lo) +{ +} + +static void dmabuf_hints_ignore_tranch(void *data, + struct zwp_linux_dmabuf_hints_v1 *hints) +{ +} + +static void dmabuf_hints_ignore_done(void *data, + struct zwp_linux_dmabuf_hints_v1 *hints) +{ +} + +static const struct zwp_linux_dmabuf_hints_v1_listener dmabuf_hints_listener = { + .primary_device = dmabuf_hints_handle_primary_device, + .modifier = dmabuf_hints_ignore_modifier, + .tranch = dmabuf_hints_ignore_tranch, + .done = dmabuf_hints_ignore_done, +}; + static void registry_handle_global_drm(void *data, struct wl_registry *registry, uint32_t name, const char *interface, @@ -1221,9 +1265,17 @@ registry_handle_global_drm(void *data, struct wl_registry *registry, } else if (strcmp(interface, "zwp_linux_dmabuf_v1") == 0 && version >= 3) { dri2_dpy->wl_dmabuf = wl_registry_bind(registry, name, &zwp_linux_dmabuf_v1_interface, - MIN2(version, 3)); + MIN2(version, 4)); zwp_linux_dmabuf_v1_add_listener(dri2_dpy->wl_dmabuf, &dmabuf_listener, dri2_dpy); + + if (zwp_linux_dmabuf_v1_get_version(dri2_dpy->wl_dmabuf) >= + ZWP_LINUX_DMABUF_V1_GET_DEFAULT_HINTS_SINCE_VERSION) { + struct zwp_linux_dmabuf_hints_v1 *hints = + zwp_linux_dmabuf_v1_get_default_hints(dri2_dpy->wl_dmabuf); + zwp_linux_dmabuf_hints_v1_add_listener(hints, &dmabuf_hints_listener, + dri2_dpy); + } } } -- 2.19.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev