diff options
author | Daniel Stone <daniels@collabora.com> | 2017-07-11 16:03:26 +0100 |
---|---|---|
committer | Jonas Ã…dahl <jadahl@gmail.com> | 2017-08-01 19:05:50 +0800 |
commit | b7b5fb293d1de3af9e533f2063749fde7a790945 (patch) | |
tree | 260e726d642dbaa1818f3348cf5127fc08eea172 /src/wayland/meta-wayland-buffer.c | |
parent | 1455c402b9e0f3251c7fe9b432d94f10d9bd051d (diff) | |
download | mutter-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.c | 20 |
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); } |