wlroots 0.15.0 Release highlights: - A new experimental Vulkan renderer has been merged (manually enabled with `WLR_RENDERER=vulkan`). - A new scene-graph API has been introduced to enable more code-sharing between compositors. - Large parts of the backend and renderer APIs have been refactored and reworked. - The `drm-lease-v1` protocol has been implemented. - Feedback support has been added to the `linux-dmabuf-unstable-v1` implementation, unlocking many zero-copy and multi-GPU optimizations and features. - The `wlr_output` rendering API now supports 10bpc and 16bpc formats. - The DRM backend now supports hotplugging secondary GPUs at runtime. - `wlr_region` and `wlr_box` are now stable APIs. Full changelog below. Andri Yngvason (2): screencopy: Use output->front_buffer instead of wlr_output_export_dmabuf screencopy: Handle shm copy in commit event handler Anthony Super (1): Add error handling to backend creation Chris Chamberlain (2): backend: fix return value of attempt_drm_backend backend/drm: add wlr_drm_backend_monitor Cole Mickens (1): egl: use alts for EGL_EXT_device_enum, if missing David Rosca (1): seat: Only resend keyboard/pointer enter to focused clients Demi Marie Obenour (1): Improve wlr_drm_format documentation Devin J. Pohly (9): scene: add node reparent function scene: ensure node cannot be reparented below itself scene: make graph loops fatal when debugging scene: stricter assertions on reparent scene: iterate nodes instead of surfaces when rendering scene: add RECT node type scene: replace surface_at() with node_at() examples/scene-graph: demonstrate scene_rect node type scene: remove redundant empty-region check in render_texture() Dylan Araps (1): util/time: make NSEC_PER_SEC static Elyes HAOUAS (1): Fix spelling errors Guido Günther (3): xwayland: Allow to retrieve _NET_STARTUP_ID xwayland: Allow to retrieve startup-id via _NET_STARTUP_INFO xdg-activation: Allow to submit tokens Haelwenn (lanodan) Monnier (3): render/pixman/renderer.c: Fix memory-leak in create_buffer render/egl.c: Fix memory leaks in egl_create backend/drm/legacy.c: Fix memory leak in drm_legacy_crtc_set_gamma Hubert Hirtz (1): Fix a typo in CONTRIBUTING.md Isaac Freund (15): layer-shell: replace close() with destroy() tinywl: simplify logic for sending pointer events scene: assert that node != sibling in place above/below scene: add functions to place node on top/bottom output: fix leak of wlr_drm_format text-input/input-method: handle strdup() failure text-input: fix type of send_preedit_string() args wlr_drag: emit destroy after wl_data_device.leave tinywl: use wlr_scene scene: send surface enter/leave output events scene: add primary output to wlr_scene_surface scene: add wlr_scene_send_frame_done() tinywl: use wlr_scene_send_frame_done() scene: fix wlr_scene_send_frame_done() API scene: add wlr_scene_set_presentation() Jan Beich (2): backend: drop unconditional and unused <libinput.h> render: completely disable gles2 if requested but libEGL is found John Lindgren (1): Insert new outputs at the end of the list Jonathan Wong (1): Added whitespace between "output" and "(not" Joshua Ashton (2): render/vulkan: Use image view swizzles instead of shader hack render/vulkan: Optimize vertex shader José Expósito (8): protocol/meson: bump wayland-protocols requirement to 1.23 pointer: add hold pointer event definition build: check if libinput supports hold gestures backend/libinput: send hold gesture events backend/wayland: send hold gesture events cursor: emit hold gesture events wlr_pointer_gestures: update protocol to version 2 wlr_pointer_gestures: hold gestures (protocol v3) Kirill Primak (34): surface: don't cache frame callback lists util: add wlr_addon wlr_outputs: add wlr_addon_set wlr_output_layout: use wlr_addons util/addon: find both by owner and impl surface: fix place_below handling util/box: introduce wlr_fbox_transform() surface: fix wlr_surface_get_buffer_source_box() subsurface: unlock surface on destroy surface: cache frame callback lists again surface: move subsurface lists to state surface: rename impl and its functions surface: change surface_finalize_state() to surface_finalize_pending() surface: inline surface_commit_pending() xdg popup: move function to a file it belongs to xdg-toplevel: refactor configure/state flow xdg-surface: simplify configure mechanism xdg surface: check adding configure_idle for NULL layer-shell: refactor configure/state flow layer-shell: add `committed` bitmask xdg-surface: add pending state xdg-shell: remove redundant NULL buffer check layer-shell: move NULL buffer check to role precommit handler xdg-decoration: refactor configure/state flow output: disallow NULL event for wlr_output_send_present() output: add presented flag to presentation event presentation-time: don't send presented on discard presentation-time: use a surface addon CONTRIBUTING.md: add CoC section surface: fix damage transformation subsurface: simplify and fix parent commit handling subsurface: apply position change at the right moment surface: fix non-buffer damage handling subsurface: don't add to parent list immediately Manuel Stoeckl (7): render/pixel-format: add a few 10-bit and FP16 formats render/gles2: hide shm formats without GL support render/gles2: add a few 10-bit and FP16 formats output: lift up output format fallback logic output: use XRGB8888 format instead of ARGB8888 output: Add function to set preferred render format output: remove XRGB8888 cursor fallback format MarkusVolk (1): backend.c: do not try to explicitly clean up the libinput backend Michele Sorcinelli (1): xwayland: do not free cursor in handle_server_ready() Moon Sungjoon (1): backend/wayland: improve wayland input device name Quantum (3): viewporter: remove crop and scale state upon destruction scene: fix compile error in release builds Fix uninitialized variable errors in release mode Raphael Robatsch (1): util/token: don't leak /dev/urandom fd to children Roman Gilg (1): backend/headless: unlink input device on destroy Ronan Pigott (3): xdg-activation-v1: enable compositors to request their own tokens xdg-activation-v1: add data field and emit token destroy events backend/wayland: use xdga client activation Rouven Czerwinski (6): backend/drm: return true on test if no crtc output: check output enabled before sending frame Revert "backend/drm: Check if output is enabled before sending frame event" backend/drm: try to allocate crtc for formats linux-dmabuf-v1: filter out LINEAR if implicit linux-dmabuf-v1: fix implicit check Simon Ser (288): build: bump version to 0.15.0 backend/drm: rename page_flip_handler to handle_page_flip render/egl: remove stale wlr_egl_export_image_to_dmabuf decl render/egl: make most functions private xwayland: improve startup log message build: use meson.global_build_root() ci: remove -Dlibseat from Alpine build ci: make Meson warnings fatal Drop WLR_VERSION_API_* surface: remove SURFACE_VERSION surface: make wlr_subsurface_create private pointer: document event data types touch: document event data types surface: accept commits with buffer size not divisible by scale render/egl: replace wlr_egl_create with wlr_egl_create_with_drm_fd Remove unused wlr_list.h includes util/array: add array_remove_at backend/libinput: stop using wlr_list internally tablet: stop using wlr_list Drop wlr_list tablet-v2: fix pad and tool object versions buffer: introduce wlr_readonly_data_buffer render: use wlr_readonly_data_buffer in wlr_texture_from_pixels render: drop wlr_renderer_impl.texture_from_pixels buffer: add wlr_dmabuf_buffer render: use wlr_dmabuf_buffer in wlr_texture_from_dmabuf render: drop wlr_renderer_impl.texture_from_dmabuf buffer: make enum wlr_buffer_cap public backend/libinput: use wl_array for wlr_libinput_tablet.tools surface: allow locking pending state in commit handler Remove reference to the announce mailing list region: stabilize interface region: drop leftover reference to the mailing list Revert "backend/drm: populate cursor plane's current_fb" backend/drm: don't clear pending cursor FB on failed commit xcursor: improve documentation Add a stub wl_drm implementation drm: add support for DMA-BUFs buffer: handle wl_drm buffers render/gles2: use wlr_drm for wl_drm implementation render: remove wl_drm support from wlr_renderer render/egl: remove EGL_WL_bind_wayland_display support buffer: remove renderer param from wlr_resource_get_buffer_size buffer: stop sending wl_buffer.release events from wlr_client_buffer buffer: unify texture creation in wlr_client_buffer_import output: detach buffer from renderer before commit output-damage: fix output swapchain handling touch: add frame event backend/libinput: send touch frame events backend/wayland: send touch frame events backend/x11: send touch frame events cursor: add touch frame event seat: add wlr_seat_touch_{send,notify}_frame Fix invalid uses of wl_array_for_each backend/drm: force linear layout for multi-GPU buffers backend/drm: stop using drm_surface_make_current in drm_surface_blit backend/drm: add test_only arg to wlr_drm_interface.crtc_commit backend/drm: move legacy-specific checks to legacy.c backend/drm: remove backend arg from wlr_drm_interface.crtc_commit buffer: rename wlr_client_buffer variables to client_buffer buffer: stop using source resource in wlr_client_buffer_apply_damage buffer: add wlr_client_buffer.source buffer: stop using resource in client_buffer_get_dmabuf buffer: drop wlr_client_buffer.resource render/egl: rename wlr_egl.exts to better match Khronos render/gles2: rename wlr_egl.exts to better match Khronos render/gles2: set has_alpha for DMA-BUFs render/gles2: disable blending opportunistically buffer: drop resource arg from wlr_client_buffer_create output: add generic wlr_output_export_dmabuf implementation backend/headless: remove wlr_output_impl.export_dmabuf backend/drm: remove wlr_output_impl.export_dmabuf output: remove wlr_output_impl.export_dmabuf backend/wayland: properly cleanup wlr_wl_pointer backend/drm: fix NULL data in handle_drm_event buffer: re-use wlr_shm_client_buffer backend/drm: stop restoring CRTCs on exit backend/drm: add DRM_MODE_CONNECTOR_USB to conn_get_name render: drop wlr_renderer_impl.init_wl_display render/egl: set EGL_IMAGE_PRESERVED_KHR render/egl: add support for EGL_EXT_device_drm_render_node xwayland: simplify argv filling logic xwayland: embed wlr_xwayland_server_options in server struct output: fallback to XRGB in output_pick_format backend/drm: implement get_primary_formats output: use pending resolution when allocating swapchain output: allocate and attach empty buffer on modeset output: fallback to modifier-less allocation on modeset test failure backend/drm: allow legacy scan-out if FB props match backend/drm: remove primary swapchain backend/drm: remove SCANOUT check in drm_connector_test backend/drm: drop drm_surface_{make,unset}_current backend/drm: drop get_renderer implementation backend/drm: stop initializing renderer for parent backend backend/drm: fix wrong type for get_cursor_format return values backend/noop: drop attach_render/rollback_render output: drop wlr_output_impl.{attach,rollback}_render output-damage: stop using enum wlr_output_state_buffer_type output: drop wlr_output_state.buffer_type render/pixel-format: add some 24 and 16-bit formats render/gles2: add support for some 24 and 16-bit formats backend/drm: preserve mode order from kernel render/pixel_format: add more formats for Pixman render/pixman/pixel_format: add more formats output: try skipping buffer allocation if the backend allows it backend/drm: require buffer on modeset in drm_connector_test examples/fullscreen-shell: remove unused render_data.view field build: remove "." from include dirs seat: allow compositors to not load a keymap ci: add smoke test backend/drm: add proper error handling to wlr_drm_backend_create backend/drm: always perform a test commit in drm_connector_test surface: kill wlr_surface.previous surface: drop surface_state_copy buffer: add addon set render/gles2: make wlr_gles2_buffer an addon render/gles2: make wlr_gles2_texture a wlr_buffer addon backend/drm: use addon for wlr_drm_fb backend/drm: add support for FB_DAMAGE_CLIPS backend: unify startup messages backend/drm: generate CVT reduced modes backend/{drm,libinput}: exclude headers when disabled Move allocator stuff into new directory render/egl: reopen DRM node for GBM backend/drm: introduce wlr_drm_bo_handle_table Introduce new scene-graph API examples/scene-graph: new example scene: add wlr_scene_node_toggle scene: allow nodes to have arbitrary parents scene: add user data pointer to wlr_scene_node scene: add wlr_scene_node_surface_at contributing: add new section about commit log contributing: use references for links contributing: clone wlroots fork with SSH contributing: turn remaining links into refs Link to gamja for web chat render/allocator: re-open GBM FD render/allocator/gbm: fix create() docs for FD ownership build: add subproject fallback for wayland build: add subproject fallback for wayland-protocols contributing: don't reference issues in commit first line render/allocator: use legacy authentication for primary nodes backend/drm: handle drm_surface_blit errors render/allocator/gbm: add log message for gbm_bo_get_fd_for_plane util/shm: add allocate_shm_file_pair keyboard: add wlr_keyboard.keymap_fd seat: avoid copying the keymap for each client subsurface: rename wlr_subsurface_state to wlr_subsurface_parent_state subsurface: move parent link to state buffer: take a wlr_buffer in wlr_client_buffer_apply_damage buffer: make wlr_client_buffer_apply_damage return a bool viewporter: add doc comment explaining compositor requirements viewporter: hide wlr_viewport surface: ensure buffer is reset to NULL in surface_state_move surface: drop wlr_surface_state.buffer_resource surface: fix abort on NULL buffer attach backend/drm: rename enum wlr_drm_connector_state to status backend/drm: introduce wlr_drm_connector_state backend/drm: fix crash on VT switch backend/drm: drop unused arg from get_possible_crtcs backend/drm: drop drm_connector_init_renderer output-damage: fix damage on modeset backend/drm: drop attempt_enable_needs_modeset backend/drm: drop wlr_drm_connector.desired_mode scene: fix wlr_scene_render_output offset scene: add scene outputs scene: add wlr_scene_output_commit scene: add wlr_scene_node_coords scene: add damage tracking support examples/scene-graph: use wlr_scene_output scene: move source to subdir scene: add wlr_scene_attach_output_layout buffer: add data_ptr access flags ci: switch to seatd-launch scene: add wlr_scene_tree surface: add addon set scene: add wlr_scene_subsurface_tree_create build: simplify get_variable calls backend/drm: add support for panel orientation scene: drop default case in wlr_scene_node_at scene: unify intersection logic in wlr_scene_node_at scene: add wlr_scene_buffer util/box: introduce wlr_fbox_empty scene: add wlr_scene_buffer_set_source_box scene: add scene_node_get_size helper scene: use scene_node_get_size in wlr_scene_node_at scene: add wlr_scene_buffer_set_dest_size scene: add wlr_scene_buffer_set_transform backend: create renderer and allocator in wlr_backend_autocreate xdg-shell: introduce wlr_xdg_surface.current xdg-shell: rename wlr_xdg_surface.next_configure_serial xdg-shell: stop clearing wlr_xdg_surface state on unmap render/drm_format_set: add wlr_drm_format_has Require INVALID for implicit format modifiers backend/drm: fail on explicit modifier in drmModeAddFB2 render/egl: always add LINEAR to supported modifiers render/drm_format_set: remove special LINEAR case Revert "render/drm_format_set: remove special LINEAR case" Revert "render/egl: always add LINEAR to supported modifiers" Revert "backend/drm: fail on explicit modifier in drmModeAddFB2" Revert "Require INVALID for implicit format modifiers" Revert "render/drm_format_set: add wlr_drm_format_has" render/allocator: use render node if available in reopen_drm_node render/allocator: use empty DRM lease to re-open node scene: remove surface commit listener when node is destroyed render/vulkan: check vulkan-headers dependency presentation-time: remove unused field scene: add wlr_scene_output_for_each_surface scene: add support for direct scan-out output: split into multiple files xdg-foreign-v2: use error enum output: refuse to enable with zero mode readme: refresh dependencies backend/drm: add entry for Valve EDID vendor backend/x11: fix code style in get_touchpoint_from_x11_touch_id scene: inline subsurface_tree_destroy sceeencopy-v1: listen to output destroy in capture_output backend/drm: get rid of BO handle table output: fix stack variable lifetime in wlr_output_send_present backend/drm: avoid creating empty FB_DAMAGE_CLIPS prop ci: add .gitlab-ci.yml s/GitHub/GitLab/ xwayland: add support for -noTouchPointerEmulation backend/session: introduce wlr_device_change_event backend/drm: handle per-connector hotplug events scene: fix calloc size mismatch export-dmabuf-v1: stop using wlr_output_export_dmabuf screencopy-v1: stop using wlr_output_export_dmabuf output: drop wlr_output_export_dmabuf linux-dmabuf-v1: properly validate flags Remove support for DMA-BUF flags output: add wlr_output_init_render output: fix renderer buffer cap sanity check in wlr_output_init_render Introduce WLR_DEVICE_LEASE events backend/drm: introduce wlr_drm_lease drm-lease-v1: listen to lease destroy event backend/drm: scan leases on uevent linux-dmabuf-v1: hide wlr_linux_buffer_params_v1 backend/wayland: report parent presentation clock input-device: remove wlr_input_device.link render/vulkan: quiet glslangValidator docs/env_vars: drop WLR_DIRECT_TTY render: pick DRM FD in autocreate render/allocator: fallback to renderer DRM FD in autocreate backend/headless: stop picking a DRM FD render: introduce WLR_RENDER_DRM_DEVICE backend/headless: drop wlr_headless_backend_create_with_renderer scene: add wlr_scene_xdg_surface_create render/drm_format_set: add wlr_drm_format_has Require INVALID for implicit format modifiers backend/drm: fail on explicit modifier in drmModeAddFB2 render/egl: always add LINEAR to supported modifiers render/drm_format_set: remove special LINEAR case backend/drm: always add LINEAR to supported modifiers render: add DMA-BUF docs scene: add support for viewporter backend/drm: poison buffers which cannot be scanned out output: destroy swapchain when disabled output: don't leave dangling cursor_front_buffer output: fix typo in wlr_output_impl.get_primary_formats docs output: add wlr_output_get_primary_formats scene: add wlr_scene_get_scene_output render/egl: store IMG_context_priority in wlr_egl render/egl: add wlr_egl_create_with_context render/pixman: advertise MOD_INVALID instead of MOD_LINEAR render/egl: improve modifier support detection output: fix modifier stripping readme: update wrapper libraries link render/drm-format-set: add wlr_drm_format_set_intersect output: add wlr_output_event_commit.buffer export-dmabuf-v1: use wlr_output_event_commit.buffer screencopy-v1: use wlr_output_event_commit.buffer output: drop front_buffer render: add wlr_renderer_init_wl_shm linux-dmabuf-v1: implement v4 linux-dmabuf-v1: add per-surface feedback build: move wayland-client dep to backend/wayland/ examples/layer-shell: remove wlroots dependency examples: remove unnecessary wlroots deps for clients examples: remove unnecessary partial_dependency() call output: introduce wlr_output_set_name Fix incorrect %zd formatting directives output: add support for protocol interface version 4 util/global: remove wl_display arg from wlr_global_destroy_safe backend/drm: use drmModeFormatModifierBlobIterNext backend/drm: use drmCloseBufferHandle build: add subproject fallback for libdrm backend/wayland: add basic linux-dmabuf feedback support Simon Zeni (36): types/wlr_box: remove unused wlr_box_from_pixman_box32 and wlr_box_rotated_bounds functions move wlr_box from /types to /util util/box: stabilize interface types/wlr_buffer: split wlr_client_buffer_import function types/wlr_surface: get buffer size from wlr_buffer_import types/wlr_buffer: remove wlr_resource_get_buffer_size types/wlr_buffer: remove wlr_renderer argument from wlr_buffer_from_resource types/wlr_buffer: introduce wlr_buffer_resource_interface types/wlr_buffer: create custom wlr_buffer from wl_resource render/wlr_texture: put wlr_texture_from_buffer into the public API render/egl: initialize wlr_egl with EGL_PLATFORM_DEVICE_EXT backend/drm: implement drm lease function backend/drm: introduce wlr_drm_backend_get_non_master_fd protocol/meson: bump wayland-protocols requirement to 1.22 types: introduce wlr_drm_lease_v1 types/buffer: make {begin,end}_data_ptr_access part of the public API backend/multi: implement get_buffer_caps render/allocator: make wlr_allocator part of the public API examples: init wlr_output with allocator and renderer tinywl: autocreate allocator and init output backend: remove backend ensure renderer and allocator check backend: remove backend_get_allocator types/wlr_screencopy_v1: use renderer from output types/wlr_scene: use renderer from wlr_output backend/x11: get renderer from wlr_x11_output backend/headless: don't store the parent renderer backend/drm: stop initializing backend renderer backend/multi: remove backend_get_renderer backend: remove wlr_backend_get_renderer backend/multi: add asserts in wlr_multi_backend_add backend: fix attempt_backend_by_name multi backend self insertion tinywl: init output render before commit tinywl: build with meson if examples option is enabled ci/archlinux: enable address and undefined sanitizers backend: remove noop backend types/wlr_drm_lease_v1: add NULL check to drm lease resource destroy Stacy Harper (1): layer-shell: don't set committed flag if the property didn't change Tadeo Kondrak (2): input-method-unstable-v2: Add error for surface with existing role Implement input_method_v2 popups Tudor Brindus (3): input/pointer: try harder to not send duplicate motion events input/tablet: fix `wl_array_for_each` usage on tablet proximity xwm: do not restack surfaces on activation Vyivel (2): render/pixman: fix texture_is_opaque() input/pointer: send axis source once per frame ayaka (1): backend: make DRM and libinput backends optional buffet (1): Update loc count in readme fwsmit (1): examples/foreign-toplevel: fix toplevel not being freed muradm (1): backend: wait for session to become active nyorain (1): render/vulkan: add Vulkan renderer tiosgz (4): for_each_surface: only iterate mapped surfaces surface_at: check if surfaces are mapped scene/subsurface_tree: hide unmapped subsurfaces Fix wlr_scene_node_lower_to_bottom yuiiio (1): render/egl: fix typo Érico Nogueira (1): docs: mention WLR_RENDERER=vulkan.