mirror of
https://github.com/godotengine/godot.git
synced 2025-12-07 22:00:10 +00:00
Wayland: Implement game embedding
This patch introduces a new protocol proxy, which multiplxes Wayland clients into a single connection, allowing us to redirect calls (e.g. create toplevel -> create subsurface). Mixed with some state tracking and emulation, we can embed a full-featured client into the editor.
This commit is contained in:
parent
ef34c3d534
commit
bbf65ae72f
25 changed files with 6053 additions and 23 deletions
4
thirdparty/README.md
vendored
4
thirdparty/README.md
vendored
|
|
@ -1192,6 +1192,10 @@ Files extracted from upstream source:
|
|||
- `unstable/xdg-foreign/xdg-foreign-unstable-v1.xml`
|
||||
- `COPYING`
|
||||
|
||||
The following files are extracted from thirdparty sources:
|
||||
|
||||
- `mesa/wayland-drm.xml`: https://gitlab.freedesktop.org/mesa/mesa/-/blob/mesa-25.3.0/src/egl/wayland/wayland-drm/wayland-drm.xml
|
||||
|
||||
|
||||
## wslay
|
||||
|
||||
|
|
|
|||
189
thirdparty/wayland-protocols/mesa/wayland-drm.xml
vendored
Normal file
189
thirdparty/wayland-protocols/mesa/wayland-drm.xml
vendored
Normal file
|
|
@ -0,0 +1,189 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<protocol name="drm">
|
||||
|
||||
<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>
|
||||
|
||||
<!-- drm support. This object is created by the server and published
|
||||
using the display's global event. -->
|
||||
<interface name="wl_drm" version="2">
|
||||
<enum name="error">
|
||||
<entry name="authenticate_fail" value="0"/>
|
||||
<entry name="invalid_format" value="1"/>
|
||||
<entry name="invalid_name" value="2"/>
|
||||
</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. New codes must not be added,
|
||||
unless directly taken from drm_fourcc.h. -->
|
||||
<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="xyuv8888" value="0x56555958"/>
|
||||
<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"/>
|
||||
<entry name="abgr16f" value="0x48344241"/>
|
||||
<entry name="xbgr16f" value="0x48344258"/>
|
||||
</enum>
|
||||
|
||||
<!-- Call this request with the magic received from drmGetMagic().
|
||||
It will be passed on to the drmAuthMagic() or
|
||||
DRIAuthConnection() call. This authentication must be
|
||||
completed before create_buffer could be used. -->
|
||||
<request name="authenticate">
|
||||
<arg name="id" type="uint"/>
|
||||
</request>
|
||||
|
||||
<!-- Create a wayland buffer for the named DRM buffer. The DRM
|
||||
surface must have a name using the flink ioctl -->
|
||||
<request name="create_buffer">
|
||||
<arg name="id" type="new_id" interface="wl_buffer"/>
|
||||
<arg name="name" type="uint"/>
|
||||
<arg name="width" type="int"/>
|
||||
<arg name="height" type="int"/>
|
||||
<arg name="stride" type="uint"/>
|
||||
<arg name="format" type="uint"/>
|
||||
</request>
|
||||
|
||||
<!-- Create a wayland buffer for the named DRM buffer. The DRM
|
||||
surface must have a name using the flink ioctl -->
|
||||
<request name="create_planar_buffer">
|
||||
<arg name="id" type="new_id" interface="wl_buffer"/>
|
||||
<arg name="name" type="uint"/>
|
||||
<arg name="width" type="int"/>
|
||||
<arg name="height" type="int"/>
|
||||
<arg name="format" type="uint"/>
|
||||
<arg name="offset0" type="int"/>
|
||||
<arg name="stride0" type="int"/>
|
||||
<arg name="offset1" type="int"/>
|
||||
<arg name="stride1" type="int"/>
|
||||
<arg name="offset2" type="int"/>
|
||||
<arg name="stride2" type="int"/>
|
||||
</request>
|
||||
|
||||
<!-- Notification of the path of the drm device which is used by
|
||||
the server. The client should use this device for creating
|
||||
local buffers. Only buffers created from this device should
|
||||
be be passed to the server using this drm object's
|
||||
create_buffer request. -->
|
||||
<event name="device">
|
||||
<arg name="name" type="string"/>
|
||||
</event>
|
||||
|
||||
<event name="format">
|
||||
<arg name="format" type="uint"/>
|
||||
</event>
|
||||
|
||||
<!-- Raised if the authenticate request succeeded -->
|
||||
<event name="authenticated"/>
|
||||
|
||||
<enum name="capability" since="2">
|
||||
<description summary="wl_drm capability bitmask">
|
||||
Bitmask of capabilities.
|
||||
</description>
|
||||
<entry name="prime" value="1" summary="wl_drm prime available"/>
|
||||
</enum>
|
||||
|
||||
<event name="capabilities">
|
||||
<arg name="value" type="uint"/>
|
||||
</event>
|
||||
|
||||
<!-- Version 2 additions -->
|
||||
|
||||
<!-- 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" since="2">
|
||||
<arg name="id" type="new_id" interface="wl_buffer"/>
|
||||
<arg name="name" type="fd"/>
|
||||
<arg name="width" type="int"/>
|
||||
<arg name="height" type="int"/>
|
||||
<arg name="format" type="uint"/>
|
||||
<arg name="offset0" type="int"/>
|
||||
<arg name="stride0" type="int"/>
|
||||
<arg name="offset1" type="int"/>
|
||||
<arg name="stride1" type="int"/>
|
||||
<arg name="offset2" type="int"/>
|
||||
<arg name="stride2" type="int"/>
|
||||
</request>
|
||||
|
||||
</interface>
|
||||
|
||||
</protocol>
|
||||
5
thirdparty/wayland-protocols/stable/linux-dmabuf/README
vendored
Normal file
5
thirdparty/wayland-protocols/stable/linux-dmabuf/README
vendored
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
Linux DMA-BUF protocol
|
||||
|
||||
Maintainers:
|
||||
Pekka Paalanen <pekka.paalanen@collabora.co.uk>
|
||||
Daniel Stone <daniels@collabora.com>
|
||||
218
thirdparty/wayland-protocols/stable/linux-dmabuf/feedback.rst
vendored
Normal file
218
thirdparty/wayland-protocols/stable/linux-dmabuf/feedback.rst
vendored
Normal file
|
|
@ -0,0 +1,218 @@
|
|||
.. Copyright 2021 Simon Ser
|
||||
|
||||
.. contents::
|
||||
|
||||
|
||||
linux-dmabuf feedback introduction
|
||||
==================================
|
||||
|
||||
linux-dmabuf feedback allows compositors and clients to negotiate optimal buffer
|
||||
allocation parameters. This document will assume that the compositor is using a
|
||||
rendering API such as OpenGL or Vulkan and KMS as the presentation API: even if
|
||||
linux-dmabuf feedback isn't restricted to this use-case, it's the most common.
|
||||
|
||||
linux-dmabuf feedback introduces the following concepts:
|
||||
|
||||
1. A main device. This is the render device that the compositor is using to
|
||||
perform composition. Compositors should always be able to display a buffer
|
||||
submitted by a client, so this device can be used as a fallback in case none
|
||||
of the more optimized code-paths work. Clients should allocate buffers such
|
||||
that they can be imported and textured from the main device.
|
||||
|
||||
2. One or more tranches. Each tranche consists of a target device, allocation
|
||||
flags and a set of format/modifier pairs. A tranche can be seen as a set of
|
||||
formats/modifier pairs that are compatible with the target device.
|
||||
|
||||
A tranche can have the ``scanout`` flag. It means that the target device is
|
||||
a KMS device, and that buffers allocated with one of the format/modifier
|
||||
pairs in the tranche are eligible for direct scanout.
|
||||
|
||||
Clients should use the tranches in order to allocate buffers with the most
|
||||
appropriate format/modifier and also to avoid allocating in private device
|
||||
memory when cross-device operations are going to happen.
|
||||
|
||||
linux-dmabuf feedback implementation notes
|
||||
==========================================
|
||||
|
||||
This section contains recommendations for client and compositor implementations.
|
||||
|
||||
For clients
|
||||
-----------
|
||||
|
||||
Clients are expected to either pick a fixed DRM format beforehand, or
|
||||
perform the following steps repeatedly until they find a suitable format.
|
||||
|
||||
Basic clients may only support static buffer allocation on startup. These
|
||||
clients should do the following:
|
||||
|
||||
1. Send a ``get_default_feedback`` request to get global feedback.
|
||||
2. Select the device indicated by ``main_device`` for allocation.
|
||||
3. For each tranche:
|
||||
|
||||
1. If ``tranche_target_device`` doesn't match the allocation device, ignore
|
||||
the tranche.
|
||||
2. Accumulate allocation flags from ``tranche_flags``.
|
||||
3. Accumulate format/modifier pairs received via ``tranche_formats`` in a
|
||||
list.
|
||||
4. When the ``tranche_done`` event is received, try to allocate the buffer
|
||||
with the accumulated list of modifiers and allocation flags. If that
|
||||
fails, proceed with the next tranche. If that succeeds, stop the loop.
|
||||
|
||||
4. Destroy the feedback object.
|
||||
|
||||
Tranches are ordered by preference: the more optimized tranches come first. As
|
||||
such, clients should use the first tranche that happens to work.
|
||||
|
||||
Some clients may have already selected the device they want to use beforehand.
|
||||
These clients can ignore the ``main_device`` event, and ignore tranches whose
|
||||
``tranche_target_device`` doesn't match the selected device. Such clients need
|
||||
to be prepared for the ``wp_linux_buffer_params.create`` request to potentially
|
||||
fail.
|
||||
|
||||
If the client allocates a buffer without specifying explicit modifiers on a
|
||||
device different from the one indicated by ``main_device``, then the client
|
||||
must force a linear layout.
|
||||
|
||||
Some clients might support re-negotiating the buffer format/modifier on the
|
||||
fly. These clients should send a ``get_surface_feedback`` request and keep the
|
||||
feedback object alive after the initial allocation. Each time a new set of
|
||||
feedback parameters is received (ended by the ``done`` event), they should
|
||||
perform the same steps as basic clients described above. They should detect
|
||||
when the optimal allocation parameters didn't change (same
|
||||
format/modifier/flags) to avoid needlessly re-allocating their buffers.
|
||||
|
||||
Some clients might additionally support switching the device used for
|
||||
allocations on the fly. Such clients should send a ``get_surface_feedback``
|
||||
request. For each tranche, select the device indicated by
|
||||
``tranche_target_device`` for allocation. Accumulate allocation flags (received
|
||||
via ``tranche_flags``) and format/modifier pairs (received via
|
||||
``tranche_formats``) as usual. When the ``tranche_done`` event is received, try
|
||||
to allocate the buffer with the accumulated list of modifiers and the
|
||||
allocation flags. Try to import the resulting buffer by sending a
|
||||
``wp_linux_buffer_params.create`` request (this might fail). Repeat with each
|
||||
tranche until an allocation and import succeeds. Each time a new set of
|
||||
feedback parameters is received, they should perform these steps again. They
|
||||
should detect when the optimal allocation parameters didn't change (same
|
||||
device/format/modifier/flags) to avoid needlessly re-allocating their buffers.
|
||||
|
||||
For compositors
|
||||
---------------
|
||||
|
||||
Basic compositors may only support texturing the DMA-BUFs via a rendering API
|
||||
such as OpenGL or Vulkan. Such compositors can send a single tranche as a reply
|
||||
to both ``get_default_feedback`` and ``get_surface_feedback``. Set the
|
||||
``main_device`` to the rendering device. Send the tranche with
|
||||
``tranche_target_device`` set to the rendering device and all of the DRM
|
||||
format/modifier pairs supported by the rendering API. Do not set the
|
||||
``scanout`` flag in the ``tranche_flags`` event.
|
||||
|
||||
Some compositors may support direct scan-out for full-screen surfaces. These
|
||||
compositors can re-send the feedback parameters when a surface becomes
|
||||
full-screen or leaves full-screen mode if the client has used the
|
||||
``get_surface_feedback`` request. The non-full-screen feedback parameters are
|
||||
the same as basic compositors described above. The full-screen feedback
|
||||
parameters have two tranches: one with the format/modifier pairs supported by
|
||||
the KMS plane, with the ``scanout`` flag set in the ``tranche_flags`` event and
|
||||
with ``tranche_target_device`` set to the KMS scan-out device; the other with
|
||||
the rest of the format/modifier pairs (supported for texturing, but not for
|
||||
scan-out), without the ``scanout`` flag set in the ``tranche_flags`` event, and
|
||||
with the ``tranche_target_device`` set to the rendering device.
|
||||
|
||||
Some compositors may support direct scan-out for all surfaces. These
|
||||
compositors can send two tranches for surfaces that become candidates for
|
||||
direct scan-out, similarly to compositors supporting direct scan-out for
|
||||
fullscreen surfaces. When a surface stops being a candidate for direct
|
||||
scan-out, compositors should re-send the feedback parameters optimized for
|
||||
texturing only. The way candidates for direct scan-out are selected is
|
||||
compositor policy, a possible implementation is to select as many surfaces as
|
||||
there are available hardware planes, starting from surfaces closer to the eye.
|
||||
|
||||
Some compositors may support multiple devices at the same time. If the
|
||||
compositor supports rendering with a fixed device and direct scan-out on a
|
||||
secondary device, it may send a separate tranche for surfaces displayed on
|
||||
the secondary device that are candidates for direct scan-out. The
|
||||
``tranche_target_device`` for this tranche will be the secondary device and
|
||||
will not match the ``main_device``.
|
||||
|
||||
Some compositors may support switching their rendering device at runtime or
|
||||
changing their rendering device depending on the surface. When the rendering
|
||||
device changes for a surface, such compositors may re-send the feedback
|
||||
parameters with a different ``main_device``. However there is a risk that
|
||||
clients don't support switching their device at runtime and continue using the
|
||||
previous device. For this reason, compositors should always have a fallback
|
||||
rendering device that they initially send as ``main_device``, such that these
|
||||
clients use said fallback device.
|
||||
|
||||
Compositors should not change the ``main_device`` on-the-fly when explicit
|
||||
modifiers are not supported, because there's a risk of importing buffers
|
||||
with an implicit non-linear modifier as a linear buffer, resulting in
|
||||
misinterpreted buffer contents.
|
||||
|
||||
Compositors should not send feedback parameters if they don't have a fallback
|
||||
path. For instance, compositors shouldn't send a format/modifier supported for
|
||||
direct scan-out but not supported by the rendering API for texturing.
|
||||
|
||||
Compositors can decide to use multiple tranches to describe the allocation
|
||||
parameters optimized for texturing. For example, if there are formats which
|
||||
have a fast texturing path and formats which have a slower texturing path, the
|
||||
compositor can decide to expose two separate tranches.
|
||||
|
||||
Compositors can decide to use intermediate tranches to describe code-paths
|
||||
slower than direct scan-out but faster than texturing. For instance, a
|
||||
compositor could insert an intermediate tranche if it's possible to use a
|
||||
mem2mem device to convert buffers to be able to use scan-out.
|
||||
|
||||
``dev_t`` encoding
|
||||
==================
|
||||
|
||||
The protocol carries ``dev_t`` values on the wire using arrays. A compositor
|
||||
written in C can encode the values as follows:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
struct stat drm_node_stat;
|
||||
struct wl_array dev_array = {
|
||||
.size = sizeof(drm_node_stat.st_rdev),
|
||||
.data = &drm_node_stat.st_rdev,
|
||||
};
|
||||
|
||||
A client can decode the values as follows:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
dev_t dev;
|
||||
assert(dev_array->size == sizeof(dev));
|
||||
memcpy(&dev, dev_array->data, sizeof(dev));
|
||||
|
||||
Because two DRM nodes can refer to the same DRM device while having different
|
||||
``dev_t`` values, clients should use ``drmDevicesEqual`` to compare two
|
||||
devices.
|
||||
|
||||
``format_table`` encoding
|
||||
=========================
|
||||
|
||||
The ``format_table`` event carries a file descriptor containing a list of
|
||||
format + modifier pairs. The list is an array of pairs which can be accessed
|
||||
with this C structure definition:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
struct dmabuf_format_modifier {
|
||||
uint32_t format;
|
||||
uint32_t pad; /* unused */
|
||||
uint64_t modifier;
|
||||
};
|
||||
|
||||
Integration with other APIs
|
||||
===========================
|
||||
|
||||
- libdrm: ``drmGetDeviceFromDevId`` returns a ``drmDevice`` from a device ID.
|
||||
- EGL: the `EGL_EXT_device_drm_render_node`_ extension may be used to query the
|
||||
DRM device render node used by a given EGL display. When unavailable, the
|
||||
older `EGL_EXT_device_drm`_ extension may be used as a fallback.
|
||||
- Vulkan: the `VK_EXT_physical_device_drm`_ extension may be used to query the
|
||||
DRM device used by a given ``VkPhysicalDevice``.
|
||||
|
||||
.. _EGL_EXT_device_drm: https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_device_drm.txt
|
||||
.. _EGL_EXT_device_drm_render_node: https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_device_drm_render_node.txt
|
||||
.. _VK_EXT_physical_device_drm: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_EXT_physical_device_drm.html
|
||||
585
thirdparty/wayland-protocols/stable/linux-dmabuf/linux-dmabuf-v1.xml
vendored
Normal file
585
thirdparty/wayland-protocols/stable/linux-dmabuf/linux-dmabuf-v1.xml
vendored
Normal file
|
|
@ -0,0 +1,585 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<protocol name="linux_dmabuf_v1">
|
||||
|
||||
<copyright>
|
||||
Copyright © 2014, 2015 Collabora, Ltd.
|
||||
|
||||
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.
|
||||
</copyright>
|
||||
|
||||
<interface name="zwp_linux_dmabuf_v1" version="5">
|
||||
<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
|
||||
https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_image_dma_buf_import_modifiers.txt
|
||||
and the Linux DRM sub-system's AddFb2 ioctl.
|
||||
|
||||
This interface offers ways to create generic dmabuf-based wl_buffers.
|
||||
|
||||
Clients can use the get_surface_feedback request to get dmabuf feedback
|
||||
for a particular surface. If the client wants to retrieve feedback not
|
||||
tied to a surface, they can use the get_default_feedback request.
|
||||
|
||||
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.
|
||||
|
||||
However, when the underlying graphics stack fails to deliver the
|
||||
promise, because of e.g. a device hot-unplug which raises internal
|
||||
errors, after the wl_buffer has been successfully created the
|
||||
compositor must not raise protocol errors to the client when dmabuf
|
||||
import later fails.
|
||||
|
||||
To create a wl_buffer from one or more dmabufs, a client creates a
|
||||
zwp_linux_dmabuf_params_v1 object with a zwp_linux_dmabuf_v1.create_params
|
||||
request. All planes required by the intended format are added with
|
||||
the 'add' request. Finally, a 'create' or 'create_immed' request is
|
||||
issued, which has the following outcome depending on the import success.
|
||||
|
||||
The 'create' request,
|
||||
- on success, triggers a 'created' event which provides the final
|
||||
wl_buffer to the client.
|
||||
- on failure, triggers a 'failed' event to convey that the server
|
||||
cannot use the dmabufs received from the client.
|
||||
|
||||
For the 'create_immed' request,
|
||||
- on success, the server immediately imports the added dmabufs to
|
||||
create a wl_buffer. No event is sent from the server in this case.
|
||||
- on failure, the server can choose to either:
|
||||
- terminate the client by raising a fatal error.
|
||||
- mark the wl_buffer as failed, and send a 'failed' event to the
|
||||
client. If the client uses a failed wl_buffer as an argument to any
|
||||
request, the behaviour is compositor implementation-defined.
|
||||
|
||||
For all DRM formats and unless specified in another protocol extension,
|
||||
pre-multiplied alpha is used for pixel values.
|
||||
|
||||
Unless specified otherwise in another protocol extension, implicit
|
||||
synchronization is used. In other words, compositors and clients must
|
||||
wait and signal fences implicitly passed via the DMA-BUF's reservation
|
||||
mechanism.
|
||||
</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 a 'created' or 'failed' event has been
|
||||
received.
|
||||
</description>
|
||||
<arg name="params_id" type="new_id" interface="zwp_linux_buffer_params_v1"
|
||||
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 the
|
||||
zwp_linux_buffer_params_v1::create request.
|
||||
|
||||
Starting version 4, the format event is deprecated and must not be
|
||||
sent by compositors. Instead, use get_default_feedback or
|
||||
get_surface_feedback.
|
||||
</description>
|
||||
<arg name="format" type="uint" summary="DRM_FORMAT code"/>
|
||||
</event>
|
||||
|
||||
<event name="modifier" since="3">
|
||||
<description summary="supported buffer format modifier">
|
||||
This event advertises the formats that the server supports, along with
|
||||
the modifiers supported for each format. All the supported modifiers
|
||||
for 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 format-modifier pairs.
|
||||
|
||||
For legacy support, DRM_FORMAT_MOD_INVALID (that is, modifier_hi ==
|
||||
0x00ffffff and modifier_lo == 0xffffffff) is allowed in this event.
|
||||
It indicates that the server can support the format with an implicit
|
||||
modifier. When a plane has DRM_FORMAT_MOD_INVALID as its modifier, it
|
||||
is as if no explicit modifier is specified. The effective modifier
|
||||
will be derived from the dmabuf.
|
||||
|
||||
A compositor that sends valid modifiers and DRM_FORMAT_MOD_INVALID for
|
||||
a given format supports both explicit modifiers and implicit modifiers.
|
||||
|
||||
For the definition of the format and modifier codes, see the
|
||||
zwp_linux_buffer_params_v1::create and zwp_linux_buffer_params_v1::add
|
||||
requests.
|
||||
|
||||
Starting version 4, the modifier event is deprecated and must not be
|
||||
sent by compositors. Instead, use get_default_feedback or
|
||||
get_surface_feedback.
|
||||
</description>
|
||||
<arg name="format" type="uint" summary="DRM_FORMAT code"/>
|
||||
<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"/>
|
||||
</event>
|
||||
|
||||
<!-- Version 4 additions -->
|
||||
|
||||
<request name="get_default_feedback" since="4">
|
||||
<description summary="get default feedback">
|
||||
This request creates a new wp_linux_dmabuf_feedback object not bound
|
||||
to a particular surface. This object will deliver feedback about dmabuf
|
||||
parameters to use if the client doesn't support per-surface feedback
|
||||
(see get_surface_feedback).
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="zwp_linux_dmabuf_feedback_v1"/>
|
||||
</request>
|
||||
|
||||
<request name="get_surface_feedback" since="4">
|
||||
<description summary="get feedback for a surface">
|
||||
This request creates a new wp_linux_dmabuf_feedback object for the
|
||||
specified wl_surface. This object will deliver feedback about dmabuf
|
||||
parameters to use for buffers attached to this surface.
|
||||
|
||||
If the surface is destroyed before the wp_linux_dmabuf_feedback object,
|
||||
the feedback object becomes inert.
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="zwp_linux_dmabuf_feedback_v1"/>
|
||||
<arg name="surface" type="object" interface="wl_surface"/>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
<interface name="zwp_linux_buffer_params_v1" version="5">
|
||||
<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, an '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"/>
|
||||
<entry name="invalid_wl_buffer" value="7"
|
||||
summary="invalid wl_buffer resulted from importing dmabufs via
|
||||
the create_immed request on given buffer_params"/>
|
||||
</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
|
||||
zwp_linux_buffer_params_v1.
|
||||
|
||||
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.
|
||||
|
||||
Starting from version 4, the invalid_format protocol error is sent if
|
||||
the format + modifier pair was not advertised as supported.
|
||||
|
||||
Starting from version 5, the invalid_format protocol error is sent if
|
||||
all planes don't use the same modifier.
|
||||
|
||||
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" bitfield="true">
|
||||
<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 a '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" enum="flags" 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
|
||||
zwp_linux_buffer_params_v1 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
|
||||
zwp_linux_buffer_params_v1 object.
|
||||
</description>
|
||||
</event>
|
||||
|
||||
<request name="create_immed" since="2">
|
||||
<description summary="immediately create a wl_buffer from the given
|
||||
dmabufs">
|
||||
This asks for immediate creation of a wl_buffer by importing the
|
||||
added dmabufs.
|
||||
|
||||
In case of import success, no event is sent from the server, and the
|
||||
wl_buffer is ready to be used by the client.
|
||||
|
||||
Upon import failure, either of the following may happen, as seen fit
|
||||
by the implementation:
|
||||
- the client is terminated with one of the following fatal protocol
|
||||
errors:
|
||||
- INCOMPLETE, INVALID_FORMAT, INVALID_DIMENSIONS, OUT_OF_BOUNDS,
|
||||
in case of argument errors such as mismatch between the number
|
||||
of planes and the format, bad format, non-positive width or
|
||||
height, or bad offset or stride.
|
||||
- INVALID_WL_BUFFER, in case the cause for failure is unknown or
|
||||
plaform specific.
|
||||
- the server creates an invalid wl_buffer, marks it as failed and
|
||||
sends a 'failed' event to the client. The result of using this
|
||||
invalid wl_buffer as an argument in any request by the client is
|
||||
defined by the compositor implementation.
|
||||
|
||||
This takes the same arguments as a 'create' request, and obeys the
|
||||
same restrictions.
|
||||
</description>
|
||||
<arg name="buffer_id" type="new_id" interface="wl_buffer"
|
||||
summary="id for the newly created wl_buffer"/>
|
||||
<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" enum="flags" summary="see enum flags"/>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
<interface name="zwp_linux_dmabuf_feedback_v1" version="5">
|
||||
<description summary="dmabuf feedback">
|
||||
This object advertises dmabuf parameters feedback. This includes the
|
||||
preferred devices and the supported formats/modifiers.
|
||||
|
||||
The parameters are sent once when this object is created and whenever they
|
||||
change. The done event is always sent once after all parameters have been
|
||||
sent. When a single parameter changes, all parameters are re-sent by the
|
||||
compositor.
|
||||
|
||||
Compositors can re-send the parameters when the current client buffer
|
||||
allocations are sub-optimal. Compositors should not re-send the
|
||||
parameters if re-allocating the buffers would not result in a more optimal
|
||||
configuration. In particular, compositors should avoid sending the exact
|
||||
same parameters multiple times in a row.
|
||||
|
||||
The tranche_target_device and tranche_formats events are grouped by
|
||||
tranches of preference. For each tranche, a tranche_target_device, one
|
||||
tranche_flags and one or more tranche_formats events are sent, followed
|
||||
by a tranche_done event finishing the list. The tranches are sent in
|
||||
descending order of preference. All formats and modifiers in the same
|
||||
tranche have the same preference.
|
||||
|
||||
To send parameters, the compositor sends one main_device event, tranches
|
||||
(each consisting of one tranche_target_device event, one tranche_flags
|
||||
event, tranche_formats events and then a tranche_done event), then one
|
||||
done event.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the feedback object">
|
||||
Using this request a client can tell the server that it is not going to
|
||||
use the wp_linux_dmabuf_feedback object anymore.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<event name="done">
|
||||
<description summary="all feedback has been sent">
|
||||
This event is sent after all parameters of a wp_linux_dmabuf_feedback
|
||||
object have been sent.
|
||||
|
||||
This allows changes to the wp_linux_dmabuf_feedback parameters to be
|
||||
seen as atomic, even if they happen via multiple events.
|
||||
</description>
|
||||
</event>
|
||||
|
||||
<event name="format_table">
|
||||
<description summary="format and modifier table">
|
||||
This event provides a file descriptor which can be memory-mapped to
|
||||
access the format and modifier table.
|
||||
|
||||
The table contains a tightly packed array of consecutive format +
|
||||
modifier pairs. Each pair is 16 bytes wide. It contains a format as a
|
||||
32-bit unsigned integer, followed by 4 bytes of unused padding, and a
|
||||
modifier as a 64-bit unsigned integer. The native endianness is used.
|
||||
|
||||
The client must map the file descriptor in read-only private mode.
|
||||
|
||||
Compositors are not allowed to mutate the table file contents once this
|
||||
event has been sent. Instead, compositors must create a new, separate
|
||||
table file and re-send feedback parameters. Compositors are allowed to
|
||||
store duplicate format + modifier pairs in the table.
|
||||
</description>
|
||||
<arg name="fd" type="fd" summary="table file descriptor"/>
|
||||
<arg name="size" type="uint" summary="table size, in bytes"/>
|
||||
</event>
|
||||
|
||||
<event name="main_device">
|
||||
<description summary="preferred main device">
|
||||
This event advertises the main device that the server prefers to use
|
||||
when direct scan-out to the target device isn't possible. The
|
||||
advertised main device may be different for each
|
||||
wp_linux_dmabuf_feedback object, and may change over time.
|
||||
|
||||
There is exactly one main device. The compositor must send at least
|
||||
one preference tranche with tranche_target_device equal to main_device.
|
||||
|
||||
Clients need to create buffers that the main device can import and
|
||||
read from, otherwise creating the dmabuf wl_buffer will fail (see the
|
||||
wp_linux_buffer_params.create and create_immed requests for details).
|
||||
The main device will also likely be kept active by the compositor,
|
||||
so clients can use it instead of waking up another device for power
|
||||
savings.
|
||||
|
||||
In general the device is a DRM node. The DRM node type (primary vs.
|
||||
render) is unspecified. Clients must not rely on the compositor sending
|
||||
a particular node type. Clients cannot check two devices for equality
|
||||
by comparing the dev_t value.
|
||||
|
||||
If explicit modifiers are not supported and the client performs buffer
|
||||
allocations on a different device than the main device, then the client
|
||||
must force the buffer to have a linear layout.
|
||||
</description>
|
||||
<arg name="device" type="array" summary="device dev_t value"/>
|
||||
</event>
|
||||
|
||||
<event name="tranche_done">
|
||||
<description summary="a preference tranche has been sent">
|
||||
This event splits tranche_target_device and tranche_formats events in
|
||||
preference tranches. It is sent after a set of tranche_target_device
|
||||
and tranche_formats events; it represents the end of a tranche. The
|
||||
next tranche will have a lower preference.
|
||||
</description>
|
||||
</event>
|
||||
|
||||
<event name="tranche_target_device">
|
||||
<description summary="target device">
|
||||
This event advertises the target device that the server prefers to use
|
||||
for a buffer created given this tranche. The advertised target device
|
||||
may be different for each preference tranche, and may change over time.
|
||||
|
||||
There is exactly one target device per tranche.
|
||||
|
||||
The target device may be a scan-out device, for example if the
|
||||
compositor prefers to directly scan-out a buffer created given this
|
||||
tranche. The target device may be a rendering device, for example if
|
||||
the compositor prefers to texture from said buffer.
|
||||
|
||||
The client can use this hint to allocate the buffer in a way that makes
|
||||
it accessible from the target device, ideally directly. The buffer must
|
||||
still be accessible from the main device, either through direct import
|
||||
or through a potentially more expensive fallback path. If the buffer
|
||||
can't be directly imported from the main device then clients must be
|
||||
prepared for the compositor changing the tranche priority or making
|
||||
wl_buffer creation fail (see the wp_linux_buffer_params.create and
|
||||
create_immed requests for details).
|
||||
|
||||
If the device is a DRM node, the DRM node type (primary vs. render) is
|
||||
unspecified. Clients must not rely on the compositor sending a
|
||||
particular node type. Clients cannot check two devices for equality by
|
||||
comparing the dev_t value.
|
||||
|
||||
This event is tied to a preference tranche, see the tranche_done event.
|
||||
</description>
|
||||
<arg name="device" type="array" summary="device dev_t value"/>
|
||||
</event>
|
||||
|
||||
<event name="tranche_formats">
|
||||
<description summary="supported buffer format modifier">
|
||||
This event advertises the format + modifier combinations that the
|
||||
compositor supports.
|
||||
|
||||
It carries an array of indices, each referring to a format + modifier
|
||||
pair in the last received format table (see the format_table event).
|
||||
Each index is a 16-bit unsigned integer in native endianness.
|
||||
|
||||
For legacy support, DRM_FORMAT_MOD_INVALID is an allowed modifier.
|
||||
It indicates that the server can support the format with an implicit
|
||||
modifier. When a buffer has DRM_FORMAT_MOD_INVALID as its modifier, it
|
||||
is as if no explicit modifier is specified. The effective modifier
|
||||
will be derived from the dmabuf.
|
||||
|
||||
A compositor that sends valid modifiers and DRM_FORMAT_MOD_INVALID for
|
||||
a given format supports both explicit modifiers and implicit modifiers.
|
||||
|
||||
Compositors must not send duplicate format + modifier pairs within the
|
||||
same tranche or across two different tranches with the same target
|
||||
device and flags.
|
||||
|
||||
This event is tied to a preference tranche, see the tranche_done event.
|
||||
|
||||
For the definition of the format and modifier codes, see the
|
||||
wp_linux_buffer_params.create request.
|
||||
</description>
|
||||
<arg name="indices" type="array" summary="array of 16-bit indexes"/>
|
||||
</event>
|
||||
|
||||
<enum name="tranche_flags" bitfield="true">
|
||||
<entry name="scanout" value="1" summary="direct scan-out tranche"/>
|
||||
</enum>
|
||||
|
||||
<event name="tranche_flags">
|
||||
<description summary="tranche flags">
|
||||
This event sets tranche-specific flags.
|
||||
|
||||
The scanout flag is a hint that direct scan-out may be attempted by the
|
||||
compositor on the target device if the client appropriately allocates a
|
||||
buffer. How to allocate a buffer that can be scanned out on the target
|
||||
device is implementation-defined.
|
||||
|
||||
This event is tied to a preference tranche, see the tranche_done event.
|
||||
</description>
|
||||
<arg name="flags" type="uint" enum="tranche_flags" summary="tranche flags"/>
|
||||
</event>
|
||||
</interface>
|
||||
|
||||
</protocol>
|
||||
4
thirdparty/wayland-protocols/staging/commit-timing/README
vendored
Normal file
4
thirdparty/wayland-protocols/staging/commit-timing/README
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
Commit Timing Protocol
|
||||
|
||||
Maintainers:
|
||||
Derek Foreman <derek.foreman@collabora.com> (@derekf)
|
||||
124
thirdparty/wayland-protocols/staging/commit-timing/commit-timing-v1.xml
vendored
Normal file
124
thirdparty/wayland-protocols/staging/commit-timing/commit-timing-v1.xml
vendored
Normal file
|
|
@ -0,0 +1,124 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<protocol name="commit_timing_v1">
|
||||
|
||||
<copyright>
|
||||
Copyright © 2023 Valve Corporation
|
||||
|
||||
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.
|
||||
</copyright>
|
||||
|
||||
<interface name="wp_commit_timing_manager_v1" version="1">
|
||||
<description summary="commit timing">
|
||||
When a compositor latches on to new content updates it will check for
|
||||
any number of requirements of the available content updates (such as
|
||||
fences of all buffers being signalled) to consider the update ready.
|
||||
|
||||
This protocol provides a method for adding a time constraint to surface
|
||||
content. This constraint indicates to the compositor that a content
|
||||
update should be presented as closely as possible to, but not before,
|
||||
a specified time.
|
||||
|
||||
This protocol does not change the Wayland property that content
|
||||
updates are applied in the order they are received, even when some
|
||||
content updates contain timestamps and others do not.
|
||||
|
||||
To provide timestamps, this global factory interface must be used to
|
||||
acquire a wp_commit_timing_v1 object for a surface, which may then be
|
||||
used to provide timestamp information for commits.
|
||||
|
||||
Warning! The protocol described in this file is currently in the testing
|
||||
phase. Backward compatible changes may be added together with the
|
||||
corresponding interface version bump. Backward incompatible changes can
|
||||
only be done by creating a new major version of the extension.
|
||||
</description>
|
||||
<enum name="error">
|
||||
<entry name="commit_timer_exists" value="0"
|
||||
summary="commit timer already exists for surface"/>
|
||||
</enum>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="unbind from the commit timing interface">
|
||||
Informs the server that the client will no longer be using
|
||||
this protocol object. Existing objects created by this object
|
||||
are not affected.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<request name="get_timer">
|
||||
<description summary="request commit timer interface for surface">
|
||||
Establish a timing controller for a surface.
|
||||
|
||||
Only one commit timer can be created for a surface, or a
|
||||
commit_timer_exists protocol error will be generated.
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="wp_commit_timer_v1"/>
|
||||
<arg name="surface" type="object" interface="wl_surface"/>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
<interface name="wp_commit_timer_v1" version="1">
|
||||
<description summary="Surface commit timer">
|
||||
An object to set a time constraint for a content update on a surface.
|
||||
</description>
|
||||
|
||||
<enum name="error">
|
||||
<entry name="invalid_timestamp" value="0"
|
||||
summary="timestamp contains an invalid value"/>
|
||||
<entry name="timestamp_exists" value="1"
|
||||
summary="timestamp exists"/>
|
||||
<entry name="surface_destroyed" value="2"
|
||||
summary="the associated surface no longer exists"/>
|
||||
</enum>
|
||||
|
||||
<request name="set_timestamp">
|
||||
<description summary="Specify time the following commit takes effect">
|
||||
Provide a timing constraint for a surface content update.
|
||||
|
||||
A set_timestamp request may be made before a wl_surface.commit to
|
||||
tell the compositor that the content is intended to be presented
|
||||
as closely as possible to, but not before, the specified time.
|
||||
The time is in the domain of the compositor's presentation clock.
|
||||
|
||||
An invalid_timestamp error will be generated for invalid tv_nsec.
|
||||
|
||||
If a timestamp already exists on the surface, a timestamp_exists
|
||||
error is generated.
|
||||
|
||||
Requesting set_timestamp after the commit_timer object's surface is
|
||||
destroyed will generate a "surface_destroyed" error.
|
||||
</description>
|
||||
<arg name="tv_sec_hi" type="uint"
|
||||
summary="high 32 bits of the seconds part of target time"/>
|
||||
<arg name="tv_sec_lo" type="uint"
|
||||
summary="low 32 bits of the seconds part of target time"/>
|
||||
<arg name="tv_nsec" type="uint"
|
||||
summary="nanoseconds part of target time"/>
|
||||
</request>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="Destroy the timer">
|
||||
Informs the server that the client will no longer be using
|
||||
this protocol object.
|
||||
|
||||
Existing timing constraints are not affected by the destruction.
|
||||
</description>
|
||||
</request>
|
||||
</interface>
|
||||
</protocol>
|
||||
4
thirdparty/wayland-protocols/staging/fifo/README
vendored
Normal file
4
thirdparty/wayland-protocols/staging/fifo/README
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
Fifo Protocol
|
||||
|
||||
Maintainers:
|
||||
Derek Foreman <derek.foreman@collabora.com> (@derekf)
|
||||
143
thirdparty/wayland-protocols/staging/fifo/fifo-v1.xml
vendored
Normal file
143
thirdparty/wayland-protocols/staging/fifo/fifo-v1.xml
vendored
Normal file
|
|
@ -0,0 +1,143 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<protocol name="fifo_v1">
|
||||
<copyright>
|
||||
Copyright © 2023 Valve Corporation
|
||||
|
||||
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.
|
||||
</copyright>
|
||||
|
||||
<interface name="wp_fifo_manager_v1" version="1">
|
||||
<description summary="protocol for fifo constraints">
|
||||
When a Wayland compositor considers applying a content update,
|
||||
it must ensure all the update's readiness constraints (fences, etc)
|
||||
are met.
|
||||
|
||||
This protocol provides a way to use the completion of a display refresh
|
||||
cycle as an additional readiness constraint.
|
||||
|
||||
Warning! The protocol described in this file is currently in the testing
|
||||
phase. Backward compatible changes may be added together with the
|
||||
corresponding interface version bump. Backward incompatible changes can
|
||||
only be done by creating a new major version of the extension.
|
||||
</description>
|
||||
|
||||
<enum name="error">
|
||||
<description summary="fatal presentation error">
|
||||
These fatal protocol errors may be emitted in response to
|
||||
illegal requests.
|
||||
</description>
|
||||
<entry name="already_exists" value="0"
|
||||
summary="fifo manager already exists for surface"/>
|
||||
</enum>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="unbind from the manager interface">
|
||||
Informs the server that the client will no longer be using
|
||||
this protocol object. Existing objects created by this object
|
||||
are not affected.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<request name="get_fifo">
|
||||
<description summary="request fifo interface for surface">
|
||||
Establish a fifo object for a surface that may be used to add
|
||||
display refresh constraints to content updates.
|
||||
|
||||
Only one such object may exist for a surface and attempting
|
||||
to create more than one will result in an already_exists
|
||||
protocol error. If a surface is acted on by multiple software
|
||||
components, general best practice is that only the component
|
||||
performing wl_surface.attach operations should use this protocol.
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="wp_fifo_v1"/>
|
||||
<arg name="surface" type="object" interface="wl_surface"/>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
<interface name="wp_fifo_v1" version="1">
|
||||
<description summary="fifo interface">
|
||||
A fifo object for a surface that may be used to add
|
||||
display refresh constraints to content updates.
|
||||
</description>
|
||||
|
||||
<enum name="error">
|
||||
<description summary="fatal error">
|
||||
These fatal protocol errors may be emitted in response to
|
||||
illegal requests.
|
||||
</description>
|
||||
<entry name="surface_destroyed" value="0"
|
||||
summary="the associated surface no longer exists"/>
|
||||
</enum>
|
||||
|
||||
<request name="set_barrier">
|
||||
<description summary="sets the start point for a fifo constraint">
|
||||
When the content update containing the "set_barrier" is applied,
|
||||
it sets a "fifo_barrier" condition on the surface associated with
|
||||
the fifo object. The condition is cleared immediately after the
|
||||
following latching deadline for non-tearing presentation.
|
||||
|
||||
The compositor may clear the condition early if it must do so to
|
||||
ensure client forward progress assumptions.
|
||||
|
||||
To wait for this condition to clear, use the "wait_barrier" request.
|
||||
|
||||
"set_barrier" is double-buffered state, see wl_surface.commit.
|
||||
|
||||
Requesting set_barrier after the fifo object's surface is
|
||||
destroyed will generate a "surface_destroyed" error.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<request name="wait_barrier">
|
||||
<description summary="adds a fifo constraint to a content update">
|
||||
Indicate that this content update is not ready while a
|
||||
"fifo_barrier" condition is present on the surface.
|
||||
|
||||
This means that when the content update containing "set_barrier"
|
||||
was made active at a latching deadline, it will be active for
|
||||
at least one refresh cycle. A content update which is allowed to
|
||||
tear might become active after a latching deadline if no content
|
||||
update became active at the deadline.
|
||||
|
||||
The constraint must be ignored if the surface is a subsurface in
|
||||
synchronized mode. If the surface is not being updated by the
|
||||
compositor (off-screen, occluded) the compositor may ignore the
|
||||
constraint. Clients must use an additional mechanism such as
|
||||
frame callbacks or timestamps to ensure throttling occurs under
|
||||
all conditions.
|
||||
|
||||
"wait_barrier" is double-buffered state, see wl_surface.commit.
|
||||
|
||||
Requesting "wait_barrier" after the fifo object's surface is
|
||||
destroyed will generate a "surface_destroyed" error.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the fifo interface">
|
||||
Informs the server that the client will no longer be using
|
||||
this protocol object.
|
||||
|
||||
Surface state changes previously made by this protocol are
|
||||
unaffected by this object's destruction.
|
||||
</description>
|
||||
</request>
|
||||
</interface>
|
||||
</protocol>
|
||||
4
thirdparty/wayland-protocols/staging/linux-drm-syncobj/README
vendored
Normal file
4
thirdparty/wayland-protocols/staging/linux-drm-syncobj/README
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
Linux DRM syncobj protocol
|
||||
|
||||
Maintainers:
|
||||
Simon Ser <contact@emersion.fr> (@emersion)
|
||||
261
thirdparty/wayland-protocols/staging/linux-drm-syncobj/linux-drm-syncobj-v1.xml
vendored
Normal file
261
thirdparty/wayland-protocols/staging/linux-drm-syncobj/linux-drm-syncobj-v1.xml
vendored
Normal file
|
|
@ -0,0 +1,261 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<protocol name="linux_drm_syncobj_v1">
|
||||
<copyright>
|
||||
Copyright 2016 The Chromium Authors.
|
||||
Copyright 2017 Intel Corporation
|
||||
Copyright 2018 Collabora, Ltd
|
||||
Copyright 2021 Simon Ser
|
||||
|
||||
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.
|
||||
</copyright>
|
||||
|
||||
<description summary="protocol for providing explicit synchronization">
|
||||
This protocol allows clients to request explicit synchronization for
|
||||
buffers. It is tied to the Linux DRM synchronization object framework.
|
||||
|
||||
Synchronization refers to co-ordination of pipelined operations performed
|
||||
on buffers. Most GPU clients will schedule an asynchronous operation to
|
||||
render to the buffer, then immediately send the buffer to the compositor
|
||||
to be attached to a surface.
|
||||
|
||||
With implicit synchronization, ensuring that the rendering operation is
|
||||
complete before the compositor displays the buffer is an implementation
|
||||
detail handled by either the kernel or userspace graphics driver.
|
||||
|
||||
By contrast, with explicit synchronization, DRM synchronization object
|
||||
timeline points mark when the asynchronous operations are complete. When
|
||||
submitting a buffer, the client provides a timeline point which will be
|
||||
waited on before the compositor accesses the buffer, and another timeline
|
||||
point that the compositor will signal when it no longer needs to access the
|
||||
buffer contents for the purposes of the surface commit.
|
||||
|
||||
Linux DRM synchronization objects are documented at:
|
||||
https://dri.freedesktop.org/docs/drm/gpu/drm-mm.html#drm-sync-objects
|
||||
|
||||
Warning! The protocol described in this file is currently in the testing
|
||||
phase. Backward compatible changes may be added together with the
|
||||
corresponding interface version bump. Backward incompatible changes can
|
||||
only be done by creating a new major version of the extension.
|
||||
</description>
|
||||
|
||||
<interface name="wp_linux_drm_syncobj_manager_v1" version="1">
|
||||
<description summary="global for providing explicit synchronization">
|
||||
This global is a factory interface, allowing clients to request
|
||||
explicit synchronization for buffers on a per-surface basis.
|
||||
|
||||
See wp_linux_drm_syncobj_surface_v1 for more information.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy explicit synchronization factory object">
|
||||
Destroy this explicit synchronization factory object. Other objects
|
||||
shall not be affected by this request.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<enum name="error">
|
||||
<entry name="surface_exists" value="0"
|
||||
summary="the surface already has a synchronization object associated"/>
|
||||
<entry name="invalid_timeline" value="1"
|
||||
summary="the timeline object could not be imported"/>
|
||||
</enum>
|
||||
|
||||
<request name="get_surface">
|
||||
<description summary="extend surface interface for explicit synchronization">
|
||||
Instantiate an interface extension for the given wl_surface to provide
|
||||
explicit synchronization.
|
||||
|
||||
If the given wl_surface already has an explicit synchronization object
|
||||
associated, the surface_exists protocol error is raised.
|
||||
|
||||
Graphics APIs, like EGL or Vulkan, that manage the buffer queue and
|
||||
commits of a wl_surface themselves, are likely to be using this
|
||||
extension internally. If a client is using such an API for a
|
||||
wl_surface, it should not directly use this extension on that surface,
|
||||
to avoid raising a surface_exists protocol error.
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="wp_linux_drm_syncobj_surface_v1"
|
||||
summary="the new synchronization surface object id"/>
|
||||
<arg name="surface" type="object" interface="wl_surface"
|
||||
summary="the surface"/>
|
||||
</request>
|
||||
|
||||
<request name="import_timeline">
|
||||
<description summary="import a DRM syncobj timeline">
|
||||
Import a DRM synchronization object timeline.
|
||||
|
||||
If the FD cannot be imported, the invalid_timeline error is raised.
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="wp_linux_drm_syncobj_timeline_v1"/>
|
||||
<arg name="fd" type="fd" summary="drm_syncobj file descriptor"/>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
<interface name="wp_linux_drm_syncobj_timeline_v1" version="1">
|
||||
<description summary="synchronization object timeline">
|
||||
This object represents an explicit synchronization object timeline
|
||||
imported by the client to the compositor.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the timeline">
|
||||
Destroy the synchronization object timeline. Other objects are not
|
||||
affected by this request, in particular timeline points set by
|
||||
set_acquire_point and set_release_point are not unset.
|
||||
</description>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
<interface name="wp_linux_drm_syncobj_surface_v1" version="1">
|
||||
<description summary="per-surface explicit synchronization">
|
||||
This object is an add-on interface for wl_surface to enable explicit
|
||||
synchronization.
|
||||
|
||||
Each surface can be associated with only one object of this interface at
|
||||
any time.
|
||||
|
||||
Explicit synchronization is guaranteed to be supported for buffers
|
||||
created with any version of the linux-dmabuf protocol. Compositors are
|
||||
free to support explicit synchronization for additional buffer types.
|
||||
If at surface commit time the attached buffer does not support explicit
|
||||
synchronization, an unsupported_buffer error is raised.
|
||||
|
||||
As long as the wp_linux_drm_syncobj_surface_v1 object is alive, the
|
||||
compositor may ignore implicit synchronization for buffers attached and
|
||||
committed to the wl_surface. The delivery of wl_buffer.release events
|
||||
for buffers attached to the surface becomes undefined.
|
||||
|
||||
Clients must set both acquire and release points if and only if a
|
||||
non-null buffer is attached in the same surface commit. See the
|
||||
no_buffer, no_acquire_point and no_release_point protocol errors.
|
||||
|
||||
If at surface commit time the acquire and release DRM syncobj timelines
|
||||
are identical, the acquire point value must be strictly less than the
|
||||
release point value, or else the conflicting_points protocol error is
|
||||
raised.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the surface synchronization object">
|
||||
Destroy this surface synchronization object.
|
||||
|
||||
Any timeline point set by this object with set_acquire_point or
|
||||
set_release_point since the last commit may be discarded by the
|
||||
compositor. Any timeline point set by this object before the last
|
||||
commit will not be affected.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<enum name="error">
|
||||
<entry name="no_surface" value="1"
|
||||
summary="the associated wl_surface was destroyed"/>
|
||||
<entry name="unsupported_buffer" value="2"
|
||||
summary="the buffer does not support explicit synchronization"/>
|
||||
<entry name="no_buffer" value="3" summary="no buffer was attached"/>
|
||||
<entry name="no_acquire_point" value="4"
|
||||
summary="no acquire timeline point was set"/>
|
||||
<entry name="no_release_point" value="5"
|
||||
summary="no release timeline point was set"/>
|
||||
<entry name="conflicting_points" value="6"
|
||||
summary="acquire and release timeline points are in conflict"/>
|
||||
</enum>
|
||||
|
||||
<request name="set_acquire_point">
|
||||
<description summary="set the acquire timeline point">
|
||||
Set the timeline point that must be signalled before the compositor may
|
||||
sample from the buffer attached with wl_surface.attach.
|
||||
|
||||
The 64-bit unsigned value combined from point_hi and point_lo is the
|
||||
point value.
|
||||
|
||||
The acquire point is double-buffered state, and will be applied on the
|
||||
next wl_surface.commit request for the associated surface. Thus, it
|
||||
applies only to the buffer that is attached to the surface at commit
|
||||
time.
|
||||
|
||||
If an acquire point has already been attached during the same commit
|
||||
cycle, the new point replaces the old one.
|
||||
|
||||
If the associated wl_surface was destroyed, a no_surface error is
|
||||
raised.
|
||||
|
||||
If at surface commit time there is a pending acquire timeline point set
|
||||
but no pending buffer attached, a no_buffer error is raised. If at
|
||||
surface commit time there is a pending buffer attached but no pending
|
||||
acquire timeline point set, the no_acquire_point protocol error is
|
||||
raised.
|
||||
</description>
|
||||
<arg name="timeline" type="object" interface="wp_linux_drm_syncobj_timeline_v1"/>
|
||||
<arg name="point_hi" type="uint" summary="high 32 bits of the point value"/>
|
||||
<arg name="point_lo" type="uint" summary="low 32 bits of the point value"/>
|
||||
</request>
|
||||
|
||||
<request name="set_release_point">
|
||||
<description summary="set the release timeline point">
|
||||
Set the timeline point that must be signalled by the compositor when it
|
||||
has finished its usage of the buffer attached with wl_surface.attach
|
||||
for the relevant commit.
|
||||
|
||||
Once the timeline point is signaled, and assuming the associated buffer
|
||||
is not pending release from other wl_surface.commit requests, no
|
||||
additional explicit or implicit synchronization with the compositor is
|
||||
required to safely re-use the buffer.
|
||||
|
||||
Note that clients cannot rely on the release point being always
|
||||
signaled after the acquire point: compositors may release buffers
|
||||
without ever reading from them. In addition, the compositor may use
|
||||
different presentation paths for different commits, which may have
|
||||
different release behavior. As a result, the compositor may signal the
|
||||
release points in a different order than the client committed them.
|
||||
|
||||
Because signaling a timeline point also signals every previous point,
|
||||
it is generally not safe to use the same timeline object for the
|
||||
release points of multiple buffers. The out-of-order signaling
|
||||
described above may lead to a release point being signaled before the
|
||||
compositor has finished reading. To avoid this, it is strongly
|
||||
recommended that each buffer should use a separate timeline for its
|
||||
release points.
|
||||
|
||||
The 64-bit unsigned value combined from point_hi and point_lo is the
|
||||
point value.
|
||||
|
||||
The release point is double-buffered state, and will be applied on the
|
||||
next wl_surface.commit request for the associated surface. Thus, it
|
||||
applies only to the buffer that is attached to the surface at commit
|
||||
time.
|
||||
|
||||
If a release point has already been attached during the same commit
|
||||
cycle, the new point replaces the old one.
|
||||
|
||||
If the associated wl_surface was destroyed, a no_surface error is
|
||||
raised.
|
||||
|
||||
If at surface commit time there is a pending release timeline point set
|
||||
but no pending buffer attached, a no_buffer error is raised. If at
|
||||
surface commit time there is a pending buffer attached but no pending
|
||||
release timeline point set, the no_release_point protocol error is
|
||||
raised.
|
||||
</description>
|
||||
<arg name="timeline" type="object" interface="wp_linux_drm_syncobj_timeline_v1"/>
|
||||
<arg name="point_hi" type="uint" summary="high 32 bits of the point value"/>
|
||||
<arg name="point_lo" type="uint" summary="low 32 bits of the point value"/>
|
||||
</request>
|
||||
</interface>
|
||||
</protocol>
|
||||
4
thirdparty/wayland-protocols/staging/tearing-control/README
vendored
Normal file
4
thirdparty/wayland-protocols/staging/tearing-control/README
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
Tearing control protocol
|
||||
|
||||
Maintainers:
|
||||
Xaver Hugl <xaver.hugl@gmail.com> (@Zamundaaa)
|
||||
123
thirdparty/wayland-protocols/staging/tearing-control/tearing-control-v1.xml
vendored
Normal file
123
thirdparty/wayland-protocols/staging/tearing-control/tearing-control-v1.xml
vendored
Normal file
|
|
@ -0,0 +1,123 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<protocol name="tearing_control_v1">
|
||||
<copyright>
|
||||
Copyright © 2021 Xaver Hugl
|
||||
|
||||
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.
|
||||
</copyright>
|
||||
|
||||
<interface name="wp_tearing_control_manager_v1" version="1">
|
||||
<description summary="protocol for tearing control">
|
||||
For some use cases like games or drawing tablets it can make sense to
|
||||
reduce latency by accepting tearing with the use of asynchronous page
|
||||
flips. This global is a factory interface, allowing clients to inform
|
||||
which type of presentation the content of their surfaces is suitable for.
|
||||
|
||||
Graphics APIs like EGL or Vulkan, that manage the buffer queue and commits
|
||||
of a wl_surface themselves, are likely to be using this extension
|
||||
internally. If a client is using such an API for a wl_surface, it should
|
||||
not directly use this extension on that surface, to avoid raising a
|
||||
tearing_control_exists protocol error.
|
||||
|
||||
Warning! The protocol described in this file is currently in the testing
|
||||
phase. Backward compatible changes may be added together with the
|
||||
corresponding interface version bump. Backward incompatible changes can
|
||||
only be done by creating a new major version of the extension.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy tearing control factory object">
|
||||
Destroy this tearing control factory object. Other objects, including
|
||||
wp_tearing_control_v1 objects created by this factory, are not affected
|
||||
by this request.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<enum name="error">
|
||||
<entry name="tearing_control_exists" value="0"
|
||||
summary="the surface already has a tearing object associated"/>
|
||||
</enum>
|
||||
|
||||
<request name="get_tearing_control">
|
||||
<description summary="extend surface interface for tearing control">
|
||||
Instantiate an interface extension for the given wl_surface to request
|
||||
asynchronous page flips for presentation.
|
||||
|
||||
If the given wl_surface already has a wp_tearing_control_v1 object
|
||||
associated, the tearing_control_exists protocol error is raised.
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="wp_tearing_control_v1"/>
|
||||
<arg name="surface" type="object" interface="wl_surface"/>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
<interface name="wp_tearing_control_v1" version="1">
|
||||
<description summary="per-surface tearing control interface">
|
||||
An additional interface to a wl_surface object, which allows the client
|
||||
to hint to the compositor if the content on the surface is suitable for
|
||||
presentation with tearing.
|
||||
The default presentation hint is vsync. See presentation_hint for more
|
||||
details.
|
||||
|
||||
If the associated wl_surface is destroyed, this object becomes inert and
|
||||
should be destroyed.
|
||||
</description>
|
||||
|
||||
<enum name="presentation_hint">
|
||||
<description summary="presentation hint values">
|
||||
This enum provides information for if submitted frames from the client
|
||||
may be presented with tearing.
|
||||
</description>
|
||||
<entry name="vsync" value="0">
|
||||
<description summary="tearing-free presentation">
|
||||
The content of this surface is meant to be synchronized to the
|
||||
vertical blanking period. This should not result in visible tearing
|
||||
and may result in a delay before a surface commit is presented.
|
||||
</description>
|
||||
</entry>
|
||||
<entry name="async" value="1">
|
||||
<description summary="asynchronous presentation">
|
||||
The content of this surface is meant to be presented with minimal
|
||||
latency and tearing is acceptable.
|
||||
</description>
|
||||
</entry>
|
||||
</enum>
|
||||
|
||||
<request name="set_presentation_hint">
|
||||
<description summary="set presentation hint">
|
||||
Set the presentation hint for the associated wl_surface. This state is
|
||||
double-buffered, see wl_surface.commit.
|
||||
|
||||
The compositor is free to dynamically respect or ignore this hint based
|
||||
on various conditions like hardware capabilities, surface state and
|
||||
user preferences.
|
||||
</description>
|
||||
<arg name="hint" type="uint" enum="presentation_hint"/>
|
||||
</request>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy tearing control object">
|
||||
Destroy this surface tearing object and revert the presentation hint to
|
||||
vsync. The change will be applied on the next wl_surface.commit.
|
||||
</description>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
</protocol>
|
||||
5
thirdparty/wayland-protocols/unstable/linux-explicit-synchronization/README
vendored
Normal file
5
thirdparty/wayland-protocols/unstable/linux-explicit-synchronization/README
vendored
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
Linux explicit synchronization (dma-fence) protocol
|
||||
|
||||
Maintainers:
|
||||
Daniel Stone <daniels@collabora.com>
|
||||
Alexandros Frantzis <alexandros.frantzis@collabora.com>
|
||||
|
|
@ -0,0 +1,256 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<protocol name="zwp_linux_explicit_synchronization_unstable_v1">
|
||||
|
||||
<copyright>
|
||||
Copyright 2016 The Chromium Authors.
|
||||
Copyright 2017 Intel Corporation
|
||||
Copyright 2018 Collabora, Ltd
|
||||
|
||||
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.
|
||||
</copyright>
|
||||
|
||||
<interface name="zwp_linux_explicit_synchronization_v1" version="2">
|
||||
<description summary="protocol for providing explicit synchronization">
|
||||
This global is a factory interface, allowing clients to request
|
||||
explicit synchronization for buffers on a per-surface basis.
|
||||
|
||||
See zwp_linux_surface_synchronization_v1 for more information.
|
||||
|
||||
This interface is derived from Chromium's
|
||||
zcr_linux_explicit_synchronization_v1.
|
||||
|
||||
Warning! The protocol described in this file is experimental and
|
||||
backward incompatible changes may be made. Backward compatible changes
|
||||
may be added together with the corresponding interface version bump.
|
||||
Backward incompatible changes are done by bumping the version number in
|
||||
the protocol and interface names and resetting the interface version.
|
||||
Once the protocol is to be declared stable, the 'z' prefix and the
|
||||
version number in the protocol and interface names are removed and the
|
||||
interface version number is reset.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy explicit synchronization factory object">
|
||||
Destroy this explicit synchronization factory object. Other objects,
|
||||
including zwp_linux_surface_synchronization_v1 objects created by this
|
||||
factory, shall not be affected by this request.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<enum name="error">
|
||||
<entry name="synchronization_exists" value="0"
|
||||
summary="the surface already has a synchronization object associated"/>
|
||||
</enum>
|
||||
|
||||
<request name="get_synchronization">
|
||||
<description summary="extend surface interface for explicit synchronization">
|
||||
Instantiate an interface extension for the given wl_surface to provide
|
||||
explicit synchronization.
|
||||
|
||||
If the given wl_surface already has an explicit synchronization object
|
||||
associated, the synchronization_exists protocol error is raised.
|
||||
|
||||
Graphics APIs, like EGL or Vulkan, that manage the buffer queue and
|
||||
commits of a wl_surface themselves, are likely to be using this
|
||||
extension internally. If a client is using such an API for a
|
||||
wl_surface, it should not directly use this extension on that surface,
|
||||
to avoid raising a synchronization_exists protocol error.
|
||||
</description>
|
||||
|
||||
<arg name="id" type="new_id"
|
||||
interface="zwp_linux_surface_synchronization_v1"
|
||||
summary="the new synchronization interface id"/>
|
||||
<arg name="surface" type="object" interface="wl_surface"
|
||||
summary="the surface"/>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
<interface name="zwp_linux_surface_synchronization_v1" version="2">
|
||||
<description summary="per-surface explicit synchronization support">
|
||||
This object implements per-surface explicit synchronization.
|
||||
|
||||
Synchronization refers to co-ordination of pipelined operations performed
|
||||
on buffers. Most GPU clients will schedule an asynchronous operation to
|
||||
render to the buffer, then immediately send the buffer to the compositor
|
||||
to be attached to a surface.
|
||||
|
||||
In implicit synchronization, ensuring that the rendering operation is
|
||||
complete before the compositor displays the buffer is an implementation
|
||||
detail handled by either the kernel or userspace graphics driver.
|
||||
|
||||
By contrast, in explicit synchronization, dma_fence objects mark when the
|
||||
asynchronous operations are complete. When submitting a buffer, the
|
||||
client provides an acquire fence which will be waited on before the
|
||||
compositor accesses the buffer. The Wayland server, through a
|
||||
zwp_linux_buffer_release_v1 object, will inform the client with an event
|
||||
which may be accompanied by a release fence, when the compositor will no
|
||||
longer access the buffer contents due to the specific commit that
|
||||
requested the release event.
|
||||
|
||||
Each surface can be associated with only one object of this interface at
|
||||
any time.
|
||||
|
||||
In version 1 of this interface, explicit synchronization is only
|
||||
guaranteed to be supported for buffers created with any version of the
|
||||
wp_linux_dmabuf buffer factory. Version 2 additionally guarantees
|
||||
explicit synchronization support for opaque EGL buffers, which is a type
|
||||
of platform specific buffers described in the EGL_WL_bind_wayland_display
|
||||
extension. Compositors are free to support explicit synchronization for
|
||||
additional buffer types.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy synchronization object">
|
||||
Destroy this explicit synchronization object.
|
||||
|
||||
Any fence set by this object with set_acquire_fence since the last
|
||||
commit will be discarded by the server. Any fences set by this object
|
||||
before the last commit are not affected.
|
||||
|
||||
zwp_linux_buffer_release_v1 objects created by this object are not
|
||||
affected by this request.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<enum name="error">
|
||||
<entry name="invalid_fence" value="0"
|
||||
summary="the fence specified by the client could not be imported"/>
|
||||
<entry name="duplicate_fence" value="1"
|
||||
summary="multiple fences added for a single surface commit"/>
|
||||
<entry name="duplicate_release" value="2"
|
||||
summary="multiple releases added for a single surface commit"/>
|
||||
<entry name="no_surface" value="3"
|
||||
summary="the associated wl_surface was destroyed"/>
|
||||
<entry name="unsupported_buffer" value="4"
|
||||
summary="the buffer does not support explicit synchronization"/>
|
||||
<entry name="no_buffer" value="5"
|
||||
summary="no buffer was attached"/>
|
||||
</enum>
|
||||
|
||||
<request name="set_acquire_fence">
|
||||
<description summary="set the acquire fence">
|
||||
Set the acquire fence that must be signaled before the compositor
|
||||
may sample from the buffer attached with wl_surface.attach. The fence
|
||||
is a dma_fence kernel object.
|
||||
|
||||
The acquire fence is double-buffered state, and will be applied on the
|
||||
next wl_surface.commit request for the associated surface. Thus, it
|
||||
applies only to the buffer that is attached to the surface at commit
|
||||
time.
|
||||
|
||||
If the provided fd is not a valid dma_fence fd, then an INVALID_FENCE
|
||||
error is raised.
|
||||
|
||||
If a fence has already been attached during the same commit cycle, a
|
||||
DUPLICATE_FENCE error is raised.
|
||||
|
||||
If the associated wl_surface was destroyed, a NO_SURFACE error is
|
||||
raised.
|
||||
|
||||
If at surface commit time the attached buffer does not support explicit
|
||||
synchronization, an UNSUPPORTED_BUFFER error is raised.
|
||||
|
||||
If at surface commit time there is no buffer attached, a NO_BUFFER
|
||||
error is raised.
|
||||
</description>
|
||||
<arg name="fd" type="fd" summary="acquire fence fd"/>
|
||||
</request>
|
||||
|
||||
<request name="get_release">
|
||||
<description summary="release fence for last-attached buffer">
|
||||
Create a listener for the release of the buffer attached by the
|
||||
client with wl_surface.attach. See zwp_linux_buffer_release_v1
|
||||
documentation for more information.
|
||||
|
||||
The release object is double-buffered state, and will be associated
|
||||
with the buffer that is attached to the surface at wl_surface.commit
|
||||
time.
|
||||
|
||||
If a zwp_linux_buffer_release_v1 object has already been requested for
|
||||
the surface in the same commit cycle, a DUPLICATE_RELEASE error is
|
||||
raised.
|
||||
|
||||
If the associated wl_surface was destroyed, a NO_SURFACE error
|
||||
is raised.
|
||||
|
||||
If at surface commit time there is no buffer attached, a NO_BUFFER
|
||||
error is raised.
|
||||
</description>
|
||||
<arg name="release" type="new_id" interface="zwp_linux_buffer_release_v1"
|
||||
summary="new zwp_linux_buffer_release_v1 object"/>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
<interface name="zwp_linux_buffer_release_v1" version="1">
|
||||
<description summary="buffer release explicit synchronization">
|
||||
This object is instantiated in response to a
|
||||
zwp_linux_surface_synchronization_v1.get_release request.
|
||||
|
||||
It provides an alternative to wl_buffer.release events, providing a
|
||||
unique release from a single wl_surface.commit request. The release event
|
||||
also supports explicit synchronization, providing a fence FD for the
|
||||
client to synchronize against.
|
||||
|
||||
Exactly one event, either a fenced_release or an immediate_release, will
|
||||
be emitted for the wl_surface.commit request. The compositor can choose
|
||||
release by release which event it uses.
|
||||
|
||||
This event does not replace wl_buffer.release events; servers are still
|
||||
required to send those events.
|
||||
|
||||
Once a buffer release object has delivered a 'fenced_release' or an
|
||||
'immediate_release' event it is automatically destroyed.
|
||||
</description>
|
||||
|
||||
<event name="fenced_release" type="destructor">
|
||||
<description summary="release buffer with fence">
|
||||
Sent when the compositor has finalised its usage of the associated
|
||||
buffer for the relevant commit, providing a dma_fence which will be
|
||||
signaled when all operations by the compositor on that buffer for that
|
||||
commit have finished.
|
||||
|
||||
Once the fence has signaled, and assuming the associated buffer is not
|
||||
pending release from other wl_surface.commit requests, no additional
|
||||
explicit or implicit synchronization is required to safely reuse or
|
||||
destroy the buffer.
|
||||
|
||||
This event destroys the zwp_linux_buffer_release_v1 object.
|
||||
</description>
|
||||
<arg name="fence" type="fd" summary="fence for last operation on buffer"/>
|
||||
</event>
|
||||
|
||||
<event name="immediate_release" type="destructor">
|
||||
<description summary="release buffer immediately">
|
||||
Sent when the compositor has finalised its usage of the associated
|
||||
buffer for the relevant commit, and either performed no operations
|
||||
using it, or has a guarantee that all its operations on that buffer for
|
||||
that commit have finished.
|
||||
|
||||
Once this event is received, and assuming the associated buffer is not
|
||||
pending release from other wl_surface.commit requests, no additional
|
||||
explicit or implicit synchronization is required to safely reuse or
|
||||
destroy the buffer.
|
||||
|
||||
This event destroys the zwp_linux_buffer_release_v1 object.
|
||||
</description>
|
||||
</event>
|
||||
</interface>
|
||||
|
||||
</protocol>
|
||||
Loading…
Add table
Add a link
Reference in a new issue