aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2021-03-23 00:06:40 +0100
committerSimon Ser <contact@emersion.fr>2021-03-23 23:32:44 +0100
commitd9cae04ffc3140408f2604eeff7d4776fe8d9548 (patch)
treed737a94de5871823d493b95283d5158acadd0145
parent6230f7be4f92b83df7ea8e6487410b3b81dd4b1d (diff)
linux-dmabuf-v1: always advertise support for implicit modifiers
Some clients (like Xwayland) will fallback to wl_drm if the compositor doesn't explicitly advertise support for implicit modifiers, even when the compositor supports explicit modifiers. This behavior sounds correct from a protocol point of view.
-rw-r--r--types/wlr_linux_dmabuf_v1.c49
1 files changed, 22 insertions, 27 deletions
diff --git a/types/wlr_linux_dmabuf_v1.c b/types/wlr_linux_dmabuf_v1.c
index 87fe3a7c..5fea0a79 100644
--- a/types/wlr_linux_dmabuf_v1.c
+++ b/types/wlr_linux_dmabuf_v1.c
@@ -385,9 +385,26 @@ struct wlr_linux_dmabuf_v1 *wlr_linux_dmabuf_v1_from_resource(
return dmabuf;
}
+static void linux_dmabuf_send_modifiers(struct wl_resource *resource,
+ const struct wlr_drm_format *fmt) {
+ if (wl_resource_get_version(resource) < ZWP_LINUX_DMABUF_V1_MODIFIER_SINCE_VERSION) {
+ zwp_linux_dmabuf_v1_send_format(resource, fmt->format);
+ 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,
+ mod >> 32, mod & 0xFFFFFFFF);
+ }
+
+ // We always support buffers with an implicit modifier
+ zwp_linux_dmabuf_v1_send_modifier(resource, fmt->format,
+ DRM_FORMAT_MOD_INVALID >> 32, DRM_FORMAT_MOD_INVALID & 0xFFFFFFFF);
+}
+
static void linux_dmabuf_send_formats(struct wlr_linux_dmabuf_v1 *linux_dmabuf,
- struct wl_resource *resource, uint32_t version) {
- uint64_t modifier_invalid = DRM_FORMAT_MOD_INVALID;
+ struct wl_resource *resource) {
const struct wlr_drm_format_set *formats =
wlr_renderer_get_dmabuf_texture_formats(linux_dmabuf->renderer);
if (formats == NULL) {
@@ -395,30 +412,8 @@ static void linux_dmabuf_send_formats(struct wlr_linux_dmabuf_v1 *linux_dmabuf,
}
for (size_t i = 0; i < formats->len; i++) {
- struct wlr_drm_format *fmt = formats->formats[i];
-
- size_t modifiers_len = fmt->len;
- uint64_t *modifiers = fmt->modifiers;
-
- // Send DRM_FORMAT_MOD_INVALID token when no modifiers are supported
- // for this format
- if (modifiers_len == 0) {
- modifiers_len = 1;
- modifiers = &modifier_invalid;
- }
- for (size_t j = 0; j < modifiers_len; j++) {
- if (version >= ZWP_LINUX_DMABUF_V1_MODIFIER_SINCE_VERSION) {
- uint32_t modifier_lo = modifiers[j] & 0xFFFFFFFF;
- uint32_t modifier_hi = modifiers[j] >> 32;
- zwp_linux_dmabuf_v1_send_modifier(resource,
- fmt->format,
- modifier_hi,
- modifier_lo);
- } else if (modifiers[j] == DRM_FORMAT_MOD_LINEAR ||
- modifiers == &modifier_invalid) {
- zwp_linux_dmabuf_v1_send_format(resource, fmt->format);
- }
- }
+ const struct wlr_drm_format *fmt = formats->formats[i];
+ linux_dmabuf_send_modifiers(resource, fmt);
}
}
@@ -434,7 +429,7 @@ static void linux_dmabuf_bind(struct wl_client *client, void *data,
}
wl_resource_set_implementation(resource, &linux_dmabuf_impl,
linux_dmabuf, NULL);
- linux_dmabuf_send_formats(linux_dmabuf, resource, version);
+ linux_dmabuf_send_formats(linux_dmabuf, resource);
}
static void linux_dmabuf_v1_destroy(struct wlr_linux_dmabuf_v1 *linux_dmabuf) {