diff --git a/.pick_status.json b/.pick_status.json index 5ae34e6d01b..69b0a0fcde2 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1854,7 +1854,7 @@ "description": "wsi/wayland: Use `wl_fixes` to destroy `wl_registry`", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h index 04c9d4840db..4ee70dfae18 100644 --- a/src/egl/drivers/dri2/egl_dri2.h +++ b/src/egl/drivers/dri2/egl_dri2.h @@ -55,6 +55,7 @@ struct wl_drm; struct wl_registry; struct wl_shm; struct wl_surface; +struct wl_fixes; struct zwp_linux_dmabuf_v1; struct zwp_linux_dmabuf_feedback_v1; #endif @@ -279,6 +280,7 @@ struct dri2_egl_display { #endif struct wl_shm *wl_shm; struct wl_event_queue *wl_queue; + struct wl_fixes *wl_fixes; struct zwp_linux_dmabuf_v1 *wl_dmabuf; struct wp_presentation *wp_presentation; struct dri2_wl_formats formats; diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c index 89c046d8d48..2aaeabecdcd 100644 --- a/src/egl/drivers/dri2/platform_wayland.c +++ b/src/egl/drivers/dri2/platform_wayland.c @@ -2312,6 +2312,10 @@ registry_handle_global_drm(void *data, struct wl_registry *registry, wl_registry_bind(registry, name, &wp_presentation_interface, 1); wp_presentation_add_listener(dri2_dpy->wp_presentation, &presentation_listener, dri2_dpy); +#ifdef WL_FIXES_INTERFACE + } else if (strcmp(interface, wl_fixes_interface.name) == 0) { + dri2_dpy->wl_fixes = wl_registry_bind(registry, name, &wl_fixes_interface, 1); +#endif } } @@ -3150,6 +3154,10 @@ registry_handle_global_swrast(void *data, struct wl_registry *registry, wl_registry_bind(registry, name, &wp_presentation_interface, 1); wp_presentation_add_listener(dri2_dpy->wp_presentation, &presentation_listener, dri2_dpy); +#ifdef WL_FIXES_INTERFACE + } else if (strcmp(interface, wl_fixes_interface.name) == 0) { + dri2_dpy->wl_fixes = wl_registry_bind(registry, name, &wl_fixes_interface, 1); +#endif } } @@ -3294,8 +3302,17 @@ dri2_teardown_wayland(struct dri2_egl_display *dri2_dpy) zwp_linux_dmabuf_v1_destroy(dri2_dpy->wl_dmabuf); if (dri2_dpy->wl_shm) wl_shm_destroy(dri2_dpy->wl_shm); - if (dri2_dpy->wl_registry) + if (dri2_dpy->wl_registry) { +#ifdef WL_FIXES_INTERFACE + if (dri2_dpy->wl_fixes) + wl_fixes_destroy_registry(dri2_dpy->wl_fixes, dri2_dpy->wl_registry); +#endif wl_registry_destroy(dri2_dpy->wl_registry); + } +#ifdef WL_FIXES_INTERFACE + if (dri2_dpy->wl_fixes) + wl_fixes_destroy(dri2_dpy->wl_fixes); +#endif if (dri2_dpy->wl_dpy_wrapper) wl_proxy_wrapper_destroy(dri2_dpy->wl_dpy_wrapper); if (dri2_dpy->wl_queue) diff --git a/src/vulkan/device-select-layer/device_select_wayland.c b/src/vulkan/device-select-layer/device_select_wayland.c index 5846d2aaa2c..3f574345f6b 100644 --- a/src/vulkan/device-select-layer/device_select_wayland.c +++ b/src/vulkan/device-select-layer/device_select_wayland.c @@ -41,6 +41,7 @@ struct device_select_wayland_info { struct zwp_linux_dmabuf_v1 *wl_dmabuf; struct zwp_linux_dmabuf_feedback_v1 *wl_dmabuf_feedback; + struct wl_fixes *wl_fixes; drmDevicePtr dmabuf_dev_info; }; @@ -168,13 +169,17 @@ device_select_registry_global(void *data, struct wl_registry *registry, uint32_t wl_drm_add_listener(info->wl_drm, &ds_drm_listener, data); } else #endif - if (strcmp(interface, zwp_linux_dmabuf_v1_interface.name) == 0 && - version >= ZWP_LINUX_DMABUF_V1_GET_DEFAULT_FEEDBACK_SINCE_VERSION) { + if (strcmp(interface, zwp_linux_dmabuf_v1_interface.name) == 0 && + version >= ZWP_LINUX_DMABUF_V1_GET_DEFAULT_FEEDBACK_SINCE_VERSION) { info->wl_dmabuf = wl_registry_bind(registry, name, &zwp_linux_dmabuf_v1_interface, ZWP_LINUX_DMABUF_V1_GET_DEFAULT_FEEDBACK_SINCE_VERSION); info->wl_dmabuf_feedback = zwp_linux_dmabuf_v1_get_default_feedback(info->wl_dmabuf); zwp_linux_dmabuf_feedback_v1_add_listener(info->wl_dmabuf_feedback, &dmabuf_feedback_listener, data); +#ifdef WL_FIXES_INTERFACE + } else if (strcmp(interface, wl_fixes_interface.name) == 0) { + info->wl_fixes = wl_registry_bind(registry, name, &wl_fixes_interface, 1); +#endif } } @@ -255,6 +260,12 @@ done: if (info.wl_drm) wl_drm_destroy(info.wl_drm); #endif +#ifdef WL_FIXES_INTERFACE + if (info.wl_fixes) { + wl_fixes_destroy_registry(info.wl_fixes, registry); + wl_fixes_destroy(info.wl_fixes); + } +#endif wl_registry_destroy(registry); wl_display_disconnect(display); diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c index 083777f42ac..e3af0d9d791 100644 --- a/src/vulkan/wsi/wsi_common_wayland.c +++ b/src/vulkan/wsi/wsi_common_wayland.c @@ -104,6 +104,7 @@ struct wsi_wl_display { /* Actually a proxy wrapper around the event queue */ struct wl_display *wl_display_wrapper; struct wl_event_queue *queue; + struct wl_fixes *wl_fixes; struct wl_shm *wl_shm; struct zwp_linux_dmabuf_v1 *wl_dmabuf; @@ -1418,6 +1419,11 @@ registry_handle_global(void *data, struct wl_registry *registry, } else if (strcmp(interface, wp_linux_drm_syncobj_manager_v1_interface.name) == 0) { display->wl_syncobj = wl_registry_bind(registry, name, &wp_linux_drm_syncobj_manager_v1_interface, 1); +#ifdef WL_FIXES_INTERFACE + } else if (strcmp(interface, wl_fixes_interface.name) == 0) { + display->wl_fixes = + wl_registry_bind(registry, name, &wl_fixes_interface, 1); +#endif } } @@ -1476,6 +1482,10 @@ wsi_wl_display_finish(struct wsi_wl_display *display) u_vector_finish(&display->color_primaries); u_vector_finish(&display->color_transfer_funcs); +#ifdef WL_FIXES_INTERFACE + if (display->wl_fixes) + wl_fixes_destroy(display->wl_fixes); +#endif if (display->wl_shm) wl_shm_destroy(display->wl_shm); if (display->wl_syncobj) @@ -1607,6 +1617,10 @@ wsi_wl_display_init(struct wsi_wayland *wsi_wl, out: /* We don't need this anymore */ +#ifdef WL_FIXES_INTERFACE + if (display->wl_fixes) + wl_fixes_destroy_registry(display->wl_fixes, registry); +#endif wl_registry_destroy(registry); /* Destroy default dma-buf feedback object and format table */ @@ -1619,8 +1633,13 @@ out: return VK_SUCCESS; fail_registry: - if (registry) + if (registry) { +#ifdef WL_FIXES_INTERFACE + if (display->wl_fixes) + wl_fixes_destroy_registry(display->wl_fixes, registry); +#endif wl_registry_destroy(registry); + } fail: wsi_wl_display_finish(display);