[PATCH v3] Add wl_dmabuf protocol
benjamin.gaignard at linaro.org
benjamin.gaignard at linaro.org
Thu Dec 12 12:27:20 PST 2013
From: Benjamin Gaignard <benjamin.gaignard at linaro.org>
It allow to use a dmabuf file descriptor in a wayland protocol.
To make as generic as possible it is up to the server to call
wl_dmabuf_send_format() and/or wl_dmabuf_send_device() to signal
it capabilities.
Signed-off-by: Benjamin Gaignard <benjamin.gaignard at linaro.org>
---
protocol/Makefile.am | 6 +-
protocol/wayland-dmabuf.xml | 133 +++++++++++++++++++++
src/Makefile.am | 12 +-
src/wayland-dmabuf.c | 279 +++++++++++++++++++++++++++++++++++++++++++
src/wayland-dmabuf.h | 136 +++++++++++++++++++++
5 files changed, 562 insertions(+), 4 deletions(-)
create mode 100644 protocol/wayland-dmabuf.xml
create mode 100644 src/wayland-dmabuf.c
create mode 100644 src/wayland-dmabuf.h
diff --git a/protocol/Makefile.am b/protocol/Makefile.am
index e8b6290..8c9499f 100644
--- a/protocol/Makefile.am
+++ b/protocol/Makefile.am
@@ -1,4 +1,4 @@
-dist_pkgdata_DATA = wayland.xml wayland.dtd
+dist_pkgdata_DATA = wayland.xml wayland-dmabuf.xml wayland.dtd
if HAVE_XMLLINT
.PHONY: validate
@@ -6,9 +6,9 @@ if HAVE_XMLLINT
.%.xml.valid: %.xml
$(AM_V_GEN)$(XMLLINT) --noout --dtdvalid $(srcdir)/wayland.dtd $^ > $@
-validate: .wayland.xml.valid
+validate: .wayland.xml.valid .wayland-dmabuf.xml.valid
all-local: validate
-CLEANFILES = .wayland.xml.valid
+CLEANFILES = .wayland.xml.valid .wayland-dmabuf.xml.valid
endif
diff --git a/protocol/wayland-dmabuf.xml b/protocol/wayland-dmabuf.xml
new file mode 100644
index 0000000..d4dd64e
--- /dev/null
+++ b/protocol/wayland-dmabuf.xml
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<protocol name="dmabuf">
+
+ <copyright>
+ Copyright © 2008-2011 Kristian Høgsberg
+ Copyright © 2010-2011 Intel Corporation
+
+ Permission to use, copy, modify, distribute, and sell this
+ software and its documentation for any purpose is hereby granted
+ without fee, provided that\n the above copyright notice appear in
+ all copies and that both that copyright notice and this permission
+ notice appear in supporting documentation, and that the name of
+ the copyright holders not be used in advertising or publicity
+ pertaining to distribution of the software without specific,
+ written prior permission. The copyright holders make no
+ representations about the suitability of this software for any
+ purpose. It is provided "as is" without express or implied
+ warranty.
+
+ THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
+ AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+ THIS SOFTWARE.
+ </copyright>
+
+ <!-- dmabuf support. This object is created by the server and published
+ using the display's global event. -->
+ <interface name="wl_dmabuf" version="1">
+ <enum name="error">
+ <entry name="invalid_format" value="1"/>
+ <entry name="invalid_file_descriptor" value="2"/>
+ </enum>
+
+ <enum name="format">
+ <!-- The dmabuf format codes match the #defines in drm_fourcc.h.
+ The formats actually supported by the compositor will be
+ reported by the format event. -->
+ <entry name="c8" value="0x20203843"/>
+ <entry name="rgb332" value="0x38424752"/>
+ <entry name="bgr233" value="0x38524742"/>
+ <entry name="xrgb4444" value="0x32315258"/>
+ <entry name="xbgr4444" value="0x32314258"/>
+ <entry name="rgbx4444" value="0x32315852"/>
+ <entry name="bgrx4444" value="0x32315842"/>
+ <entry name="argb4444" value="0x32315241"/>
+ <entry name="abgr4444" value="0x32314241"/>
+ <entry name="rgba4444" value="0x32314152"/>
+ <entry name="bgra4444" value="0x32314142"/>
+ <entry name="xrgb1555" value="0x35315258"/>
+ <entry name="xbgr1555" value="0x35314258"/>
+ <entry name="rgbx5551" value="0x35315852"/>
+ <entry name="bgrx5551" value="0x35315842"/>
+ <entry name="argb1555" value="0x35315241"/>
+ <entry name="abgr1555" value="0x35314241"/>
+ <entry name="rgba5551" value="0x35314152"/>
+ <entry name="bgra5551" value="0x35314142"/>
+ <entry name="rgb565" value="0x36314752"/>
+ <entry name="bgr565" value="0x36314742"/>
+ <entry name="rgb888" value="0x34324752"/>
+ <entry name="bgr888" value="0x34324742"/>
+ <entry name="xrgb8888" value="0x34325258"/>
+ <entry name="xbgr8888" value="0x34324258"/>
+ <entry name="rgbx8888" value="0x34325852"/>
+ <entry name="bgrx8888" value="0x34325842"/>
+ <entry name="argb8888" value="0x34325241"/>
+ <entry name="abgr8888" value="0x34324241"/>
+ <entry name="rgba8888" value="0x34324152"/>
+ <entry name="bgra8888" value="0x34324142"/>
+ <entry name="xrgb2101010" value="0x30335258"/>
+ <entry name="xbgr2101010" value="0x30334258"/>
+ <entry name="rgbx1010102" value="0x30335852"/>
+ <entry name="bgrx1010102" value="0x30335842"/>
+ <entry name="argb2101010" value="0x30335241"/>
+ <entry name="abgr2101010" value="0x30334241"/>
+ <entry name="rgba1010102" value="0x30334152"/>
+ <entry name="bgra1010102" value="0x30334142"/>
+ <entry name="yuyv" value="0x56595559"/>
+ <entry name="yvyu" value="0x55595659"/>
+ <entry name="uyvy" value="0x59565955"/>
+ <entry name="vyuy" value="0x59555956"/>
+ <entry name="ayuv" value="0x56555941"/>
+ <entry name="nv12" value="0x3231564e"/>
+ <entry name="nv21" value="0x3132564e"/>
+ <entry name="nv16" value="0x3631564e"/>
+ <entry name="nv61" value="0x3136564e"/>
+ <entry name="yuv410" value="0x39565559"/>
+ <entry name="yvu410" value="0x39555659"/>
+ <entry name="yuv411" value="0x31315559"/>
+ <entry name="yvu411" value="0x31315659"/>
+ <entry name="yuv420" value="0x32315559"/>
+ <entry name="yvu420" value="0x32315659"/>
+ <entry name="yuv422" value="0x36315559"/>
+ <entry name="yvu422" value="0x36315659"/>
+ <entry name="yuv444" value="0x34325559"/>
+ <entry name="yvu444" value="0x34325659"/>
+ </enum>
+
+ <!-- Create a wayland buffer for the prime fd. Use for regular and planar
+ buffers. Pass 0 for offset and stride for unused planes. -->
+ <request name="create_prime_buffer">
+ <arg name="id" type="new_id" interface="wl_buffer"/>
+ <arg name="name" type="fd"/>
+ <arg name="width" type="int"/>
+ <arg name="height" type="int"/>
+ <arg name="format" type="uint"/>
+ <arg name="offset0" type="int"/>
+ <arg name="stride0" type="int"/>
+ <arg name="offset1" type="int"/>
+ <arg name="stride1" type="int"/>
+ <arg name="offset2" type="int"/>
+ <arg name="stride2" type="int"/>
+ </request>
+
+ <event name="format">
+ <arg name="format" type="uint"/>
+ </event>
+
+ <!-- Notification of the path of the drm device which is used by
+ the server. The client should use this device for creating
+ local buffers. Only buffers created from this device should
+ be be passed to the server using this drm object's
+ create_buffer request. -->
+ <event name="device">
+ <arg name="name" type="string"/>
+ </event>
+
+ </interface>
+
+</protocol>
diff --git a/src/Makefile.am b/src/Makefile.am
index 15f44a5..b3c414c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -4,8 +4,11 @@ noinst_LTLIBRARIES = libwayland-util.la
include_HEADERS = \
wayland-util.h \
wayland-server-protocol.h \
+ wayland-dmabuf-server-protocol.h \
wayland-server.h \
+ wayland-dmabuf.h \
wayland-client-protocol.h \
+ wayland-dmabuf-client-protocol.h \
wayland-client.h \
wayland-egl.h \
wayland-version.h
@@ -22,14 +25,17 @@ libwayland_server_la_LIBADD = $(FFI_LIBS) libwayland-util.la -lrt -lm
libwayland_server_la_LDFLAGS = -version-info 1:0:1
libwayland_server_la_SOURCES = \
wayland-protocol.c \
+ wayland-dmabuf-protocol.c \
wayland-server.c \
wayland-shm.c \
+ wayland-dmabuf.c \
event-loop.c
libwayland_client_la_LIBADD = $(FFI_LIBS) libwayland-util.la -lrt -lm
libwayland_client_la_LDFLAGS = -version-info 2:0:2
libwayland_client_la_SOURCES = \
wayland-protocol.c \
+ wayland-dmabuf-protocol.c \
wayland-client.c
pkgconfigdir = $(libdir)/pkgconfig
@@ -65,7 +71,11 @@ endif
BUILT_SOURCES = \
wayland-server-protocol.h \
wayland-client-protocol.h \
- wayland-protocol.c
+ wayland-protocol.c \
+ wayland-dmabuf-server-protocol.h \
+ wayland-dmabuf-client-protocol.h \
+ wayland-dmabuf-protocol.c
+
CLEANFILES = $(BUILT_SOURCES)
DISTCLEANFILES = wayland-version.h
diff --git a/src/wayland-dmabuf.c b/src/wayland-dmabuf.c
new file mode 100644
index 0000000..72b8a5a
--- /dev/null
+++ b/src/wayland-dmabuf.c
@@ -0,0 +1,279 @@
+/*
+ * Copyright © 2011 Kristian Høgsberg
+ * Copyright © 2011 Benjamin Franzke
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ * Kristian Høgsberg <krh at bitplanet.net>
+ * Benjamin Franzke <benjaminfranzke at googlemail.com>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stddef.h>
+#include <unistd.h>
+
+#include "wayland-server.h"
+#include "wayland-dmabuf.h"
+#include "wayland-dmabuf-server-protocol.h"
+
+struct wl_dmabuf {
+ struct wl_display *display;
+ struct wl_global *wl_dmabuf_global;
+
+ void *user_data;
+ uint32_t flags;
+
+ struct wl_dmabuf_callbacks *callbacks;
+};
+
+static void
+destroy_buffer(struct wl_resource *resource)
+{
+ struct wl_dmabuf_buffer *buffer = resource->data;
+ struct wl_dmabuf *dmabuf = buffer->dmabuf;
+
+ dmabuf->callbacks->release_buffer(dmabuf->user_data, buffer);
+ free(buffer);
+}
+
+static void
+buffer_destroy(struct wl_client *client, struct wl_resource *resource)
+{
+ wl_resource_destroy(resource);
+}
+
+static const struct wl_buffer_interface dmabuf_buffer_interface = {
+ buffer_destroy
+};
+
+static void
+create_buffer(struct wl_client *client, struct wl_resource *resource,
+ uint32_t id, int fd,
+ int32_t width, int32_t height,
+ uint32_t format,
+ int32_t offset0, int32_t stride0,
+ int32_t offset1, int32_t stride1,
+ int32_t offset2, int32_t stride2)
+{
+ struct wl_dmabuf *dmabuf = resource->data;
+ struct wl_dmabuf_buffer *buffer;
+
+ buffer = calloc(1, sizeof *buffer);
+ if (buffer == NULL) {
+ wl_resource_post_no_memory(resource);
+ return;
+ }
+
+ buffer->dmabuf = dmabuf;
+ buffer->width = width;
+ buffer->height = height;
+ buffer->format = format;
+ buffer->offset[0] = offset0;
+ buffer->stride[0] = stride0;
+ buffer->offset[1] = offset1;
+ buffer->stride[1] = stride1;
+ buffer->offset[2] = offset2;
+ buffer->stride[2] = stride2;
+
+ dmabuf->callbacks->reference_buffer(dmabuf->user_data, fd, buffer);
+ if (buffer->driver_buffer == NULL) {
+ wl_resource_post_error(resource,
+ WL_DMABUF_ERROR_INVALID_FILE_DESCRIPTOR,
+ "invalid file descriptor");
+ return;
+ }
+
+ buffer->resource =
+ wl_resource_create(client, &wl_buffer_interface, 1, id);
+ if (!buffer->resource) {
+ wl_resource_post_no_memory(resource);
+ free(buffer);
+ return;
+ }
+
+ wl_resource_set_implementation(buffer->resource,
+ &dmabuf_buffer_interface,
+ buffer, destroy_buffer);
+}
+
+static void
+dmabuf_create_prime_buffer(struct wl_client *client,
+ struct wl_resource *resource,
+ uint32_t id, int fd,
+ int32_t width, int32_t height, uint32_t format,
+ int32_t offset0, int32_t stride0,
+ int32_t offset1, int32_t stride1,
+ int32_t offset2, int32_t stride2)
+{
+ create_buffer(client, resource, id, fd, width, height, format,
+ offset0, stride0, offset1, stride1, offset2, stride2);
+ close(fd);
+}
+
+static const struct wl_dmabuf_interface dmabuf_interface = {
+ dmabuf_create_prime_buffer
+};
+
+static void
+bind_dmabuf(struct wl_client *client, void *data, uint32_t version, uint32_t id)
+{
+ struct wl_dmabuf *dmabuf = data;
+ struct wl_resource *resource;
+
+ resource = wl_resource_create(client, &wl_dmabuf_interface, 1, id);
+ if (!resource) {
+ wl_client_post_no_memory(client);
+ return;
+ }
+
+ wl_resource_set_implementation(resource, &dmabuf_interface, data, NULL);
+
+ if (dmabuf->callbacks->send_server_info)
+ dmabuf->callbacks->send_server_info(dmabuf->user_data, resource);
+}
+
+WL_EXPORT struct wl_dmabuf *
+wl_dmabuf_init(struct wl_display *display, struct wl_dmabuf_callbacks *callbacks,
+ void *user_data, uint32_t flags)
+{
+ struct wl_dmabuf *dmabuf;
+
+ dmabuf = malloc(sizeof *dmabuf);
+
+ dmabuf->display = display;
+ dmabuf->callbacks = callbacks;
+ dmabuf->user_data = user_data;
+ dmabuf->flags = flags;
+
+ dmabuf->wl_dmabuf_global =
+ wl_global_create(display, &wl_dmabuf_interface, 1, dmabuf, bind_dmabuf);
+
+ return dmabuf;
+}
+
+WL_EXPORT void
+wl_dmabuf_uninit(struct wl_dmabuf *dmabuf)
+{
+ wl_global_destroy(dmabuf->wl_dmabuf_global);
+
+ free(dmabuf);
+}
+
+WL_EXPORT struct wl_dmabuf_buffer *
+wl_dmabuf_buffer_get(struct wl_resource *resource)
+{
+ if (resource == NULL)
+ return NULL;
+
+ if (wl_resource_instance_of(resource, &wl_buffer_interface,
+ &dmabuf_buffer_interface))
+ return wl_resource_get_user_data(resource);
+
+ return NULL;
+}
+
+WL_EXPORT int
+wl_buffer_is_dmabuf(struct wl_dmabuf_buffer *buffer)
+{
+ return wl_resource_instance_of(buffer->resource,
+ &wl_buffer_interface, &dmabuf_buffer_interface);
+}
+
+WL_EXPORT uint32_t
+wl_dmabuf_buffer_get_format(struct wl_dmabuf_buffer *buffer)
+{
+ if (!wl_buffer_is_dmabuf(buffer))
+ return 0;
+
+ return buffer->format;
+}
+
+WL_EXPORT void *
+wl_dmabuf_buffer_get_buffer(struct wl_dmabuf_buffer *buffer)
+{
+ if (!wl_buffer_is_dmabuf(buffer))
+ return NULL;
+
+ return buffer->driver_buffer;
+}
+
+WL_EXPORT int32_t
+wl_dmabuf_buffer_get_stride(struct wl_dmabuf_buffer *buffer, int idx)
+{
+ if (!wl_buffer_is_dmabuf(buffer))
+ return 0;
+
+ return buffer->stride[idx];
+}
+
+WL_EXPORT void *
+wl_dmabuf_buffer_get_data(struct wl_dmabuf_buffer *buffer)
+{
+ struct wl_dmabuf *dmabuf;
+
+ if (!wl_buffer_is_dmabuf(buffer))
+ return NULL;
+
+ dmabuf = buffer->dmabuf;
+
+ if (dmabuf->callbacks->get_data)
+ return dmabuf->callbacks->get_data(dmabuf->user_data, buffer);
+
+ return NULL;
+}
+
+WL_EXPORT void
+wl_dmabuf_buffer_put_data(struct wl_dmabuf_buffer *buffer)
+{
+ struct wl_dmabuf *dmabuf;
+
+ if (!wl_buffer_is_dmabuf(buffer))
+ return;
+
+ dmabuf = buffer->dmabuf;
+
+ if (dmabuf->callbacks->put_data)
+ dmabuf->callbacks->put_data(dmabuf->user_data, buffer);
+
+ return;
+}
+
+
+WL_EXPORT int32_t
+wl_dmabuf_buffer_get_width(struct wl_dmabuf_buffer *buffer)
+{
+ if (!wl_buffer_is_dmabuf(buffer))
+ return 0;
+
+ return buffer->width;
+}
+
+WL_EXPORT int32_t
+wl_dmabuf_buffer_get_height(struct wl_dmabuf_buffer *buffer)
+{
+ if (!wl_buffer_is_dmabuf(buffer))
+ return 0;
+
+ return buffer->height;
+}
diff --git a/src/wayland-dmabuf.h b/src/wayland-dmabuf.h
new file mode 100644
index 0000000..4ca40b2
--- /dev/null
+++ b/src/wayland-dmabuf.h
@@ -0,0 +1,136 @@
+#ifndef WAYLAND_DMABUF_H
+#define WAYLAND_DMABUF_H
+
+#include <wayland-server.h>
+
+#ifndef WL_DMABUF_FORMAT_ENUM
+#define WL_DMABUF_FORMAT_ENUM
+
+enum wl_dmabuf_format {
+ WL_DMABUF_FORMAT_C8 = 0x20203843,
+ WL_DMABUF_FORMAT_RGB332 = 0x38424752,
+ WL_DMABUF_FORMAT_BGR233 = 0x38524742,
+ WL_DMABUF_FORMAT_XRGB4444 = 0x32315258,
+ WL_DMABUF_FORMAT_XBGR4444 = 0x32314258,
+ WL_DMABUF_FORMAT_RGBX4444 = 0x32315852,
+ WL_DMABUF_FORMAT_BGRX4444 = 0x32315842,
+ WL_DMABUF_FORMAT_ARGB4444 = 0x32315241,
+ WL_DMABUF_FORMAT_ABGR4444 = 0x32314241,
+ WL_DMABUF_FORMAT_RGBA4444 = 0x32314152,
+ WL_DMABUF_FORMAT_BGRA4444 = 0x32314142,
+ WL_DMABUF_FORMAT_XRGB1555 = 0x35315258,
+ WL_DMABUF_FORMAT_XBGR1555 = 0x35314258,
+ WL_DMABUF_FORMAT_RGBX5551 = 0x35315852,
+ WL_DMABUF_FORMAT_BGRX5551 = 0x35315842,
+ WL_DMABUF_FORMAT_ARGB1555 = 0x35315241,
+ WL_DMABUF_FORMAT_ABGR1555 = 0x35314241,
+ WL_DMABUF_FORMAT_RGBA5551 = 0x35314152,
+ WL_DMABUF_FORMAT_BGRA5551 = 0x35314142,
+ WL_DMABUF_FORMAT_RGB565 = 0x36314752,
+ WL_DMABUF_FORMAT_BGR565 = 0x36314742,
+ WL_DMABUF_FORMAT_RGB888 = 0x34324752,
+ WL_DMABUF_FORMAT_BGR888 = 0x34324742,
+ WL_DMABUF_FORMAT_XRGB8888 = 0x34325258,
+ WL_DMABUF_FORMAT_XBGR8888 = 0x34324258,
+ WL_DMABUF_FORMAT_RGBX8888 = 0x34325852,
+ WL_DMABUF_FORMAT_BGRX8888 = 0x34325842,
+ WL_DMABUF_FORMAT_ARGB8888 = 0x34325241,
+ WL_DMABUF_FORMAT_ABGR8888 = 0x34324241,
+ WL_DMABUF_FORMAT_RGBA8888 = 0x34324152,
+ WL_DMABUF_FORMAT_BGRA8888 = 0x34324142,
+ WL_DMABUF_FORMAT_XRGB2101010 = 0x30335258,
+ WL_DMABUF_FORMAT_XBGR2101010 = 0x30334258,
+ WL_DMABUF_FORMAT_RGBX1010102 = 0x30335852,
+ WL_DMABUF_FORMAT_BGRX1010102 = 0x30335842,
+ WL_DMABUF_FORMAT_ARGB2101010 = 0x30335241,
+ WL_DMABUF_FORMAT_ABGR2101010 = 0x30334241,
+ WL_DMABUF_FORMAT_RGBA1010102 = 0x30334152,
+ WL_DMABUF_FORMAT_BGRA1010102 = 0x30334142,
+ WL_DMABUF_FORMAT_YUYV = 0x56595559,
+ WL_DMABUF_FORMAT_YVYU = 0x55595659,
+ WL_DMABUF_FORMAT_UYVY = 0x59565955,
+ WL_DMABUF_FORMAT_VYUY = 0x59555956,
+ WL_DMABUF_FORMAT_AYUV = 0x56555941,
+ WL_DMABUF_FORMAT_NV12 = 0x3231564e,
+ WL_DMABUF_FORMAT_NV21 = 0x3132564e,
+ WL_DMABUF_FORMAT_NV16 = 0x3631564e,
+ WL_DMABUF_FORMAT_NV61 = 0x3136564e,
+ WL_DMABUF_FORMAT_YUV410 = 0x39565559,
+ WL_DMABUF_FORMAT_YVU410 = 0x39555659,
+ WL_DMABUF_FORMAT_YUV411 = 0x31315559,
+ WL_DMABUF_FORMAT_YVU411 = 0x31315659,
+ WL_DMABUF_FORMAT_YUV420 = 0x32315559,
+ WL_DMABUF_FORMAT_YVU420 = 0x32315659,
+ WL_DMABUF_FORMAT_YUV422 = 0x36315559,
+ WL_DMABUF_FORMAT_YVU422 = 0x36315659,
+ WL_DMABUF_FORMAT_YUV444 = 0x34325559,
+ WL_DMABUF_FORMAT_YVU444 = 0x34325659,
+};
+#endif /* WL_DMABUF_FORMAT_ENUM */
+
+struct wl_dmabuf;
+
+struct wl_dmabuf_buffer {
+ struct wl_resource *resource;
+ struct wl_dmabuf *dmabuf;
+ int32_t width, height;
+ uint32_t format;
+ int32_t offset[3];
+ int32_t stride[3];
+ void *driver_buffer;
+};
+
+/* struct wl_dmabuf_callbacks
+ *
+ * @reference_buffer: take a reference on buffer
+ * @release_buffer: release a reference on buffer
+ * @get_data: get access to buffer memory to use it
+ * @put_data: indicated that buffer memory is no more used
+ * @send_server_info: ask to the server to send all
+ * supported pixel formats and device name
+ */
+struct wl_dmabuf_callbacks {
+ void (*reference_buffer)(void *user_data, int fd,
+ struct wl_dmabuf_buffer *buffer);
+ void (*release_buffer)(void *user_data, struct wl_dmabuf_buffer *buffer);
+ void* (*get_data)(void *user_data, struct wl_dmabuf_buffer *buffer);
+ void (*put_data)(void *user_data, struct wl_dmabuf_buffer *buffer);
+ void (*send_server_info)(void *user_data, struct wl_resource *resource);
+};
+
+struct wl_dmabuf *
+wl_dmabuf_init(struct wl_display *display,
+ struct wl_dmabuf_callbacks *callbacks,
+ void *user_data, uint32_t flags);
+
+void
+wl_dmabuf_uninit(struct wl_dmabuf *dmabuf);
+
+struct wl_dmabuf_buffer *
+wl_dmabuf_buffer_get(struct wl_resource *resource);
+
+int
+wl_buffer_is_dmabuf(struct wl_dmabuf_buffer *buffer);
+
+uint32_t
+wl_dmabuf_buffer_get_format(struct wl_dmabuf_buffer *buffer);
+
+void *
+wl_dmabuf_buffer_get_buffer(struct wl_dmabuf_buffer *buffer);
+
+int32_t
+wl_dmabuf_buffer_get_stride(struct wl_dmabuf_buffer *buffer, int idx);
+
+void *
+wl_dmabuf_buffer_get_data(struct wl_dmabuf_buffer *buffer);
+
+void
+wl_dmabuf_buffer_put_data(struct wl_dmabuf_buffer *buffer);
+
+int32_t
+wl_dmabuf_buffer_get_width(struct wl_dmabuf_buffer *buffer);
+
+int32_t
+wl_dmabuf_buffer_get_height(struct wl_dmabuf_buffer *buffer);
+
+#endif
--
1.7.9.5
More information about the wayland-devel
mailing list