diff options
-rw-r--r-- | src/egl/drivers/dri2/egl_dri2.c | 3 | ||||
-rw-r--r-- | src/egl/drivers/dri2/egl_dri2.h | 2 | ||||
-rw-r--r-- | src/egl/drivers/dri2/platform_wayland.c | 18 | ||||
-rw-r--r-- | src/egl/wayland/wayland-drm/wayland-drm.c | 31 | ||||
-rw-r--r-- | src/egl/wayland/wayland-drm/wayland-drm.h | 2 |
5 files changed, 51 insertions, 5 deletions
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index 892e32dd4e3..c98b9a5d18a 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -2797,7 +2797,8 @@ dri2_bind_wayland_display_wl(_EGLDriver *drv, _EGLDisplay *disp, const struct wayland_drm_callbacks wl_drm_callbacks = { .authenticate = (int(*)(void *, uint32_t)) dri2_dpy->vtbl->authenticate, .reference_buffer = dri2_wl_reference_buffer, - .release_buffer = dri2_wl_release_buffer + .release_buffer = dri2_wl_release_buffer, + .is_format_supported = dri2_wl_is_format_supported }; int flags = 0; uint64_t cap; diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h index 726ba16ae61..a9ddadf11b1 100644 --- a/src/egl/drivers/dri2/egl_dri2.h +++ b/src/egl/drivers/dri2/egl_dri2.h @@ -458,6 +458,8 @@ EGLBoolean dri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp); void dri2_teardown_wayland(struct dri2_egl_display *dri2_dpy); +bool +dri2_wl_is_format_supported(void* user_data, uint32_t format); #else static inline EGLBoolean dri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp) diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c index 872e265f509..c3ca1b6f7bc 100644 --- a/src/egl/drivers/dri2/platform_wayland.c +++ b/src/egl/drivers/dri2/platform_wayland.c @@ -174,6 +174,24 @@ dri2_wl_visual_idx_from_shm_format(uint32_t shm_format) return -1; } +bool +dri2_wl_is_format_supported(void* user_data, uint32_t format) +{ + _EGLDisplay *disp = (_EGLDisplay *) user_data; + struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); + int j = dri2_wl_visual_idx_from_fourcc(format); + + if (j == -1) + return false; + + for (int i = 0; dri2_dpy->driver_configs[i]; i++) + if (j == dri2_wl_visual_idx_from_config(dri2_dpy, + dri2_dpy->driver_configs[i])) + return true; + + return false; +} + static int roundtrip(struct dri2_egl_display *dri2_dpy) { diff --git a/src/egl/wayland/wayland-drm/wayland-drm.c b/src/egl/wayland/wayland-drm/wayland-drm.c index 3c6696dbffb..51cdd2cb845 100644 --- a/src/egl/wayland/wayland-drm/wayland-drm.c +++ b/src/egl/wayland/wayland-drm/wayland-drm.c @@ -111,6 +111,8 @@ drm_create_buffer(struct wl_client *client, struct wl_resource *resource, uint32_t stride, uint32_t format) { switch (format) { + case WL_DRM_FORMAT_ABGR2101010: + case WL_DRM_FORMAT_XBGR2101010: case WL_DRM_FORMAT_ARGB2101010: case WL_DRM_FORMAT_XRGB2101010: case WL_DRM_FORMAT_ARGB8888: @@ -210,10 +212,31 @@ bind_drm(struct wl_client *client, void *data, uint32_t version, uint32_t id) wl_resource_set_implementation(resource, &drm_interface, data, NULL); wl_resource_post_event(resource, WL_DRM_DEVICE, drm->device_name); - wl_resource_post_event(resource, WL_DRM_FORMAT, - WL_DRM_FORMAT_ARGB2101010); - wl_resource_post_event(resource, WL_DRM_FORMAT, - WL_DRM_FORMAT_XRGB2101010); + + if (drm->callbacks.is_format_supported(drm->user_data, + WL_DRM_FORMAT_ARGB2101010)) { + wl_resource_post_event(resource, WL_DRM_FORMAT, + WL_DRM_FORMAT_ARGB2101010); + } + + if (drm->callbacks.is_format_supported(drm->user_data, + WL_DRM_FORMAT_XRGB2101010)) { + wl_resource_post_event(resource, WL_DRM_FORMAT, + WL_DRM_FORMAT_XRGB2101010); + } + + if (drm->callbacks.is_format_supported(drm->user_data, + WL_DRM_FORMAT_ABGR2101010)) { + wl_resource_post_event(resource, WL_DRM_FORMAT, + WL_DRM_FORMAT_ABGR2101010); + } + + if (drm->callbacks.is_format_supported(drm->user_data, + WL_DRM_FORMAT_XBGR2101010)) { + wl_resource_post_event(resource, WL_DRM_FORMAT, + WL_DRM_FORMAT_XBGR2101010); + } + wl_resource_post_event(resource, WL_DRM_FORMAT, WL_DRM_FORMAT_ARGB8888); wl_resource_post_event(resource, WL_DRM_FORMAT, diff --git a/src/egl/wayland/wayland-drm/wayland-drm.h b/src/egl/wayland/wayland-drm/wayland-drm.h index 36e5bf042a7..8b7fd3b0b64 100644 --- a/src/egl/wayland/wayland-drm/wayland-drm.h +++ b/src/egl/wayland/wayland-drm/wayland-drm.h @@ -14,6 +14,8 @@ struct wayland_drm_callbacks { struct wl_drm_buffer *buffer); void (*release_buffer)(void *user_data, struct wl_drm_buffer *buffer); + + bool (*is_format_supported)(void *user_data, uint32_t format); }; |