Use linux-dmabuf protocol from wayland-protocols
Signed-off-by: Jonas Ådahl <jadahl@gmail.com> Reviewed-by: Mariusz Ceier <mceier+wayland@gmail.com> Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
This commit is contained in:
committed by
Pekka Paalanen
parent
496adb3bb3
commit
57e48f023c
+6
-7
@@ -127,8 +127,8 @@ nodist_weston_SOURCES = \
|
|||||||
protocol/presentation_timing-server-protocol.h \
|
protocol/presentation_timing-server-protocol.h \
|
||||||
protocol/scaler-protocol.c \
|
protocol/scaler-protocol.c \
|
||||||
protocol/scaler-server-protocol.h \
|
protocol/scaler-server-protocol.h \
|
||||||
protocol/linux-dmabuf-protocol.c \
|
protocol/linux-dmabuf-unstable-v1-protocol.c \
|
||||||
protocol/linux-dmabuf-server-protocol.h
|
protocol/linux-dmabuf-unstable-v1-server-protocol.h
|
||||||
|
|
||||||
BUILT_SOURCES += $(nodist_weston_SOURCES)
|
BUILT_SOURCES += $(nodist_weston_SOURCES)
|
||||||
|
|
||||||
@@ -533,11 +533,11 @@ nodist_weston_simple_dmabuf_SOURCES = \
|
|||||||
protocol/xdg-shell-client-protocol.h \
|
protocol/xdg-shell-client-protocol.h \
|
||||||
protocol/fullscreen-shell-unstable-v1-protocol.c \
|
protocol/fullscreen-shell-unstable-v1-protocol.c \
|
||||||
protocol/fullscreen-shell-unstable-v1-client-protocol.h \
|
protocol/fullscreen-shell-unstable-v1-client-protocol.h \
|
||||||
protocol/linux-dmabuf-protocol.c \
|
protocol/linux-dmabuf-unstable-v1-protocol.c \
|
||||||
protocol/linux-dmabuf-client-protocol.h
|
protocol/linux-dmabuf-unstable-v1-client-protocol.h
|
||||||
weston_simple_dmabuf_CFLAGS = $(AM_CFLAGS) $(SIMPLE_DMABUF_CLIENT_CFLAGS)
|
weston_simple_dmabuf_CFLAGS = $(AM_CFLAGS) $(SIMPLE_DMABUF_CLIENT_CFLAGS)
|
||||||
weston_simple_dmabuf_LDADD = $(SIMPLE_DMABUF_CLIENT_LIBS) libshared.la
|
weston_simple_dmabuf_LDADD = $(SIMPLE_DMABUF_CLIENT_LIBS) libshared.la
|
||||||
BUILT_SOURCES += protocol/linux-dmabuf-client-protocol.h
|
BUILT_SOURCES += protocol/linux-dmabuf-unstable-v1-client-protocol.h
|
||||||
endif
|
endif
|
||||||
|
|
||||||
noinst_LTLIBRARIES += libtoytoolkit.la
|
noinst_LTLIBRARIES += libtoytoolkit.la
|
||||||
@@ -1351,8 +1351,7 @@ EXTRA_DIST += \
|
|||||||
protocol/presentation_timing.xml \
|
protocol/presentation_timing.xml \
|
||||||
protocol/scaler.xml \
|
protocol/scaler.xml \
|
||||||
protocol/ivi-application.xml \
|
protocol/ivi-application.xml \
|
||||||
protocol/ivi-hmi-controller.xml \
|
protocol/ivi-hmi-controller.xml
|
||||||
protocol/linux-dmabuf.xml
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# manual test modules in tests subdirectory
|
# manual test modules in tests subdirectory
|
||||||
|
|||||||
+20
-20
@@ -42,7 +42,7 @@
|
|||||||
#include <wayland-client.h>
|
#include <wayland-client.h>
|
||||||
#include "xdg-shell-client-protocol.h"
|
#include "xdg-shell-client-protocol.h"
|
||||||
#include "fullscreen-shell-unstable-v1-client-protocol.h"
|
#include "fullscreen-shell-unstable-v1-client-protocol.h"
|
||||||
#include "linux-dmabuf-client-protocol.h"
|
#include "linux-dmabuf-unstable-v1-client-protocol.h"
|
||||||
|
|
||||||
struct display {
|
struct display {
|
||||||
struct wl_display *display;
|
struct wl_display *display;
|
||||||
@@ -50,7 +50,7 @@ struct display {
|
|||||||
struct wl_compositor *compositor;
|
struct wl_compositor *compositor;
|
||||||
struct xdg_shell *shell;
|
struct xdg_shell *shell;
|
||||||
struct zwp_fullscreen_shell_v1 *fshell;
|
struct zwp_fullscreen_shell_v1 *fshell;
|
||||||
struct zlinux_dmabuf *dmabuf;
|
struct zwp_linux_dmabuf_v1 *dmabuf;
|
||||||
int xrgb8888_format_found;
|
int xrgb8888_format_found;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -187,7 +187,7 @@ unmap_bo(struct buffer *my_buf)
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
create_succeeded(void *data,
|
create_succeeded(void *data,
|
||||||
struct zlinux_buffer_params *params,
|
struct zwp_linux_buffer_params_v1 *params,
|
||||||
struct wl_buffer *new_buffer)
|
struct wl_buffer *new_buffer)
|
||||||
{
|
{
|
||||||
struct buffer *buffer = data;
|
struct buffer *buffer = data;
|
||||||
@@ -195,22 +195,22 @@ create_succeeded(void *data,
|
|||||||
buffer->buffer = new_buffer;
|
buffer->buffer = new_buffer;
|
||||||
wl_buffer_add_listener(buffer->buffer, &buffer_listener, buffer);
|
wl_buffer_add_listener(buffer->buffer, &buffer_listener, buffer);
|
||||||
|
|
||||||
zlinux_buffer_params_destroy(params);
|
zwp_linux_buffer_params_v1_destroy(params);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
create_failed(void *data, struct zlinux_buffer_params *params)
|
create_failed(void *data, struct zwp_linux_buffer_params_v1 *params)
|
||||||
{
|
{
|
||||||
struct buffer *buffer = data;
|
struct buffer *buffer = data;
|
||||||
|
|
||||||
buffer->buffer = NULL;
|
buffer->buffer = NULL;
|
||||||
|
|
||||||
zlinux_buffer_params_destroy(params);
|
zwp_linux_buffer_params_v1_destroy(params);
|
||||||
|
|
||||||
fprintf(stderr, "Error: zlinux_buffer_params.create failed.\n");
|
fprintf(stderr, "Error: zwp_linux_buffer_params.create failed.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct zlinux_buffer_params_listener params_listener = {
|
static const struct zwp_linux_buffer_params_v1_listener params_listener = {
|
||||||
create_succeeded,
|
create_succeeded,
|
||||||
create_failed
|
create_failed
|
||||||
};
|
};
|
||||||
@@ -219,7 +219,7 @@ static int
|
|||||||
create_dmabuf_buffer(struct display *display, struct buffer *buffer,
|
create_dmabuf_buffer(struct display *display, struct buffer *buffer,
|
||||||
int width, int height)
|
int width, int height)
|
||||||
{
|
{
|
||||||
struct zlinux_buffer_params *params;
|
struct zwp_linux_buffer_params_v1 *params;
|
||||||
uint64_t modifier;
|
uint64_t modifier;
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
|
|
||||||
@@ -259,16 +259,16 @@ create_dmabuf_buffer(struct display *display, struct buffer *buffer,
|
|||||||
modifier = 0;
|
modifier = 0;
|
||||||
flags = 0;
|
flags = 0;
|
||||||
|
|
||||||
params = zlinux_dmabuf_create_params(display->dmabuf);
|
params = zwp_linux_dmabuf_v1_create_params(display->dmabuf);
|
||||||
zlinux_buffer_params_add(params,
|
zwp_linux_buffer_params_v1_add(params,
|
||||||
buffer->dmabuf_fd,
|
buffer->dmabuf_fd,
|
||||||
0, /* plane_idx */
|
0, /* plane_idx */
|
||||||
0, /* offset */
|
0, /* offset */
|
||||||
buffer->stride,
|
buffer->stride,
|
||||||
modifier >> 32,
|
modifier >> 32,
|
||||||
modifier & 0xffffffff);
|
modifier & 0xffffffff);
|
||||||
zlinux_buffer_params_add_listener(params, ¶ms_listener, buffer);
|
zwp_linux_buffer_params_v1_add_listener(params, ¶ms_listener, buffer);
|
||||||
zlinux_buffer_params_create(params,
|
zwp_linux_buffer_params_v1_create(params,
|
||||||
buffer->width,
|
buffer->width,
|
||||||
buffer->height,
|
buffer->height,
|
||||||
DRM_FORMAT_XRGB8888,
|
DRM_FORMAT_XRGB8888,
|
||||||
@@ -430,7 +430,7 @@ static const struct wl_callback_listener frame_listener = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dmabuf_format(void *data, struct zlinux_dmabuf *zlinux_dmabuf, uint32_t format)
|
dmabuf_format(void *data, struct zwp_linux_dmabuf_v1 *zwp_linux_dmabuf, uint32_t format)
|
||||||
{
|
{
|
||||||
struct display *d = data;
|
struct display *d = data;
|
||||||
|
|
||||||
@@ -438,7 +438,7 @@ dmabuf_format(void *data, struct zlinux_dmabuf *zlinux_dmabuf, uint32_t format)
|
|||||||
d->xrgb8888_format_found = 1;
|
d->xrgb8888_format_found = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct zlinux_dmabuf_listener dmabuf_listener = {
|
static const struct zwp_linux_dmabuf_v1_listener dmabuf_listener = {
|
||||||
dmabuf_format
|
dmabuf_format
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -476,10 +476,10 @@ registry_handle_global(void *data, struct wl_registry *registry,
|
|||||||
} else if (strcmp(interface, "zwp_fullscreen_shell_v1") == 0) {
|
} else if (strcmp(interface, "zwp_fullscreen_shell_v1") == 0) {
|
||||||
d->fshell = wl_registry_bind(registry,
|
d->fshell = wl_registry_bind(registry,
|
||||||
id, &zwp_fullscreen_shell_v1_interface, 1);
|
id, &zwp_fullscreen_shell_v1_interface, 1);
|
||||||
} else if (strcmp(interface, "zlinux_dmabuf") == 0) {
|
} else if (strcmp(interface, "zwp_linux_dmabuf_v1") == 0) {
|
||||||
d->dmabuf = wl_registry_bind(registry,
|
d->dmabuf = wl_registry_bind(registry,
|
||||||
id, &zlinux_dmabuf_interface, 1);
|
id, &zwp_linux_dmabuf_v1_interface, 1);
|
||||||
zlinux_dmabuf_add_listener(d->dmabuf, &dmabuf_listener, d);
|
zwp_linux_dmabuf_v1_add_listener(d->dmabuf, &dmabuf_listener, d);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -515,7 +515,7 @@ create_display(void)
|
|||||||
®istry_listener, display);
|
®istry_listener, display);
|
||||||
wl_display_roundtrip(display->display);
|
wl_display_roundtrip(display->display);
|
||||||
if (display->dmabuf == NULL) {
|
if (display->dmabuf == NULL) {
|
||||||
fprintf(stderr, "No zlinux_dmabuf global\n");
|
fprintf(stderr, "No zwp_linux_dmabuf global\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -533,7 +533,7 @@ static void
|
|||||||
destroy_display(struct display *display)
|
destroy_display(struct display *display)
|
||||||
{
|
{
|
||||||
if (display->dmabuf)
|
if (display->dmabuf)
|
||||||
zlinux_dmabuf_destroy(display->dmabuf);
|
zwp_linux_dmabuf_v1_destroy(display->dmabuf);
|
||||||
|
|
||||||
if (display->shell)
|
if (display->shell)
|
||||||
xdg_shell_destroy(display->shell);
|
xdg_shell_destroy(display->shell);
|
||||||
|
|||||||
@@ -1,274 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<protocol name="linux_dmabuf">
|
|
||||||
|
|
||||||
<copyright>
|
|
||||||
Copyright © 2014, 2015 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
|
|
||||||
and the Linux DRM sub-system's AddFb2 ioctl.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
The following are required from clients:
|
|
||||||
|
|
||||||
- Clients must ensure that either all data in the dma-buf is
|
|
||||||
coherent for all subsequent read access or that coherency is
|
|
||||||
correctly handled by the underlying kernel-side dma-buf
|
|
||||||
implementation.
|
|
||||||
|
|
||||||
- Don't make any more attachments after sending the buffer to the
|
|
||||||
compositor. Making more attachments later increases the risk of
|
|
||||||
the compositor not being able to use (re-import) an existing
|
|
||||||
dmabuf-based wl_buffer.
|
|
||||||
|
|
||||||
The underlying graphics stack must ensure the following:
|
|
||||||
|
|
||||||
- The dmabuf file descriptors relayed to the server will stay valid
|
|
||||||
for the whole lifetime of the wl_buffer. This means the server may
|
|
||||||
at any time use those fds to import the dmabuf into any kernel
|
|
||||||
sub-system that might accept it.
|
|
||||||
|
|
||||||
To create a wl_buffer from one or more dmabufs, a client creates a
|
|
||||||
zlinux_dmabuf_params object with zlinux_dmabuf.create_params
|
|
||||||
request. All planes required by the intended format are added with
|
|
||||||
the 'add' request. Finally, 'create' request is issued. The server
|
|
||||||
will reply with either 'created' event which provides the final
|
|
||||||
wl_buffer or 'failed' event saying that it cannot use the dmabufs
|
|
||||||
provided.
|
|
||||||
</description>
|
|
||||||
|
|
||||||
<request name="destroy" type="destructor">
|
|
||||||
<description summary="unbind the factory">
|
|
||||||
Objects created through this interface, especially wl_buffers, will
|
|
||||||
remain valid.
|
|
||||||
</description>
|
|
||||||
</request>
|
|
||||||
|
|
||||||
<request name="create_params">
|
|
||||||
<description summary="create a temporary object for buffer parameters">
|
|
||||||
This temporary object is used to collect multiple dmabuf handles into
|
|
||||||
a single batch to create a wl_buffer. It can only be used once and
|
|
||||||
should be destroyed after an 'created' or 'failed' event has been
|
|
||||||
received.
|
|
||||||
</description>
|
|
||||||
<arg name="params_id" type="new_id" interface="zlinux_buffer_params"
|
|
||||||
summary="the new temporary"/>
|
|
||||||
</request>
|
|
||||||
|
|
||||||
<event name="format">
|
|
||||||
<description summary="supported buffer format">
|
|
||||||
This event advertises one buffer format that the server supports.
|
|
||||||
All the supported formats are advertised once when the client
|
|
||||||
binds to this interface. A roundtrip after binding guarantees,
|
|
||||||
that the client has received all supported formats.
|
|
||||||
|
|
||||||
For the definition of the format codes, see create request.
|
|
||||||
|
|
||||||
XXX: Can a compositor ever enumerate them?
|
|
||||||
</description>
|
|
||||||
<arg name="format" type="uint" summary="DRM_FORMAT code"/>
|
|
||||||
</event>
|
|
||||||
|
|
||||||
</interface>
|
|
||||||
|
|
||||||
<interface name="zlinux_buffer_params" version="1">
|
|
||||||
<description summary="parameters for creating a dmabuf-based wl_buffer">
|
|
||||||
This temporary object is a collection of dmabufs and other
|
|
||||||
parameters that together form a single logical buffer. The temporary
|
|
||||||
object may eventually create one wl_buffer unless cancelled by
|
|
||||||
destroying it before requesting 'create'.
|
|
||||||
|
|
||||||
Single-planar formats only require one dmabuf, however
|
|
||||||
multi-planar formats may require more than one dmabuf. For all
|
|
||||||
formats, 'add' request must be called once per plane (even if the
|
|
||||||
underlying dmabuf fd is identical).
|
|
||||||
|
|
||||||
You must use consecutive plane indices ('plane_idx' argument for 'add')
|
|
||||||
from zero to the number of planes used by the drm_fourcc format code.
|
|
||||||
All planes required by the format must be given exactly once, but can
|
|
||||||
be given in any order. Each plane index can be set only once.
|
|
||||||
</description>
|
|
||||||
|
|
||||||
<enum name="error">
|
|
||||||
<entry name="already_used" value="0"
|
|
||||||
summary="the dmabuf_batch object has already been used to create a wl_buffer"/>
|
|
||||||
|
|
||||||
<entry name="plane_idx" value="1"
|
|
||||||
summary="plane index out of bounds"/>
|
|
||||||
|
|
||||||
<entry name="plane_set" value="2"
|
|
||||||
summary="the plane index was already set"/>
|
|
||||||
|
|
||||||
<entry name="incomplete" value="3"
|
|
||||||
summary="missing or too many planes to create a buffer"/>
|
|
||||||
|
|
||||||
<entry name="invalid_format" value="4"
|
|
||||||
summary="format not supported"/>
|
|
||||||
|
|
||||||
<entry name="invalid_dimensions" value="5"
|
|
||||||
summary="invalid width or height"/>
|
|
||||||
|
|
||||||
<entry name="out_of_bounds" value="6"
|
|
||||||
summary="offset + stride * height goes out of dmabuf bounds"/>
|
|
||||||
</enum>
|
|
||||||
|
|
||||||
<request name="destroy" type="destructor">
|
|
||||||
<description summary="delete this object, used or not">
|
|
||||||
Cleans up the temporary data sent to the server for dmabuf-based
|
|
||||||
wl_buffer creation.
|
|
||||||
</description>
|
|
||||||
</request>
|
|
||||||
|
|
||||||
<request name="add">
|
|
||||||
<description summary="add a dmabuf to the temporary set">
|
|
||||||
This request adds one dmabuf to the set in this zlinux_buffer_params.
|
|
||||||
|
|
||||||
The 64-bit unsigned value combined from modifier_hi and modifier_lo
|
|
||||||
is the dmabuf layout modifier. DRM AddFB2 ioctl calls this the
|
|
||||||
fb modifier, which is defined in drm_mode.h of Linux UAPI.
|
|
||||||
This is an opaque token. Drivers use this token to express tiling,
|
|
||||||
compression, etc. driver-specific modifications to the base format
|
|
||||||
defined by the DRM fourcc code.
|
|
||||||
|
|
||||||
This request raises the PLANE_IDX error if plane_idx is too large.
|
|
||||||
The error PLANE_SET is raised if attempting to set a plane that
|
|
||||||
was already set.
|
|
||||||
</description>
|
|
||||||
|
|
||||||
<arg name="fd" type="fd" summary="dmabuf fd"/>
|
|
||||||
<arg name="plane_idx" type="uint" summary="plane index"/>
|
|
||||||
<arg name="offset" type="uint" summary="offset in bytes"/>
|
|
||||||
<arg name="stride" type="uint" summary="stride in bytes"/>
|
|
||||||
<arg name="modifier_hi" type="uint"
|
|
||||||
summary="high 32 bits of layout modifier"/>
|
|
||||||
<arg name="modifier_lo" type="uint"
|
|
||||||
summary="low 32 bits of layout modifier"/>
|
|
||||||
</request>
|
|
||||||
|
|
||||||
<enum name="flags">
|
|
||||||
<entry name="y_invert" value="1" summary="contents are y-inverted"/>
|
|
||||||
<entry name="interlaced" value="2" summary="content is interlaced"/>
|
|
||||||
<entry name="bottom_first" value="4" summary="bottom field first"/>
|
|
||||||
</enum>
|
|
||||||
|
|
||||||
<request name="create">
|
|
||||||
<description summary="create a wl_buffer from the given dmabufs">
|
|
||||||
This asks for creation of a wl_buffer from the added dmabuf
|
|
||||||
buffers. The wl_buffer is not created immediately but returned via
|
|
||||||
the 'created' event if the dmabuf sharing succeeds. The sharing
|
|
||||||
may fail at runtime for reasons a client cannot predict, in
|
|
||||||
which case the 'failed' event is triggered.
|
|
||||||
|
|
||||||
The 'format' argument is a DRM_FORMAT code, as defined by the
|
|
||||||
libdrm's drm_fourcc.h. The Linux kernel's DRM sub-system is the
|
|
||||||
authoritative source on how the format codes should work.
|
|
||||||
|
|
||||||
The 'flags' is a bitfield of the flags defined in enum "flags".
|
|
||||||
'y_invert' means the that the image needs to be y-flipped.
|
|
||||||
|
|
||||||
Flag 'interlaced' means that the frame in the buffer is not
|
|
||||||
progressive as usual, but interlaced. An interlaced buffer as
|
|
||||||
supported here must always contain both top and bottom fields.
|
|
||||||
The top field always begins on the first pixel row. The temporal
|
|
||||||
ordering between the two fields is top field first, unless
|
|
||||||
'bottom_first' is specified. It is undefined whether 'bottom_first'
|
|
||||||
is ignored if 'interlaced' is not set.
|
|
||||||
|
|
||||||
This protocol does not convey any information about field rate,
|
|
||||||
duration, or timing, other than the relative ordering between the
|
|
||||||
two fields in one buffer. A compositor may have to estimate the
|
|
||||||
intended field rate from the incoming buffer rate. It is undefined
|
|
||||||
whether the time of receiving wl_surface.commit with a new buffer
|
|
||||||
attached, applying the wl_surface state, wl_surface.frame callback
|
|
||||||
trigger, presentation, or any other point in the compositor cycle
|
|
||||||
is used to measure the frame or field times. There is no support
|
|
||||||
for detecting missed or late frames/fields/buffers either, and
|
|
||||||
there is no support whatsoever for cooperating with interlaced
|
|
||||||
compositor output.
|
|
||||||
|
|
||||||
The composited image quality resulting from the use of interlaced
|
|
||||||
buffers is explicitly undefined. A compositor may use elaborate
|
|
||||||
hardware features or software to deinterlace and create progressive
|
|
||||||
output frames from a sequence of interlaced input buffers, or it
|
|
||||||
may produce substandard image quality. However, compositors that
|
|
||||||
cannot guarantee reasonable image quality in all cases are recommended
|
|
||||||
to just reject all interlaced buffers.
|
|
||||||
|
|
||||||
Any argument errors, including non-positive width or height,
|
|
||||||
mismatch between the number of planes and the format, bad
|
|
||||||
format, bad offset or stride, may be indicated by fatal protocol
|
|
||||||
errors: INCOMPLETE, INVALID_FORMAT, INVALID_DIMENSIONS,
|
|
||||||
OUT_OF_BOUNDS.
|
|
||||||
|
|
||||||
Dmabuf import errors in the server that are not obvious client
|
|
||||||
bugs are returned via the 'failed' event as non-fatal. This
|
|
||||||
allows attempting dmabuf sharing and falling back in the client
|
|
||||||
if it fails.
|
|
||||||
|
|
||||||
This request can be sent only once in the object's lifetime, after
|
|
||||||
which the only legal request is destroy. This object should be
|
|
||||||
destroyed after issuing 'create' request. Attempting to use this
|
|
||||||
object after issuing 'create' raises ALREADY_USED protocol error.
|
|
||||||
|
|
||||||
It is not mandatory to issue 'create'. If a client wants to
|
|
||||||
cancel the buffer creation, it can just destroy this object.
|
|
||||||
</description>
|
|
||||||
<arg name="width" type="int" summary="base plane width in pixels"/>
|
|
||||||
<arg name="height" type="int" summary="base plane height in pixels"/>
|
|
||||||
<arg name="format" type="uint" summary="DRM_FORMAT code"/>
|
|
||||||
<arg name="flags" type="uint" summary="see enum flags"/>
|
|
||||||
</request>
|
|
||||||
|
|
||||||
<event name="created">
|
|
||||||
<description summary="buffer creation succeeded">
|
|
||||||
This event indicates that the attempted buffer creation was
|
|
||||||
successful. It provides the new wl_buffer referencing the dmabuf(s).
|
|
||||||
|
|
||||||
Upon receiving this event, the client should destroy the
|
|
||||||
zlinux_dmabuf_params object.
|
|
||||||
</description>
|
|
||||||
<arg name="buffer" type="new_id" interface="wl_buffer"
|
|
||||||
summary="the newly created wl_buffer"/>
|
|
||||||
</event>
|
|
||||||
|
|
||||||
<event name="failed">
|
|
||||||
<description summary="buffer creation failed">
|
|
||||||
This event indicates that the attempted buffer creation 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_buffer_params object.
|
|
||||||
</description>
|
|
||||||
</event>
|
|
||||||
|
|
||||||
</interface>
|
|
||||||
|
|
||||||
</protocol>
|
|
||||||
+3
-3
@@ -41,7 +41,7 @@
|
|||||||
#include "gl-renderer.h"
|
#include "gl-renderer.h"
|
||||||
#include "vertex-clipping.h"
|
#include "vertex-clipping.h"
|
||||||
#include "linux-dmabuf.h"
|
#include "linux-dmabuf.h"
|
||||||
#include "linux-dmabuf-server-protocol.h"
|
#include "linux-dmabuf-unstable-v1-server-protocol.h"
|
||||||
|
|
||||||
#include "shared/helpers.h"
|
#include "shared/helpers.h"
|
||||||
#include "weston-egl-ext.h"
|
#include "weston-egl-ext.h"
|
||||||
@@ -1514,7 +1514,7 @@ gl_renderer_import_dmabuf(struct weston_compositor *ec,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* reject all flags we do not recognize or handle */
|
/* reject all flags we do not recognize or handle */
|
||||||
if (dmabuf->flags & ~ZLINUX_BUFFER_PARAMS_FLAGS_Y_INVERT)
|
if (dmabuf->flags & ~ZWP_LINUX_BUFFER_PARAMS_V1_FLAGS_Y_INVERT)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
image = import_dmabuf(gr, dmabuf);
|
image = import_dmabuf(gr, dmabuf);
|
||||||
@@ -1563,7 +1563,7 @@ gl_renderer_attach_dmabuf(struct weston_surface *surface,
|
|||||||
buffer->width = dmabuf->width;
|
buffer->width = dmabuf->width;
|
||||||
buffer->height = dmabuf->height;
|
buffer->height = dmabuf->height;
|
||||||
buffer->y_inverted =
|
buffer->y_inverted =
|
||||||
!!(dmabuf->flags & ZLINUX_BUFFER_PARAMS_FLAGS_Y_INVERT);
|
!!(dmabuf->flags & ZWP_LINUX_BUFFER_PARAMS_V1_FLAGS_Y_INVERT);
|
||||||
|
|
||||||
for (i = 0; i < gs->num_images; i++)
|
for (i = 0; i < gs->num_images; i++)
|
||||||
egl_image_unref(gs->images[i]);
|
egl_image_unref(gs->images[i]);
|
||||||
|
|||||||
+23
-23
@@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
#include "compositor.h"
|
#include "compositor.h"
|
||||||
#include "linux-dmabuf.h"
|
#include "linux-dmabuf.h"
|
||||||
#include "linux-dmabuf-server-protocol.h"
|
#include "linux-dmabuf-unstable-v1-server-protocol.h"
|
||||||
|
|
||||||
static void
|
static void
|
||||||
linux_dmabuf_buffer_destroy(struct linux_dmabuf_buffer *buffer)
|
linux_dmabuf_buffer_destroy(struct linux_dmabuf_buffer *buffer)
|
||||||
@@ -78,7 +78,7 @@ params_add(struct wl_client *client,
|
|||||||
buffer = wl_resource_get_user_data(params_resource);
|
buffer = wl_resource_get_user_data(params_resource);
|
||||||
if (!buffer) {
|
if (!buffer) {
|
||||||
wl_resource_post_error(params_resource,
|
wl_resource_post_error(params_resource,
|
||||||
ZLINUX_BUFFER_PARAMS_ERROR_ALREADY_USED,
|
ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_ALREADY_USED,
|
||||||
"params was already used to create a wl_buffer");
|
"params was already used to create a wl_buffer");
|
||||||
close(name_fd);
|
close(name_fd);
|
||||||
return;
|
return;
|
||||||
@@ -89,7 +89,7 @@ params_add(struct wl_client *client,
|
|||||||
|
|
||||||
if (plane_idx >= MAX_DMABUF_PLANES) {
|
if (plane_idx >= MAX_DMABUF_PLANES) {
|
||||||
wl_resource_post_error(params_resource,
|
wl_resource_post_error(params_resource,
|
||||||
ZLINUX_BUFFER_PARAMS_ERROR_PLANE_IDX,
|
ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_PLANE_IDX,
|
||||||
"plane index %u is too high", plane_idx);
|
"plane index %u is too high", plane_idx);
|
||||||
close(name_fd);
|
close(name_fd);
|
||||||
return;
|
return;
|
||||||
@@ -97,7 +97,7 @@ params_add(struct wl_client *client,
|
|||||||
|
|
||||||
if (buffer->dmabuf_fd[plane_idx] != -1) {
|
if (buffer->dmabuf_fd[plane_idx] != -1) {
|
||||||
wl_resource_post_error(params_resource,
|
wl_resource_post_error(params_resource,
|
||||||
ZLINUX_BUFFER_PARAMS_ERROR_PLANE_SET,
|
ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_PLANE_SET,
|
||||||
"a dmabuf has already been added for plane %u",
|
"a dmabuf has already been added for plane %u",
|
||||||
plane_idx);
|
plane_idx);
|
||||||
close(name_fd);
|
close(name_fd);
|
||||||
@@ -153,7 +153,7 @@ params_create(struct wl_client *client,
|
|||||||
|
|
||||||
if (!buffer) {
|
if (!buffer) {
|
||||||
wl_resource_post_error(params_resource,
|
wl_resource_post_error(params_resource,
|
||||||
ZLINUX_BUFFER_PARAMS_ERROR_ALREADY_USED,
|
ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_ALREADY_USED,
|
||||||
"params was already used to create a wl_buffer");
|
"params was already used to create a wl_buffer");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -169,7 +169,7 @@ params_create(struct wl_client *client,
|
|||||||
|
|
||||||
if (!buffer->n_planes) {
|
if (!buffer->n_planes) {
|
||||||
wl_resource_post_error(params_resource,
|
wl_resource_post_error(params_resource,
|
||||||
ZLINUX_BUFFER_PARAMS_ERROR_INCOMPLETE,
|
ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_INCOMPLETE,
|
||||||
"no dmabuf has been added to the params");
|
"no dmabuf has been added to the params");
|
||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
@@ -178,7 +178,7 @@ params_create(struct wl_client *client,
|
|||||||
for (i = 0; i < buffer->n_planes; i++) {
|
for (i = 0; i < buffer->n_planes; i++) {
|
||||||
if (buffer->dmabuf_fd[i] == -1) {
|
if (buffer->dmabuf_fd[i] == -1) {
|
||||||
wl_resource_post_error(params_resource,
|
wl_resource_post_error(params_resource,
|
||||||
ZLINUX_BUFFER_PARAMS_ERROR_INCOMPLETE,
|
ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_INCOMPLETE,
|
||||||
"no dmabuf has been added for plane %i", i);
|
"no dmabuf has been added for plane %i", i);
|
||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
@@ -191,7 +191,7 @@ params_create(struct wl_client *client,
|
|||||||
|
|
||||||
if (width < 1 || height < 1) {
|
if (width < 1 || height < 1) {
|
||||||
wl_resource_post_error(params_resource,
|
wl_resource_post_error(params_resource,
|
||||||
ZLINUX_BUFFER_PARAMS_ERROR_INVALID_DIMENSIONS,
|
ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_INVALID_DIMENSIONS,
|
||||||
"invalid width %d or height %d", width, height);
|
"invalid width %d or height %d", width, height);
|
||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
@@ -201,7 +201,7 @@ params_create(struct wl_client *client,
|
|||||||
|
|
||||||
if ((uint64_t) buffer->offset[i] + buffer->stride[i] > UINT32_MAX) {
|
if ((uint64_t) buffer->offset[i] + buffer->stride[i] > UINT32_MAX) {
|
||||||
wl_resource_post_error(params_resource,
|
wl_resource_post_error(params_resource,
|
||||||
ZLINUX_BUFFER_PARAMS_ERROR_OUT_OF_BOUNDS,
|
ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_OUT_OF_BOUNDS,
|
||||||
"size overflow for plane %i", i);
|
"size overflow for plane %i", i);
|
||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
@@ -210,7 +210,7 @@ params_create(struct wl_client *client,
|
|||||||
(uint64_t) buffer->offset[i] +
|
(uint64_t) buffer->offset[i] +
|
||||||
(uint64_t) buffer->stride[i] * height > UINT32_MAX) {
|
(uint64_t) buffer->stride[i] * height > UINT32_MAX) {
|
||||||
wl_resource_post_error(params_resource,
|
wl_resource_post_error(params_resource,
|
||||||
ZLINUX_BUFFER_PARAMS_ERROR_OUT_OF_BOUNDS,
|
ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_OUT_OF_BOUNDS,
|
||||||
"size overflow for plane %i", i);
|
"size overflow for plane %i", i);
|
||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
@@ -223,7 +223,7 @@ params_create(struct wl_client *client,
|
|||||||
|
|
||||||
if (buffer->offset[i] >= size) {
|
if (buffer->offset[i] >= size) {
|
||||||
wl_resource_post_error(params_resource,
|
wl_resource_post_error(params_resource,
|
||||||
ZLINUX_BUFFER_PARAMS_ERROR_OUT_OF_BOUNDS,
|
ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_OUT_OF_BOUNDS,
|
||||||
"invalid offset %i for plane %i",
|
"invalid offset %i for plane %i",
|
||||||
buffer->offset[i], i);
|
buffer->offset[i], i);
|
||||||
goto err_out;
|
goto err_out;
|
||||||
@@ -231,7 +231,7 @@ params_create(struct wl_client *client,
|
|||||||
|
|
||||||
if (buffer->offset[i] + buffer->stride[i] > size) {
|
if (buffer->offset[i] + buffer->stride[i] > size) {
|
||||||
wl_resource_post_error(params_resource,
|
wl_resource_post_error(params_resource,
|
||||||
ZLINUX_BUFFER_PARAMS_ERROR_OUT_OF_BOUNDS,
|
ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_OUT_OF_BOUNDS,
|
||||||
"invalid stride %i for plane %i",
|
"invalid stride %i for plane %i",
|
||||||
buffer->stride[i], i);
|
buffer->stride[i], i);
|
||||||
goto err_out;
|
goto err_out;
|
||||||
@@ -242,7 +242,7 @@ params_create(struct wl_client *client,
|
|||||||
if (i == 0 &&
|
if (i == 0 &&
|
||||||
buffer->offset[i] + buffer->stride[i] * height > size) {
|
buffer->offset[i] + buffer->stride[i] * height > size) {
|
||||||
wl_resource_post_error(params_resource,
|
wl_resource_post_error(params_resource,
|
||||||
ZLINUX_BUFFER_PARAMS_ERROR_OUT_OF_BOUNDS,
|
ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_OUT_OF_BOUNDS,
|
||||||
"invalid buffer stride or height for plane %i", i);
|
"invalid buffer stride or height for plane %i", i);
|
||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
@@ -269,7 +269,7 @@ params_create(struct wl_client *client,
|
|||||||
&linux_dmabuf_buffer_implementation,
|
&linux_dmabuf_buffer_implementation,
|
||||||
buffer, destroy_linux_dmabuf_wl_buffer);
|
buffer, destroy_linux_dmabuf_wl_buffer);
|
||||||
|
|
||||||
zlinux_buffer_params_send_created(params_resource,
|
zwp_linux_buffer_params_v1_send_created(params_resource,
|
||||||
buffer->buffer_resource);
|
buffer->buffer_resource);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@@ -279,14 +279,14 @@ err_buffer:
|
|||||||
buffer->user_data_destroy_func(buffer);
|
buffer->user_data_destroy_func(buffer);
|
||||||
|
|
||||||
err_failed:
|
err_failed:
|
||||||
zlinux_buffer_params_send_failed(params_resource);
|
zwp_linux_buffer_params_v1_send_failed(params_resource);
|
||||||
|
|
||||||
err_out:
|
err_out:
|
||||||
linux_dmabuf_buffer_destroy(buffer);
|
linux_dmabuf_buffer_destroy(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct zlinux_buffer_params_interface
|
static const struct zwp_linux_buffer_params_v1_interface
|
||||||
zlinux_buffer_params_implementation = {
|
zwp_linux_buffer_params_implementation = {
|
||||||
params_destroy,
|
params_destroy,
|
||||||
params_add,
|
params_add,
|
||||||
params_create
|
params_create
|
||||||
@@ -321,13 +321,13 @@ linux_dmabuf_create_params(struct wl_client *client,
|
|||||||
buffer->compositor = compositor;
|
buffer->compositor = compositor;
|
||||||
buffer->params_resource =
|
buffer->params_resource =
|
||||||
wl_resource_create(client,
|
wl_resource_create(client,
|
||||||
&zlinux_buffer_params_interface,
|
&zwp_linux_buffer_params_v1_interface,
|
||||||
version, params_id);
|
version, params_id);
|
||||||
if (!buffer->params_resource)
|
if (!buffer->params_resource)
|
||||||
goto err_dealloc;
|
goto err_dealloc;
|
||||||
|
|
||||||
wl_resource_set_implementation(buffer->params_resource,
|
wl_resource_set_implementation(buffer->params_resource,
|
||||||
&zlinux_buffer_params_implementation,
|
&zwp_linux_buffer_params_implementation,
|
||||||
buffer, destroy_params);
|
buffer, destroy_params);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@@ -411,7 +411,7 @@ linux_dmabuf_buffer_get_user_data(struct linux_dmabuf_buffer *buffer)
|
|||||||
return buffer->user_data;
|
return buffer->user_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct zlinux_dmabuf_interface linux_dmabuf_implementation = {
|
static const struct zwp_linux_dmabuf_v1_interface linux_dmabuf_implementation = {
|
||||||
linux_dmabuf_destroy,
|
linux_dmabuf_destroy,
|
||||||
linux_dmabuf_create_params
|
linux_dmabuf_create_params
|
||||||
};
|
};
|
||||||
@@ -423,7 +423,7 @@ bind_linux_dmabuf(struct wl_client *client,
|
|||||||
struct weston_compositor *compositor = data;
|
struct weston_compositor *compositor = data;
|
||||||
struct wl_resource *resource;
|
struct wl_resource *resource;
|
||||||
|
|
||||||
resource = wl_resource_create(client, &zlinux_dmabuf_interface,
|
resource = wl_resource_create(client, &zwp_linux_dmabuf_v1_interface,
|
||||||
version, id);
|
version, id);
|
||||||
if (resource == NULL) {
|
if (resource == NULL) {
|
||||||
wl_client_post_no_memory(client);
|
wl_client_post_no_memory(client);
|
||||||
@@ -440,7 +440,7 @@ bind_linux_dmabuf(struct wl_client *client,
|
|||||||
|
|
||||||
/** Advertise linux_dmabuf support
|
/** Advertise linux_dmabuf support
|
||||||
*
|
*
|
||||||
* Calling this initializes the zlinux_dmabuf protocol support, so that
|
* Calling this initializes the zwp_linux_dmabuf protocol support, so that
|
||||||
* the interface will be advertised to clients. Essentially it creates a
|
* the interface will be advertised to clients. Essentially it creates a
|
||||||
* global. Do not call this function multiple times in the compositor's
|
* global. Do not call this function multiple times in the compositor's
|
||||||
* lifetime. There is no way to deinit explicitly, globals will be reaped
|
* lifetime. There is no way to deinit explicitly, globals will be reaped
|
||||||
@@ -453,7 +453,7 @@ WL_EXPORT int
|
|||||||
linux_dmabuf_setup(struct weston_compositor *compositor)
|
linux_dmabuf_setup(struct weston_compositor *compositor)
|
||||||
{
|
{
|
||||||
if (!wl_global_create(compositor->wl_display,
|
if (!wl_global_create(compositor->wl_display,
|
||||||
&zlinux_dmabuf_interface, 1,
|
&zwp_linux_dmabuf_v1_interface, 1,
|
||||||
compositor, bind_linux_dmabuf))
|
compositor, bind_linux_dmabuf))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user