linux_dmabuf_v1

factory for creating dmabuf-based wl_buffers

This interface offers ways to create generic dmabuf-based wl_buffers.

For more information about dmabuf, see: https://www.kernel.org/doc/html/next/userspace-api/dma-buf-alloc-exchange.html

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.

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.

destroy()
unbind the factory

Objects created through this interface, especially wl_buffers, will remain valid.

create_params(params_id: new_id<zwp_linux_buffer_params_v1>)
Argument
Type
Description
params_idnew_id<zwp_linux_buffer_params_v1>
the new temporary
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.

get_default_feedback(id: new_id<zwp_linux_dmabuf_feedback_v1>)
Argument
Type
Description
idnew_id<zwp_linux_dmabuf_feedback_v1>
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).

get_surface_feedback(id: new_id<zwp_linux_dmabuf_feedback_v1>, surface: object<wl_surface>)
Argument
Type
Description
idnew_id<zwp_linux_dmabuf_feedback_v1>
surfaceobject<wl_surface>
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.

format(format: uint)
Argument
Type
Description
formatuint
DRM_FORMAT code
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.

modifier
Deprecated since 4since 3
modifier(format: uint, modifier_hi: uint, modifier_lo: uint)
Argument
Type
Description
formatuint
DRM_FORMAT code
modifier_hiuint
high 32 bits of layout modifier
modifier_louint
low 32 bits of layout modifier
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.


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 only be set once; subsequent calls with a plane index which has already been set will result in a plane_set error being generated.

destroy()
delete this object, used or not

Cleans up the temporary data sent to the server for dmabuf-based wl_buffer creation.

add(fd: fd, plane_idx: uint, offset: uint, stride: uint, modifier_hi: uint, modifier_lo: uint)
Argument
Type
Description
fdfd
dmabuf fd
plane_idxuint
plane index
offsetuint
offset in bytes
strideuint
stride in bytes
modifier_hiuint
high 32 bits of layout modifier
modifier_louint
low 32 bits of layout modifier
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.

create(width: int, height: int, format: uint, flags: uint<zwp_linux_buffer_params_v1.flags>)
Argument
Type
Description
widthint
base plane width in pixels
heightint
base plane height in pixels
formatuint
DRM_FORMAT code
flagsuint<zwp_linux_buffer_params_v1.flags>
see enum flags
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.

create_immed(buffer_id: new_id<wl_buffer>, width: int, height: int, format: uint, flags: uint<zwp_linux_buffer_params_v1.flags>)
Argument
Type
Description
buffer_idnew_id<wl_buffer>
id for the newly created wl_buffer
widthint
base plane width in pixels
heightint
base plane height in pixels
formatuint
DRM_FORMAT code
flagsuint<zwp_linux_buffer_params_v1.flags>
see enum flags
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 platform 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.

created(buffer: new_id<wl_buffer>)
Argument
Type
Description
buffernew_id<wl_buffer>
the newly created wl_buffer
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.

failed()
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.

Argument
Value
Description
already_used0
the dmabuf_batch object has already been used to create a wl_buffer
plane_idx1
plane index out of bounds
plane_set2
the plane index was already set
incomplete3
missing or too many planes to create a buffer
invalid_format4
format not supported
invalid_dimensions5
invalid width or height
out_of_bounds6
offset + stride * height goes out of dmabuf bounds
invalid_wl_buffer7
invalid wl_buffer resulted from importing dmabufs via the create_immed request on given buffer_params
Argument
Value
Description
y_invert1
contents are y-inverted
interlaced2
content is interlaced
bottom_first4
bottom field first

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.

destroy()
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.

done()
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.

format_table(fd: fd, size: uint)
Argument
Type
Description
fdfd
table file descriptor
sizeuint
table size, in bytes
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.

main_device(device: array)
Argument
Type
Description
devicearray
device dev_t value
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.

tranche_done()
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.

tranche_target_device(device: array)
Argument
Type
Description
devicearray
device dev_t value
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.

tranche_formats(indices: array)
Argument
Type
Description
indicesarray
array of 16-bit indexes
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.

Argument
Type
Description
flagsuint<zwp_linux_dmabuf_feedback_v1.tranche_flags>
tranche flags
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.

tranche_flags { scanout } 
Argument
Value
Description
scanout1
direct scan-out tranche

Compositor Support

