Skip to content
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.