[PATCH 1/7] protocol: add linux_dmabuf extension RFCv1
Louis-Francis Ratté-Boulianne
lfrb at collabora.com
Fri Dec 12 13:51:02 PST 2014
From: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
An experimental (hence the 'z' prefix) linux_dmabuf Wayland protocol
extension for creating dmabuf-based wl_buffers in a generic manner.
This does not include proper dmabuf metadata negotiation because
there is no way to communicate all dmabuf constraints from the
compositor to a client before-hand. The client has to create a
wl_buffer wrapping one or more dmabuf buffers and then listen at
the feedback object returned to know if the operation was successful.
Signed-off-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
Signed-off-by: Louis-Francis Ratté-Boulianne <lfrb at collabora.com>
---
Makefile.am | 7 +-
protocol/linux-dmabuf.xml | 224 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 229 insertions(+), 2 deletions(-)
create mode 100644 protocol/linux-dmabuf.xml
diff --git a/Makefile.am b/Makefile.am
index 494266d..0462fdd 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -91,7 +91,9 @@ nodist_weston_SOURCES = \
protocol/presentation_timing-protocol.c \
protocol/presentation_timing-server-protocol.h \
protocol/scaler-protocol.c \
- protocol/scaler-server-protocol.h
+ protocol/scaler-server-protocol.h \
+ protocol/linux-dmabuf-protocol.c \
+ protocol/linux-dmabuf-server-protocol.h
BUILT_SOURCES += $(nodist_weston_SOURCES)
@@ -1101,7 +1103,8 @@ EXTRA_DIST += \
protocol/presentation_timing.xml \
protocol/scaler.xml \
protocol/ivi-application.xml \
- protocol/ivi-hmi-controller.xml
+ protocol/ivi-hmi-controller.xml \
+ protocol/linux-dmabuf.xml
man_MANS = weston.1 weston.ini.5
diff --git a/protocol/linux-dmabuf.xml b/protocol/linux-dmabuf.xml
new file mode 100644
index 0000000..c48121c
--- /dev/null
+++ b/protocol/linux-dmabuf.xml
@@ -0,0 +1,224 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<protocol name="linux_dmabuf">
+
+ <copyright>
+ Copyright © 2014 Collabora, Ltd.
+
+ Permission to use, copy, modify, distribute, and sell this
+ software and its documentation for any purpose is hereby granted
+ without fee, provided that 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>
+
+ <interface name="zlinux_dmabuf" version="1">
+ <description summary="factory for creating dmabuf-based wl_buffers">
+ Following the interfaces from:
+ https://www.khronos.org/registry/egl/extensions/EXT/EGL_EXT_image_dma_buf_import.txt
+
+ This interface offers a way to create generic dmabuf-based
+ wl_buffers. Immediately after a client binds to this interface,
+ the set of supported formats is sent with 'format' events.
+ </description>
+
+ <enum name="error">
+ <entry name="invalid_format" value="1"/>
+ <entry name="invalid_dmabuf" value="2"/>
+ <entry name="format_dmabufs_mismatch" value="3"/>
+ <entry name="invalid_dmabuf_params" value="4"/>
+ </enum>
+
+ <enum name="format">
+ <!-- The drm 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>
+
+ <request name="destroy" type="destructor">
+ <description summary="unbind the factory">
+ </description>
+ </request>
+
+ <request name="create_batch">
+ <description summary="create a collection of dmabufs">
+ This temporary object is used to collect multiple dmabuf handles
+ into a single batch.
+ </description>
+ <arg name="batch_id" type="new_id" interface="dmabuf_batch"/>
+ </request>
+
+ <request name="create_buffer">
+ <description summary="create a dmabuf-based wl_buffer">
+ The result of the operation will be returned via the provided
+ zlinux_dmabuf_create_feedback object.
+
+ The dmabuf_batch object must be destroyed immediately after
+ after this request.
+
+ Any errors in importing the set of dmabufs can be delivered as
+ protocol errors immediately or later.
+ </description>
+ <arg name="batch" type="object" interface="dmabuf_batch"/>
+ <arg name="width" type="int"/>
+ <arg name="height" type="int"/>
+ <arg name="format" type="uint" summary="from format enum"/>
+ <arg name="feedback" type="new_id" interface="zlinux_dmabuf_create_feedback"/>
+ </request>
+
+ <event name="format">
+ <description summary="supported buffer format">
+ This event advertises one buffer format that the server support.
+ All the supported formats advertised once when the client
+ binds to this interface. A roundtrip after binding guarantees,
+ that the client has received all supported formats.
+ </description>
+ <arg name="format" type="uint" summary="from format enum"/>
+ </event>
+
+ </interface>
+
+ <interface name="zlinux_dmabuf_create_feedback" version="1">
+ <description summary="feedback for buffer creation">
+ This interface is used to keep track of a buffer creation
+ operation.
+ </description>
+
+ <event name="create_successful">
+ <description summary="buffer creation succeeded">
+ This event indicates that the attempted buffer creation was
+ successful. It contains the id of the wl_buffer wrapping
+ the dmabuf.
+
+ Upon receiving this event, the client should destroy the
+ zlinux_dmabuf_create_feedback object.
+ </description>
+ <arg name="buffer_id" type="new_id" interface="wl_buffer"/>
+ </event>
+ <event name="create_failed">
+ <description summary="buffer creation failed">
+ This event indicates that the attempted buffer creation was
+ has failed. It usually means that one of the dmabuf constraints
+ has not been fulfilled.
+
+ Upon receiving this event, the client should destroy the
+ zlinux_dmabuf_create_feedback object.
+ </description>
+ </event>
+ </interface>
+
+ <interface name="dmabuf_batch" version="1">
+ <description summary="a collection of dmabufs">
+ This is a collection of dmabufs, forming a single logical buffer.
+ Usually only one dmabuf is needed, but some multi-planar formats
+ may require more.
+
+ The order of dmabufs added for this object is significant, and must
+ match the expectations of the format argument to
+ linux_dmabuf.create_buffer.
+ </description>
+
+ <request name="destroy" type="destructor">
+ <description summary="delete this object, used or not">
+ </description>
+ </request>
+
+ <request name="add">
+ <description summary="add a dmabuf to the wl_buffer">
+ Multi-planar formats may require using more than one
+ dmabuf for passing all the data for one logical buffer.
+ This request adds one dmabuf to the set in this dmabuf_batch.
+
+ When one dmabuf has several planar channels, offset1 & stride1 and
+ offset2 & stride2 must be used to denote them without sending a
+ new add_dmabuf request which would create a new fd in the server
+ while still pointing at the same dmabuf.
+
+ offset0 and stride0 must always be set. Other unused offsets and
+ strides must be zero.
+ </description>
+
+ <arg name="name" type="fd"/>
+ <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>
+
+ </interface>
+
+</protocol>
--
2.1.0
More information about the wayland-devel
mailing list