Mutter
Mutter
48.0
KWin
KWin
6.4
Sway
Sway
1.11
COSMIC
COSMIC
0.1
Hyprland
Hyprland
0.48
niri
25.02
Weston
Weston
14
Labwc
Labwc
0.8.3
Cage
Cage
0.2.0
Wayfire
Wayfire
0.9.0
GameScope
GameScope
3.15.14
Jay
1.10.0
Mir
Mir
2.19
Treeland
Treeland
0.5.20
Louvre
Louvre
2.14.1
zwp_linux_dmabuf_v1
5
5
4
5
5
5
5
4
4
4
4
5
3
4
5

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.

ext_image_copy_capture_v1

image capturing into client buffers

This protocol allows clients to ask the compositor to capture image sources such as outputs and toplevels into user submitted buffers.

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.

manager to inform clients and begin capturing

This object is a manager which offers requests to start capturing from a source.

capture an image capture source

Create a capturing session for an image capture source.

If the paint_cursors option is set, cursors shall be composited onto the captured frame. The cursor must not be composited onto the frame if this flag is not set.

If the options bitfield is invalid, the invalid_option protocol error is sent.

create_pointer_cursor_session(session: new_id<ext_image_copy_capture_cursor_session_v1>, source: object<ext_image_capture_source_v1>, pointer: object<wl_pointer>)
capture the pointer cursor of an image capture source

Create a cursor capturing session for the pointer of an image capture source.

destroy()
destroy the manager

Destroy the manager object.

Other objects created via this interface are unaffected.

error { invalid_option } 
Argument
Value
Description
invalid_option1
invalid option flag
options { paint_cursors } 
Argument
Value
Description
paint_cursors1
paint cursors onto captured frames

image copy capture session

This object represents an active image copy capture session.

After a capture session is created, buffer constraint events will be emitted from the compositor to tell the client which buffer types and formats are supported for reading from the session. The compositor may re-send buffer constraint events whenever they change.

To advertise buffer constraints, the compositor must send in no particular order: zero or more shm_format and dmabuf_format events, zero or one dmabuf_device event, and exactly one buffer_size event. Then the compositor must send a done event.

When the client has received all the buffer constraints, it can create a buffer accordingly, attach it to the capture session using the attach_buffer request, set the buffer damage using the damage_buffer request and then send the capture request.

create_frame(frame: new_id<ext_image_copy_capture_frame_v1>)
Argument
Type
Description
framenew_id<ext_image_copy_capture_frame_v1>
create a frame

Create a capture frame for this session.

At most one frame object can exist for a given session at any time. If a client sends a create_frame request before a previous frame object has been destroyed, the duplicate_frame protocol error is raised.

destroy()
delete this object

Destroys the session. This request can be sent at any time by the client.

This request doesn't affect ext_image_copy_capture_frame_v1 objects created by this object.

buffer_size(width: uint, height: uint)
Argument
Type
Description
widthuint
buffer width
heightuint
buffer height
image capture source dimensions

Provides the dimensions of the source image in buffer pixel coordinates.

The client must attach buffers that match this size.

shm_format(format: uint<wl_shm.format>)
Argument
Type
Description
formatuint<wl_shm.format>
shm format
shm buffer format

Provides the format that must be used for shared-memory buffers.

This event may be emitted multiple times, in which case the client may choose any given format.

dmabuf_device(device: array)
Argument
Type
Description
devicearray
device dev_t value
dma-buf device

This event advertises the device buffers must be allocated on for dma-buf buffers.

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.

dmabuf_format(format: uint, modifiers: array)
Argument
Type
Description
formatuint
drm format code
modifiersarray
drm format modifiers
dma-buf format

Provides the format that must be used for dma-buf buffers.

The client may choose any of the modifiers advertised in the array of 64-bit unsigned integers.

This event may be emitted multiple times, in which case the client may choose any given format.

done()
all constraints have been sent

This event is sent once when all buffer constraint events have been sent.

The compositor must always end a batch of buffer constraint events with this event, regardless of whether it sends the initial constraints or an update.

stopped()
session is no longer available

This event indicates that the capture session has stopped and is no longer available. This can happen in a number of cases, e.g. when the underlying source is destroyed, if the user decides to end the image capture, or if an unrecoverable runtime error has occurred.

The client should destroy the session after receiving this event.

error { duplicate_frame } 
Argument
Value
Description
duplicate_frame1
create_frame sent before destroying previous frame

image capture frame

