[PATCH v4 1/3] Add wl_dmabuf protocol

Daniel Vetter daniel at ffwll.ch
Wed Jan 8 01:21:14 PST 2014


On Tue, Jan 07, 2014 at 06:41:42PM +0100, benjamin.gaignard at linaro.org wrote:
> 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 |  128 ++++++++++++++++++++++++
>  src/Makefile.am             |   12 ++-
>  src/wayland-dmabuf.c        |  231 +++++++++++++++++++++++++++++++++++++++++++
>  src/wayland-dmabuf.h        |  123 +++++++++++++++++++++++
>  5 files changed, 496 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..f84edb5
> --- /dev/null
> +++ b/protocol/wayland-dmabuf.xml
> @@ -0,0 +1,128 @@
> +<?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="stride" 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"/>

At least in upstream linux there's no generic "allocate me a dma-buf"
interface. Even less so one that'll work across different subsystems.

Even with that peculiarity ignored (we could have a central dma-buf
allocator akin to ION) there's the issue that you need to know up front
which devices will all be interested in a given buffer, at least if you
care about efficiency. ION uncoditionally requires this, dma-buf per se
would allow post-allocation buffer movement (but it's not really implement
atm anyway).

So I don't think this will work out as-is.

> +    </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..ce6dc4c
> --- /dev/null
> +++ b/src/wayland-dmabuf.c
> @@ -0,0 +1,231 @@
> +/*
> + * 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 <sys/mman.h>
> +
> +#include "wayland-server.h"
> +#include "wayland-dmabuf.h"
> +#include "wayland-dmabuf-server-protocol.h"
> +
> +struct wl_dmabuf {
> +	struct wl_global *wl_dmabuf_global;
> +	void *user_data;
> +	struct wl_dmabuf_callbacks *callbacks;
> +};
> +
> +static void
> +destroy_buffer(struct wl_resource *resource)
> +{
> +	struct wl_dmabuf_buffer *buffer = wl_resource_get_user_data(resource);
> +
> +	buffer->refcount--;
> +
> +	if (buffer->refcount)
> +		return;
> +
> +	close(buffer->fd);
> +	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
> +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 stride)
> +{
> +	struct wl_dmabuf *dmabuf = wl_resource_get_user_data(resource);
> +	struct wl_dmabuf_buffer *buffer;
> +
> +	buffer = calloc(1, sizeof *buffer);
> +	if (buffer == NULL) {
> +		wl_resource_post_no_memory(resource);
> +		return;
> +	}
> +
> +	buffer->resource =
> +		wl_resource_create(client, &wl_buffer_interface, 1, id);
> +	if (!buffer->resource) {
> +		wl_resource_post_no_memory(resource);
> +		free(buffer);
> +		return;
> +	}
> +
> +	buffer->dmabuf = dmabuf;
> +	buffer->width = width;
> +	buffer->height = height;
> +	buffer->format = format;
> +	buffer->data = NULL;
> +	buffer->mmapcount = 0;
> +	buffer->refcount = 1;
> +	/* make sure we have your own file descriptor */
> +	buffer->fd = dup(fd);
> +	close(fd);
> +	buffer->stride = stride;
> +
> +	wl_resource_set_implementation(buffer->resource,
> +				       &dmabuf_buffer_interface,
> +				       buffer, destroy_buffer);
> +}
> +
> +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->callbacks = callbacks;
> +	dmabuf->user_data = user_data;
> +
> +	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 uint32_t
> +wl_dmabuf_buffer_get_format(struct wl_dmabuf_buffer *buffer)
> +{
> +	return buffer->format;
> +}
> +
> +WL_EXPORT int32_t
> +wl_dmabuf_buffer_get_stride(struct wl_dmabuf_buffer *buffer)
> +{
> +	return buffer->stride;
> +}
> +
> +WL_EXPORT void *
> +wl_dmabuf_buffer_get_data(struct wl_dmabuf_buffer *buffer)
> +{
> +	uint32_t size;
> +
> +	buffer->refcount++;
> +
> +	if (buffer->mmapcount++)
> +		return buffer->data;
> +
> +	size = buffer->width * buffer->height * 4;

Fyi latest dmabuf code in the kernel has a working lseek implementation to
tell you the size of a buffer. Fairly useful given that you seem to
hardcode a bunch of assumptions here.
-Daniel

> +	buffer->data = mmap (0, size, PROT_READ | PROT_WRITE, MAP_SHARED, buffer->fd, 0);
> +
> +	return buffer->data;
> +}
> +
> +WL_EXPORT void
> +wl_dmabuf_buffer_put_data(struct wl_dmabuf_buffer *buffer)
> +{
> +	uint32_t size;
> +
> +	buffer->mmapcount--;
> +	buffer->refcount--;
> +
> +	if (buffer->mmapcount)
> +		return;
> +
> +	size = buffer->width * buffer->height * 4;
> +	munmap (buffer->data, size);
> +	buffer->data = NULL;
> +
> +	if (buffer->refcount)
> +		return;
> +
> +	close(buffer->fd);
> +	free(buffer);
> +}
> +
> +WL_EXPORT int32_t
> +wl_dmabuf_buffer_get_width(struct wl_dmabuf_buffer *buffer)
> +{
> +	return buffer->width;
> +}
> +
> +WL_EXPORT int32_t
> +wl_dmabuf_buffer_get_height(struct wl_dmabuf_buffer *buffer)
> +{
> +	return buffer->height;
> +}
> diff --git a/src/wayland-dmabuf.h b/src/wayland-dmabuf.h
> new file mode 100644
> index 0000000..f9eb230
> --- /dev/null
> +++ b/src/wayland-dmabuf.h
> @@ -0,0 +1,123 @@
> +#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;
> +	int32_t stride;
> +	uint32_t format;
> +	uint8_t *data;
> +	int mmapcount;
> +	int refcount;
> +	int fd;
> +};
> +
> +/* struct wl_dmabuf_callbacks
> + *
> + * @send_server_info: ask to the server to send all
> + * supported pixel formats and device name
> + */
> +struct wl_dmabuf_callbacks {
> +	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);
> +
> +uint32_t
> +wl_dmabuf_buffer_get_format(struct wl_dmabuf_buffer *buffer);
> +
> +int32_t
> +wl_dmabuf_buffer_get_stride(struct wl_dmabuf_buffer *buffer);
> +
> +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
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel

-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch


More information about the wayland-devel mailing list