summaryrefslogtreecommitdiff
path: root/src/wayland/meta-wayland-buffer.c
diff options
context:
space:
mode:
authorDaniel Stone <daniels@collabora.com>2017-07-11 16:03:26 +0100
committerJonas Ã…dahl <jadahl@gmail.com>2017-08-01 19:05:50 +0800
commitb7b5fb293d1de3af9e533f2063749fde7a790945 (patch)
tree260e726d642dbaa1818f3348cf5127fc08eea172 /src/wayland/meta-wayland-buffer.c
parent1455c402b9e0f3251c7fe9b432d94f10d9bd051d (diff)
downloadmutter-b7b5fb293d1de3af9e533f2063749fde7a790945.tar.gz
wayland: Add zwp_linux_dmabuf_v1 support
https://bugzilla.gnome.org/show_bug.cgi?id=785262 Signed-off-by: Daniel Stone <daniels@collabora.com>
Diffstat (limited to 'src/wayland/meta-wayland-buffer.c')
-rw-r--r--src/wayland/meta-wayland-buffer.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/wayland/meta-wayland-buffer.c b/src/wayland/meta-wayland-buffer.c
index 1b10c51ff..63d5380be 100644
--- a/src/wayland/meta-wayland-buffer.c
+++ b/src/wayland/meta-wayland-buffer.c
@@ -25,11 +25,18 @@
#include "config.h"
#include "meta-wayland-buffer.h"
+#include "meta-wayland-dma-buf.h"
#include <clutter/clutter.h>
#include <cogl/cogl-egl.h>
#include <meta/util.h>
+#include <drm_fourcc.h>
+
+#ifndef DRM_FORMAT_MOD_INVALID
+#define DRM_FORMAT_MOD_INVALID ((1ULL << 56) - 1)
+#endif
+
#include "backends/meta-backend-private.h"
enum
@@ -97,6 +104,7 @@ meta_wayland_buffer_realize (MetaWaylandBuffer *buffer)
CoglContext *cogl_context = clutter_backend_get_cogl_context (clutter_backend);
EGLDisplay egl_display = cogl_egl_context_get_egl_display (cogl_context);
MetaWaylandEglStream *stream;
+ MetaWaylandDmaBufBuffer *dma_buf;
if (wl_shm_buffer_get (buffer->resource) != NULL)
{
@@ -120,6 +128,14 @@ meta_wayland_buffer_realize (MetaWaylandBuffer *buffer)
return TRUE;
}
+ dma_buf = meta_wayland_dma_buf_from_buffer (buffer);
+ if (dma_buf)
+ {
+ buffer->dma_buf.dma_buf = dma_buf;
+ buffer->type = META_WAYLAND_BUFFER_TYPE_DMA_BUF;
+ return TRUE;
+ }
+
return FALSE;
}
@@ -341,6 +357,8 @@ meta_wayland_buffer_attach (MetaWaylandBuffer *buffer,
return egl_image_buffer_attach (buffer, error);
case META_WAYLAND_BUFFER_TYPE_EGL_STREAM:
return egl_stream_buffer_attach (buffer, error);
+ case META_WAYLAND_BUFFER_TYPE_DMA_BUF:
+ return meta_wayland_dma_buf_buffer_attach (buffer, error);
case META_WAYLAND_BUFFER_TYPE_UNKNOWN:
g_assert_not_reached ();
return FALSE;
@@ -430,6 +448,7 @@ meta_wayland_buffer_process_damage (MetaWaylandBuffer *buffer,
res = process_shm_buffer_damage (buffer, region, &error);
case META_WAYLAND_BUFFER_TYPE_EGL_IMAGE:
case META_WAYLAND_BUFFER_TYPE_EGL_STREAM:
+ case META_WAYLAND_BUFFER_TYPE_DMA_BUF:
res = TRUE;
break;
case META_WAYLAND_BUFFER_TYPE_UNKNOWN:
@@ -453,6 +472,7 @@ meta_wayland_buffer_finalize (GObject *object)
g_clear_pointer (&buffer->texture, cogl_object_unref);
g_clear_object (&buffer->egl_stream.stream);
+ g_clear_object (&buffer->dma_buf.dma_buf);
G_OBJECT_CLASS (meta_wayland_buffer_parent_class)->finalize (object);
}