This object represents an image capture frame.

The client should attach a buffer, damage the buffer, and then send a capture request.

If the capture is successful, the compositor must send the frame metadata (transform, damage, presentation_time in any order) followed by the ready event.

If the capture fails, the compositor must send the failed event.

destroy()
destroy this object

Destroys the frame. This request can be sent at any time by the client.

attach_buffer(buffer: object<wl_buffer>)
Argument
Type
Description
bufferobject<wl_buffer>
attach buffer to session

Attach a buffer to the session.

The wl_buffer.release request is unused.

The new buffer replaces any previously attached buffer.

This request must not be sent after capture, or else the already_captured protocol error is raised.

Unless specified otherwise by a protocol extension, the values stored by the compositor in the wl_buffer use pre-multiplied alpha, are pre-multiplied in electrical values, use an implementation-defined color space, and use an implementation-defined transfer function.

damage_buffer(x: int, y: int, width: int, height: int)
Argument
Type
Description
xint
region x coordinate
yint
region y coordinate
widthint
region width
heightint
region height
damage buffer

Apply damage to the buffer which is to be captured next. This request may be sent multiple times to describe a region.

The client indicates the accumulated damage since this wl_buffer was last captured. During capture, the compositor will update the buffer with at least the union of the region passed by the client and the region advertised by ext_image_copy_capture_frame_v1.damage.

When a wl_buffer is captured for the first time, or when the client doesn't track damage, the client must damage the whole buffer.

This is for optimisation purposes. The compositor may use this information to reduce copying.

These coordinates originate from the upper left corner of the buffer.

If x or y are strictly negative, or if width or height are negative or zero, the invalid_buffer_damage protocol error is raised.

This request must not be sent after capture, or else the already_captured protocol error is raised.

capture()
capture a frame

Capture a frame.

Unless this is the first successful captured frame performed in this session, the compositor may wait an indefinite amount of time for the source content to change before performing the copy.

This request may only be sent once, or else the already_captured protocol error is raised. A buffer must be attached before this request is sent, or else the no_buffer protocol error is raised.

transform(transform: uint<wl_output.transform>)
Argument
Type
Description
transformuint<wl_output.transform>
buffer transform

This event is sent before the ready event and holds the transform that the compositor has applied to the buffer contents.

damage(x: int, y: int, width: int, height: int)
Argument
Type
Description
xint
damage x coordinate
yint
damage y coordinate
widthint
damage width
heightint
damage height
buffer damaged region

This event is sent before the ready event. It may be generated multiple times to describe a region.

The first captured frame in a session will always carry full damage. Subsequent frames' damaged regions describe which parts of the buffer have changed since the last ready event.

These coordinates originate in the upper left corner of the buffer.

presentation_time(tv_sec_hi: uint, tv_sec_lo: uint, tv_nsec: uint)
Argument
Type
Description
tv_sec_hiuint
high 32 bits of the seconds part of the timestamp
tv_sec_louint
low 32 bits of the seconds part of the timestamp
tv_nsecuint
nanoseconds part of the timestamp
presentation time of the frame

This event indicates the time at which the frame is presented to the output in system monotonic time. This event is sent before the ready event.

The timestamp is expressed as tv_sec_hi, tv_sec_lo, tv_nsec triples, each component being an unsigned 32-bit value. Whole seconds are in tv_sec which is a 64-bit value combined from tv_sec_hi and tv_sec_lo, and the additional fractional part in tv_nsec as nanoseconds. Hence, for valid timestamps tv_nsec must be in [0, 999999999].

ready()
frame is available for reading

Called as soon as the frame is copied, indicating it is available for reading.

The buffer may be re-used by the client after this event.

After receiving this event, the client must destroy the object.

capture failed

This event indicates that the attempted frame copy has failed.

After receiving this event, the client must destroy the object.

Argument
Value
Description
no_buffer1
capture sent without attach_buffer
invalid_buffer_damage2
invalid buffer damage
already_captured3
capture request has been sent
failure_reason { unknown, buffer_constraints, stopped } 
Argument
Value
Description
unknown0
unknown runtime error

An unspecified runtime error has occurred. The client may retry.

buffer_constraints1
buffer constraints mismatch

The buffer submitted by the client doesn't match the latest session constraints. The client should re-allocate its buffers and retry.

stopped2
session is no longer available

The session has stopped. See ext_image_copy_capture_session_v1.stopped.


cursor capture session

