client/dmabuf-v4l: Use zwp_linux_dmabuf version 3
We're missing format checks and still using first version of zwp_linux_dmabuf protocol. Use the latest release and check that the advertised formats/modifier accepts the user-supplied requested DRM format. Accept the format only if the modifier is LINEAR (@emersion). Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
This commit is contained in:
committed by
Pekka Paalanen
parent
83fb745ccf
commit
4960955e0f
+19
-10
@@ -51,6 +51,8 @@
|
|||||||
#include "fullscreen-shell-unstable-v1-client-protocol.h"
|
#include "fullscreen-shell-unstable-v1-client-protocol.h"
|
||||||
#include "linux-dmabuf-unstable-v1-client-protocol.h"
|
#include "linux-dmabuf-unstable-v1-client-protocol.h"
|
||||||
|
|
||||||
|
#include "shared/helpers.h"
|
||||||
|
|
||||||
#define CLEAR(x) memset(&(x), 0, sizeof(x))
|
#define CLEAR(x) memset(&(x), 0, sizeof(x))
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -696,17 +698,27 @@ static const struct wl_callback_listener frame_listener = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dmabuf_format(void *data, struct zwp_linux_dmabuf_v1 *zwp_linux_dmabuf,
|
dmabuf_modifier(void *data, struct zwp_linux_dmabuf_v1 *zwp_linux_dmabuf,
|
||||||
uint32_t format)
|
uint32_t format, uint32_t modifier_hi, uint32_t modifier_lo)
|
||||||
{
|
{
|
||||||
struct display *d = data;
|
struct display *d = data;
|
||||||
|
uint64_t modifier = ((uint64_t) modifier_hi << 32 ) | modifier_lo;
|
||||||
|
|
||||||
if (format == d->drm_format)
|
if (format == d->drm_format && modifier == DRM_FORMAT_MOD_LINEAR)
|
||||||
d->requested_format_found = true;
|
d->requested_format_found = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
dmabuf_format(void *data, struct zwp_linux_dmabuf_v1 *zwp_linux_dmabuf,
|
||||||
|
uint32_t format)
|
||||||
|
{
|
||||||
|
/* deprecated */
|
||||||
|
}
|
||||||
|
|
||||||
static const struct zwp_linux_dmabuf_v1_listener dmabuf_listener = {
|
static const struct zwp_linux_dmabuf_v1_listener dmabuf_listener = {
|
||||||
dmabuf_format
|
dmabuf_format,
|
||||||
|
dmabuf_modifier
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -813,8 +825,7 @@ registry_handle_global(void *data, struct wl_registry *registry,
|
|||||||
1);
|
1);
|
||||||
} else if (strcmp(interface, "zwp_linux_dmabuf_v1") == 0) {
|
} else if (strcmp(interface, "zwp_linux_dmabuf_v1") == 0) {
|
||||||
d->dmabuf = wl_registry_bind(registry,
|
d->dmabuf = wl_registry_bind(registry,
|
||||||
id, &zwp_linux_dmabuf_v1_interface,
|
id, &zwp_linux_dmabuf_v1_interface, 3);
|
||||||
1);
|
|
||||||
zwp_linux_dmabuf_v1_add_listener(d->dmabuf, &dmabuf_listener,
|
zwp_linux_dmabuf_v1_add_listener(d->dmabuf, &dmabuf_listener,
|
||||||
d);
|
d);
|
||||||
}
|
}
|
||||||
@@ -857,11 +868,9 @@ create_display(uint32_t requested_format)
|
|||||||
|
|
||||||
wl_display_roundtrip(display->display);
|
wl_display_roundtrip(display->display);
|
||||||
|
|
||||||
/* XXX: fake, because the compositor does not yet advertise anything */
|
|
||||||
display->requested_format_found = true;
|
|
||||||
|
|
||||||
if (!display->requested_format_found) {
|
if (!display->requested_format_found) {
|
||||||
fprintf(stderr, "DRM_FORMAT_YUYV not available\n");
|
fprintf(stderr, "0x%lx requested DRM format not available\n",
|
||||||
|
(unsigned long) requested_format);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user