aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRouven Czerwinski <rouven@czerwinskis.de>2021-11-27 19:08:18 +0100
committerRouven Czerwinski <rouven@czerwinskis.de>2021-11-27 19:32:25 +0100
commitd37eb5c2eaedcada7dd39da1a31c6e9a39c8ed46 (patch)
treef0abe46ba77560e79bc2e19a39dfb6c705bfc6cd
parent254ab890e787ccee1e33fb420781c9696761ce3c (diff)
linux-dmabuf-v1: filter out LINEAR if implicit
If only INVALID and LINEAR are valid modifiers, we need to filter out LINEAR since Xwayland won't be able to allocate a BO with the explicit linear modifier on hardware that does not support explicit modifiers. The addition of LINEAR is an internal implementation detail which simplifies the wlroots architecture for now. Evntually Xwayland should be fixed to filter out modifiers that are not supported by the GBM implementation, see [1]. This could be done by querying EGL for the supported modifiers. [1]: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1166
-rw-r--r--types/wlr_linux_dmabuf_v1.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/types/wlr_linux_dmabuf_v1.c b/types/wlr_linux_dmabuf_v1.c
index dc5ca8af..4b2b965c 100644
--- a/types/wlr_linux_dmabuf_v1.c
+++ b/types/wlr_linux_dmabuf_v1.c
@@ -434,6 +434,16 @@ static void linux_dmabuf_send_modifiers(struct wl_resource *resource,
return;
}
+ // In case only INVALID and LINEAR are advertised, send INVALID only due to XWayland:
+ // https://gitlab.freedesktop.org/xorg/xserver/-/issues/1166
+ if (fmt->len == 2 && wlr_drm_format_has(fmt, DRM_FORMAT_MOD_INVALID)
+ && wlr_drm_format_has(fmt, DRM_FORMAT_MOD_INVALID)) {
+ uint64_t mod = DRM_FORMAT_MOD_INVALID;
+ zwp_linux_dmabuf_v1_send_modifier(resource, fmt->format,
+ mod >> 32, mod & 0xFFFFFFFF);
+ return;
+ }
+
for (size_t i = 0; i < fmt->len; i++) {
uint64_t mod = fmt->modifiers[i];
zwp_linux_dmabuf_v1_send_modifier(resource, fmt->format,