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:
parent
496adb3bb3
commit
57e48f023c
13
Makefile.am
13
Makefile.am
|
@ -127,8 +127,8 @@ nodist_weston_SOURCES = \
|
|||
protocol/presentation_timing-server-protocol.h \
|
||||
protocol/scaler-protocol.c \
|
||||
protocol/scaler-server-protocol.h \
|
||||
protocol/linux-dmabuf-protocol.c \
|
||||
protocol/linux-dmabuf-server-protocol.h
|
||||
protocol/linux-dmabuf-unstable-v1-protocol.c \
|
||||
protocol/linux-dmabuf-unstable-v1-server-protocol.h
|
||||
|
||||
BUILT_SOURCES += $(nodist_weston_SOURCES)
|
||||
|
||||
|
@ -533,11 +533,11 @@ nodist_weston_simple_dmabuf_SOURCES = \
|
|||
protocol/xdg-shell-client-protocol.h \
|
||||
protocol/fullscreen-shell-unstable-v1-protocol.c \
|
||||
protocol/fullscreen-shell-unstable-v1-client-protocol.h \
|
||||
protocol/linux-dmabuf-protocol.c \
|
||||
protocol/linux-dmabuf-client-protocol.h
|
||||
protocol/linux-dmabuf-unstable-v1-protocol.c \
|
||||
protocol/linux-dmabuf-unstable-v1-client-protocol.h
|
||||
weston_simple_dmabuf_CFLAGS = $(AM_CFLAGS) $(SIMPLE_DMABUF_CLIENT_CFLAGS)
|
||||
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
|
||||
|
||||
noinst_LTLIBRARIES += libtoytoolkit.la
|
||||
|
@ -1351,8 +1351,7 @@ EXTRA_DIST += \
|
|||
protocol/presentation_timing.xml \
|
||||
protocol/scaler.xml \
|
||||
protocol/ivi-application.xml \
|
||||
protocol/ivi-hmi-controller.xml \
|
||||
protocol/linux-dmabuf.xml
|
||||
protocol/ivi-hmi-controller.xml
|
||||
|
||||
#
|
||||
# manual test modules in tests subdirectory
|
||||
|
|
|
@ -42,7 +42,7 @@
|
|||
#include <wayland-client.h>
|
||||
#include "xdg-shell-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 wl_display *display;
|
||||
|
@ -50,7 +50,7 @@ struct display {
|
|||
struct wl_compositor *compositor;
|
||||
struct xdg_shell *shell;
|
||||
struct zwp_fullscreen_shell_v1 *fshell;
|
||||
struct zlinux_dmabuf *dmabuf;
|
||||
struct zwp_linux_dmabuf_v1 *dmabuf;
|
||||
int xrgb8888_format_found;
|
||||
};
|
||||
|
||||
|
@ -187,7 +187,7 @@ unmap_bo(struct buffer *my_buf)
|
|||
|
||||
static void
|
||||
create_succeeded(void *data,
|
||||
struct zlinux_buffer_params *params,
|
||||
struct zwp_linux_buffer_params_v1 *params,
|
||||
struct wl_buffer *new_buffer)
|
||||
{
|
||||
struct buffer *buffer = data;
|
||||
|
@ -195,22 +195,22 @@ create_succeeded(void *data,
|
|||
buffer->buffer = new_buffer;
|
||||
wl_buffer_add_listener(buffer->buffer, &buffer_listener, buffer);
|
||||
|
||||
zlinux_buffer_params_destroy(params);
|
||||
zwp_linux_buffer_params_v1_destroy(params);
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
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_failed
|
||||
};
|
||||
|
@ -219,7 +219,7 @@ static int
|
|||
create_dmabuf_buffer(struct display *display, struct buffer *buffer,
|
||||
int width, int height)
|
||||
{
|
||||
struct zlinux_buffer_params *params;
|
||||
struct zwp_linux_buffer_params_v1 *params;
|
||||
uint64_t modifier;
|
||||
uint32_t flags;
|
||||
|
||||
|
@ -259,20 +259,20 @@ create_dmabuf_buffer(struct display *display, struct buffer *buffer,
|
|||
modifier = 0;
|
||||
flags = 0;
|
||||
|
||||
params = zlinux_dmabuf_create_params(display->dmabuf);
|
||||
zlinux_buffer_params_add(params,
|
||||
buffer->dmabuf_fd,
|
||||
0, /* plane_idx */
|
||||
0, /* offset */
|
||||
buffer->stride,
|
||||
modifier >> 32,
|
||||
modifier & 0xffffffff);
|
||||
zlinux_buffer_params_add_listener(params, ¶ms_listener, buffer);
|
||||
zlinux_buffer_params_create(params,
|
||||
buffer->width,
|
||||
buffer->height,
|
||||
DRM_FORMAT_XRGB8888,
|
||||
flags);
|
||||
params = zwp_linux_dmabuf_v1_create_params(display->dmabuf);
|
||||
zwp_linux_buffer_params_v1_add(params,
|
||||
buffer->dmabuf_fd,
|
||||
0, /* plane_idx */
|
||||
0, /* offset */
|
||||
buffer->stride,
|
||||
modifier >> 32,
|
||||
modifier & 0xffffffff);
|
||||
zwp_linux_buffer_params_v1_add_listener(params, ¶ms_listener, buffer);
|
||||
zwp_linux_buffer_params_v1_create(params,
|
||||
buffer->width,
|
||||
buffer->height,
|
||||
DRM_FORMAT_XRGB8888,
|
||||
flags);
|
||||
|
||||
/* params is destroyed by the event handlers */
|
||||
|
||||
|
@ -430,7 +430,7 @@ static const struct wl_callback_listener frame_listener = {
|
|||
};
|
||||
|
||||
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;
|
||||
|
||||
|
@ -438,7 +438,7 @@ dmabuf_format(void *data, struct zlinux_dmabuf *zlinux_dmabuf, uint32_t format)
|
|||
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
|
||||
};
|
||||
|
||||
|
@ -476,10 +476,10 @@ registry_handle_global(void *data, struct wl_registry *registry,
|
|||
} else if (strcmp(interface, "zwp_fullscreen_shell_v1") == 0) {
|
||||
d->fshell = wl_registry_bind(registry,
|
||||
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,
|
||||
id, &zlinux_dmabuf_interface, 1);
|
||||
zlinux_dmabuf_add_listener(d->dmabuf, &dmabuf_listener, d);
|
||||
id, &zwp_linux_dmabuf_v1_interface, 1);
|
||||
zwp_linux_dmabuf_v1_add_listener(d->dmabuf, &dmabuf_listener, d);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -515,7 +515,7 @@ create_display(void)
|
|||
®istry_listener, display);
|
||||
wl_display_roundtrip(display->display);
|
||||
if (display->dmabuf == NULL) {
|
||||
fprintf(stderr, "No zlinux_dmabuf global\n");
|
||||
fprintf(stderr, "No zwp_linux_dmabuf global\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
@ -533,7 +533,7 @@ static void
|
|||
destroy_display(struct display *display)
|
||||
{
|
||||
if (display->dmabuf)
|
||||
zlinux_dmabuf_destroy(display->dmabuf);
|
||||
zwp_linux_dmabuf_v1_destroy(display->dmabuf);
|
||||
|
||||
if (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>
|
|
@ -41,7 +41,7 @@
|
|||
#include "gl-renderer.h"
|
||||
#include "vertex-clipping.h"
|
||||
#include "linux-dmabuf.h"
|
||||
#include "linux-dmabuf-server-protocol.h"
|
||||
#include "linux-dmabuf-unstable-v1-server-protocol.h"
|
||||
|
||||
#include "shared/helpers.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 */
|
||||
if (dmabuf->flags & ~ZLINUX_BUFFER_PARAMS_FLAGS_Y_INVERT)
|
||||
if (dmabuf->flags & ~ZWP_LINUX_BUFFER_PARAMS_V1_FLAGS_Y_INVERT)
|
||||
return false;
|
||||
|
||||
image = import_dmabuf(gr, dmabuf);
|
||||
|
@ -1563,7 +1563,7 @@ gl_renderer_attach_dmabuf(struct weston_surface *surface,
|
|||
buffer->width = dmabuf->width;
|
||||
buffer->height = dmabuf->height;
|
||||
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++)
|
||||
egl_image_unref(gs->images[i]);
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
|
||||
#include "compositor.h"
|
||||
#include "linux-dmabuf.h"
|
||||
#include "linux-dmabuf-server-protocol.h"
|
||||
#include "linux-dmabuf-unstable-v1-server-protocol.h"
|
||||
|
||||
static void
|
||||
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);
|
||||
if (!buffer) {
|
||||
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");
|
||||
close(name_fd);
|
||||
return;
|
||||
|
@ -89,7 +89,7 @@ params_add(struct wl_client *client,
|
|||
|
||||
if (plane_idx >= MAX_DMABUF_PLANES) {
|
||||
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);
|
||||
close(name_fd);
|
||||
return;
|
||||
|
@ -97,7 +97,7 @@ params_add(struct wl_client *client,
|
|||
|
||||
if (buffer->dmabuf_fd[plane_idx] != -1) {
|
||||
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",
|
||||
plane_idx);
|
||||
close(name_fd);
|
||||
|
@ -153,7 +153,7 @@ params_create(struct wl_client *client,
|
|||
|
||||
if (!buffer) {
|
||||
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");
|
||||
return;
|
||||
}
|
||||
|
@ -169,7 +169,7 @@ params_create(struct wl_client *client,
|
|||
|
||||
if (!buffer->n_planes) {
|
||||
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");
|
||||
goto err_out;
|
||||
}
|
||||
|
@ -178,7 +178,7 @@ params_create(struct wl_client *client,
|
|||
for (i = 0; i < buffer->n_planes; i++) {
|
||||
if (buffer->dmabuf_fd[i] == -1) {
|
||||
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);
|
||||
goto err_out;
|
||||
}
|
||||
|
@ -191,7 +191,7 @@ params_create(struct wl_client *client,
|
|||
|
||||
if (width < 1 || height < 1) {
|
||||
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);
|
||||
goto err_out;
|
||||
}
|
||||
|
@ -201,7 +201,7 @@ params_create(struct wl_client *client,
|
|||
|
||||
if ((uint64_t) buffer->offset[i] + buffer->stride[i] > UINT32_MAX) {
|
||||
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);
|
||||
goto err_out;
|
||||
}
|
||||
|
@ -210,7 +210,7 @@ params_create(struct wl_client *client,
|
|||
(uint64_t) buffer->offset[i] +
|
||||
(uint64_t) buffer->stride[i] * height > UINT32_MAX) {
|
||||
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);
|
||||
goto err_out;
|
||||
}
|
||||
|
@ -223,7 +223,7 @@ params_create(struct wl_client *client,
|
|||
|
||||
if (buffer->offset[i] >= size) {
|
||||
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",
|
||||
buffer->offset[i], i);
|
||||
goto err_out;
|
||||
|
@ -231,7 +231,7 @@ params_create(struct wl_client *client,
|
|||
|
||||
if (buffer->offset[i] + buffer->stride[i] > size) {
|
||||
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",
|
||||
buffer->stride[i], i);
|
||||
goto err_out;
|
||||
|
@ -242,7 +242,7 @@ params_create(struct wl_client *client,
|
|||
if (i == 0 &&
|
||||
buffer->offset[i] + buffer->stride[i] * height > size) {
|
||||
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);
|
||||
goto err_out;
|
||||
}
|
||||
|
@ -269,8 +269,8 @@ params_create(struct wl_client *client,
|
|||
&linux_dmabuf_buffer_implementation,
|
||||
buffer, destroy_linux_dmabuf_wl_buffer);
|
||||
|
||||
zlinux_buffer_params_send_created(params_resource,
|
||||
buffer->buffer_resource);
|
||||
zwp_linux_buffer_params_v1_send_created(params_resource,
|
||||
buffer->buffer_resource);
|
||||
|
||||
return;
|
||||
|
||||
|
@ -279,14 +279,14 @@ err_buffer:
|
|||
buffer->user_data_destroy_func(buffer);
|
||||
|
||||
err_failed:
|
||||
zlinux_buffer_params_send_failed(params_resource);
|
||||
zwp_linux_buffer_params_v1_send_failed(params_resource);
|
||||
|
||||
err_out:
|
||||
linux_dmabuf_buffer_destroy(buffer);
|
||||
}
|
||||
|
||||
static const struct zlinux_buffer_params_interface
|
||||
zlinux_buffer_params_implementation = {
|
||||
static const struct zwp_linux_buffer_params_v1_interface
|
||||
zwp_linux_buffer_params_implementation = {
|
||||
params_destroy,
|
||||
params_add,
|
||||
params_create
|
||||
|
@ -321,13 +321,13 @@ linux_dmabuf_create_params(struct wl_client *client,
|
|||
buffer->compositor = compositor;
|
||||
buffer->params_resource =
|
||||
wl_resource_create(client,
|
||||
&zlinux_buffer_params_interface,
|
||||
&zwp_linux_buffer_params_v1_interface,
|
||||
version, params_id);
|
||||
if (!buffer->params_resource)
|
||||
goto err_dealloc;
|
||||
|
||||
wl_resource_set_implementation(buffer->params_resource,
|
||||
&zlinux_buffer_params_implementation,
|
||||
&zwp_linux_buffer_params_implementation,
|
||||
buffer, destroy_params);
|
||||
|
||||
return;
|
||||
|
@ -411,7 +411,7 @@ linux_dmabuf_buffer_get_user_data(struct linux_dmabuf_buffer *buffer)
|
|||
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_create_params
|
||||
};
|
||||
|
@ -423,7 +423,7 @@ bind_linux_dmabuf(struct wl_client *client,
|
|||
struct weston_compositor *compositor = data;
|
||||
struct wl_resource *resource;
|
||||
|
||||
resource = wl_resource_create(client, &zlinux_dmabuf_interface,
|
||||
resource = wl_resource_create(client, &zwp_linux_dmabuf_v1_interface,
|
||||
version, id);
|
||||
if (resource == NULL) {
|
||||
wl_client_post_no_memory(client);
|
||||
|
@ -440,7 +440,7 @@ bind_linux_dmabuf(struct wl_client *client,
|
|||
|
||||
/** 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
|
||||
* global. Do not call this function multiple times in the compositor's
|
||||
* 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)
|
||||
{
|
||||
if (!wl_global_create(compositor->wl_display,
|
||||
&zlinux_dmabuf_interface, 1,
|
||||
&zwp_linux_dmabuf_v1_interface, 1,
|
||||
compositor, bind_linux_dmabuf))
|
||||
return -1;
|
||||
|
||||
|
|
Loading…
Reference in New Issue