This object represents a cursor capture session. It extends the base capture session with cursor-specific metadata.

destroy()
delete this object

Destroys the session. This request can be sent at any time by the client.

This request doesn't affect ext_image_copy_capture_frame_v1 objects created by this object.

get_capture_session(session: new_id<ext_image_copy_capture_session_v1>)
Argument
Type
Description
sessionnew_id<ext_image_copy_capture_session_v1>
get image copy capturer session

Gets the image copy capture session for this cursor session.

The session will produce frames of the cursor image. The compositor may pause the session when the cursor leaves the captured area.

This request must not be sent more than once, or else the duplicate_session protocol error is raised.

enter()
cursor entered captured area

Sent when a cursor enters the captured area. It shall be generated before the "position" and "hotspot" events when and only when a cursor enters the area.

The cursor enters the captured area when the cursor image intersects with the captured area. Note, this is different from e.g. wl_pointer.enter.

leave()
cursor left captured area

Sent when a cursor leaves the captured area. No "position" or "hotspot" event is generated for the cursor until the cursor enters the captured area again.

position(x: int, y: int)
Argument
Type
Description
xint
position x coordinates
yint
position y coordinates
position changed

Cursors outside the image capture source do not get captured and no event will be generated for them.

The given position is the position of the cursor's hotspot and it is relative to the main buffer's top left corner in transformed buffer pixel coordinates. The coordinates may be negative or greater than the main buffer size.

hotspot(x: int, y: int)
Argument
Type
Description
xint
hotspot x coordinates
yint
hotspot y coordinates
hotspot changed

The hotspot describes the offset between the cursor image and the position of the input device.

The given coordinates are the hotspot's offset from the origin in buffer coordinates.

Clients should not apply the hotspot immediately: the hotspot becomes effective when the next ext_image_copy_capture_frame_v1.ready event is received.

Compositors may delay this event until the client captures a new frame.

Argument
Value
Description
duplicate_session1
get_capture_session sent twice

Compositor Support

Mutter
Mutter
48.0
KWin
KWin
6.4
Sway
Sway
1.11
COSMIC
COSMIC
0.1
Hyprland
Hyprland
0.48
niri
25.02
Weston
Weston
14
Labwc
Labwc
0.8.3
Cage
Cage
0.2.0
Wayfire
Wayfire
0.9.0
GameScope
GameScope
3.15.14
Jay
1.10.0
Mir
Mir
2.19
Treeland
Treeland
0.5.20
Louvre
Louvre
2.14.1
ext_image_copy_capture_manager_v1
x
x
1
x
x
x
x
x
x
x
x
1
x
x
x

Copyright © 2021-2023 Andri Yngvason Copyright © 2024 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.

single_pixel_buffer_v1

single pixel buffer factory

This protocol extension allows clients to create single-pixel buffers.

Compositors supporting this protocol extension should also support the viewporter protocol extension. Clients may use viewporter to scale a single-pixel buffer to a desired size.

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.

global factory for single-pixel buffers

The wp_single_pixel_buffer_manager_v1 interface is a factory for single-pixel buffers.

destroy()
destroy the manager

Destroy the wp_single_pixel_buffer_manager_v1 object.

The child objects created via this interface are unaffected.

create_u32_rgba_buffer(id: new_id<wl_buffer>, r: uint, g: uint, b: uint, a: uint)
Argument
Type
Description
idnew_id<wl_buffer>
ruint
value of the buffer's red channel
guint
value of the buffer's green channel
buint
value of the buffer's blue channel
auint
value of the buffer's alpha channel
create a 1×1 buffer from 32-bit RGBA values

Create a single-pixel buffer from four 32-bit RGBA values.

The width and height of the buffer are 1.


Compositor Support

Mutter
Mutter
48.0
KWin
KWin
6.4
Sway
Sway
1.11
COSMIC
COSMIC
0.1
Hyprland
Hyprland
0.48
niri
25.02
Weston
Weston
14
Labwc
Labwc
0.8.3
Cage
Cage
0.2.0
Wayfire
Wayfire
0.9.0
GameScope
GameScope
3.15.14
Jay
1.10.0
Mir
Mir
2.19
Treeland
Treeland
0.5.20
Louvre
Louvre
2.14.1
wp_single_pixel_buffer_manager_v1
1
1
1
1
1
x
1
1
1
1
x
1
x
x
1

Copyright © 2022 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.