From 7796c2c56c960ac55e49246f0349ac52539ada55 Mon Sep 17 00:00:00 2001 From: Leandro Ribeiro Date: Sun, 10 Apr 2022 22:54:36 -0300 Subject: [PATCH] Revert "egl/wayland: deprecate drm_handle_format() and drm_handle_capabilities()" Commit af1ee8e010441f8f2ed8c77065b159652a4ac9fe dropped support to wl_drm, as we thought that most compositors from active projects were already supporting zwp_linux_dmabuf_v1. But that's not true, so revert this commit in order to give these projects a longer transition period. Note that we didn't add back the support to GEM name API, and that was on purpose. Signed-off-by: Leandro Ribeiro Reviewed-by: Simon Ser Part-of: Signed-off-by: Martin Jansa Upstream-Status: Backport [https://gitlab.freedesktop.org/mesa/mesa/-/commit/c60fea8c228ae3f32e20d6b65c473d9f04871d20] --- src/egl/drivers/dri2/egl_dri2.h | 1 + src/egl/drivers/dri2/platform_wayland.c | 59 +++++++++++++++++++------ 2 files changed, 47 insertions(+), 13 deletions(-) diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h index c466ff83c53..eecb32a53fd 100644 --- a/src/egl/drivers/dri2/egl_dri2.h +++ b/src/egl/drivers/dri2/egl_dri2.h @@ -283,6 +283,7 @@ struct dri2_egl_display struct zwp_linux_dmabuf_feedback_v1 *wl_dmabuf_feedback; struct dmabuf_feedback_format_table format_table; bool authenticated; + uint32_t capabilities; char *device_name; #endif diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c index 5ff83cce08a..843434376a7 100644 --- a/src/egl/drivers/dri2/platform_wayland.c +++ b/src/egl/drivers/dri2/platform_wayland.c @@ -1343,7 +1343,7 @@ create_wl_buffer(struct dri2_egl_display *dri2_dpy, struct dri2_egl_surface *dri2_surf, __DRIimage *image) { - struct wl_buffer *ret; + struct wl_buffer *ret = NULL; EGLBoolean query; int width, height, fourcc, num_planes; uint64_t modifier = DRM_FORMAT_MOD_INVALID; @@ -1447,11 +1447,28 @@ create_wl_buffer(struct dri2_egl_display *dri2_dpy, ret = zwp_linux_buffer_params_v1_create_immed(params, width, height, fourcc, 0); zwp_linux_buffer_params_v1_destroy(params); + } else { + struct wl_drm *wl_drm = + dri2_surf ? dri2_surf->wl_drm_wrapper : dri2_dpy->wl_drm; + int fd = -1, stride; + + if (num_planes > 1) + return NULL; + + query = dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_FD, &fd); + query &= dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_STRIDE, &stride); + if (!query) { + if (fd >= 0) + close(fd); + return NULL; + } - return ret; + ret = wl_drm_create_prime_buffer(wl_drm, fd, width, height, fourcc, 0, + stride, 0, 0, 0, 0); + close(fd); } - return NULL; + return ret; } static EGLBoolean @@ -1698,16 +1715,21 @@ drm_handle_device(void *data, struct wl_drm *drm, const char *device) static void drm_handle_format(void *data, struct wl_drm *drm, uint32_t format) { - /* deprecated, as compositors already support the dma-buf protocol extension - * and so we can rely on dmabuf_handle_modifier() to receive formats and - * modifiers */ + struct dri2_egl_display *dri2_dpy = data; + int visual_idx = dri2_wl_visual_idx_from_fourcc(format); + + if (visual_idx == -1) + return; + + BITSET_SET(dri2_dpy->formats.formats_bitmap, visual_idx); } static void drm_handle_capabilities(void *data, struct wl_drm *drm, uint32_t value) { - /* deprecated, as compositors already support the dma-buf protocol extension - * and so we can rely on it to create wl_buffer's */ + struct dri2_egl_display *dri2_dpy = data; + + dri2_dpy->capabilities = value; } static void @@ -2075,13 +2097,12 @@ dri2_initialize_wayland_drm(_EGLDisplay *disp) wl_registry_add_listener(dri2_dpy->wl_registry, ®istry_listener_drm, dri2_dpy); - /* The compositor must expose the dma-buf interface. */ - if (roundtrip(dri2_dpy) < 0 || dri2_dpy->wl_dmabuf == NULL) + if (roundtrip(dri2_dpy) < 0) goto cleanup; /* Get default dma-buf feedback */ - if (zwp_linux_dmabuf_v1_get_version(dri2_dpy->wl_dmabuf) >= - ZWP_LINUX_DMABUF_V1_GET_DEFAULT_FEEDBACK_SINCE_VERSION) { + if (dri2_dpy->wl_dmabuf && zwp_linux_dmabuf_v1_get_version(dri2_dpy->wl_dmabuf) >= + ZWP_LINUX_DMABUF_V1_GET_DEFAULT_FEEDBACK_SINCE_VERSION) { dmabuf_feedback_format_table_init(&dri2_dpy->format_table); dri2_dpy->wl_dmabuf_feedback = zwp_linux_dmabuf_v1_get_default_feedback(dri2_dpy->wl_dmabuf); @@ -2089,7 +2110,6 @@ dri2_initialize_wayland_drm(_EGLDisplay *disp) &dmabuf_feedback_listener, dri2_dpy); } - /* Receive events from the interfaces */ if (roundtrip(dri2_dpy) < 0) goto cleanup; @@ -2176,6 +2196,19 @@ dri2_initialize_wayland_drm(_EGLDisplay *disp) dri2_wl_setup_swap_interval(disp); + if (dri2_dpy->wl_drm) { + /* To use Prime, we must have _DRI_IMAGE v7 at least. createImageFromFds + * support indicates that Prime export/import is supported by the driver. + * We deprecated the support to GEM names API, so we bail out if the + * driver does not suport Prime. */ + if (!(dri2_dpy->capabilities & WL_DRM_CAPABILITY_PRIME) || + (dri2_dpy->image->base.version < 7) || + (dri2_dpy->image->createImageFromFds == NULL)) { + _eglLog(_EGL_WARNING, "wayland-egl: display does not support prime"); + goto cleanup; + } + } + if (dri2_dpy->is_different_gpu && (dri2_dpy->image->base.version < 9 || dri2_dpy->image->blitImage == NULL)) { -- 2.35.1