Commit graph

5878 commits

Author SHA1 Message Date
Consolatis
1e345c74c3 xcursors: Alias existing cursor defaults to cursor-spec cursor names
wlr_xcursor_get_resize_name() returns cursor-spec [1] based names
but the default cursor icons shipped in include/xcursor/cursor_data.h
use traditional X cursor names instead.

Compositors that use wlr_xcursor_get_resize_name() to resolve an edge
to a cursor icon name may thus be unable to render appropriate cursor
icons for users that don't have a cursor-spec compliant cursor theme
installed on their system or have it installed in an unusual place.

This patch adds cursor-spec cursor icon name aliases.

[1] https://www.freedesktop.org/wiki/Specifications/cursor-spec/

(cherry picked from commit 4097eb20f3)
2023-02-01 14:42:25 +01:00
Simon Ser
bd54e24f4c xdg-shell: reset added/committed flag on unmap
When a client attaches a NULL buffer to its wl_surface, it's
unmapped. This resets the xdg_surface in its initial state. An
extra NULL commit makes the compositor send an initial configure
event.

Note, wlr_xdg_toplevel.added is separate from wlr_xdg_surface.added.

Closes: https://github.com/swaywm/sway/issues/7397
(cherry picked from commit e69dd909f7)
2023-01-31 17:16:59 +01:00
Simon Ser
821fb28266 backend/drm: set "max bpc" property based on pixel format
Since 1d581656c7 ("backend/drm: set "max bpc" to the max") we
set the "max bpc" property to the maximum value. The kernel driver
is supposed to clamp this value depending on hardware capabilities.

All kernel drivers lower the value depending on the GPU capabilities.
However, none of the drivers lower the value depending on the DP-MST
link capabilities. Thus, enabling a 4k@60Hz mode can fail on some
DP-MST setups due to the "max bpc" property.

Additionally, it's not a good idea to unconditionally set "max bpc"
to the max. A high bpc consumes more lanes and more clock speed,
which means higher power consumption and the busy lanes cannot be
used for something else (e.g. other data transfers on a USB-C cable).

For now, let's tie the "max bpc" to the pixel format of the buffer.
Introduce a heuristic to make "high bit-depth buffer" a synonym of
"I want the best quality".

This is not perfect: a "max bpc" higher than 8 might be desirable
for pixel formats with a color depth of 8 bits, for instance when
the color management KMS properties are used. But we don't really
support that yet, so let's leave this for later.

Closes: https://github.com/swaywm/sway/issues/7367
(cherry picked from commit d36dd96e8d)
2023-01-31 17:16:59 +01:00
Simon Ser
3b36b960c2 render/vulkan: fix vkCmdClearAttachments validation error
Skip clears with an empty scissor.

Fixes the following validation error:

    00:00:09.734 [wlr] [render/vulkan/vulkan.c:61] Validation Error: [ VUID-vkCmdClearAttachments-rect-02682 ] Object 0: handle = 0x62600001b100, type = VK_OBJECT_TYPE_COMMAND_BUFFER; | MessageID = 0xadbd476f | CmdClearAttachments(): pRects[0].rect.extent.width is zero. The Vulkan spec states: The rect member of each element of pRects must have an extent.width greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-vkCmdClearAttachments-rect-02682) (VUID-vkCmdClearAttachments-rect-02682)

(cherry picked from commit 27e057319a)
2023-01-27 13:53:19 -05:00
Simon Ser
628d601820 backend/drm: disable all CRTCs after VT switch
When the user switches away from the VT where wlroots is running,
the new DRM master may mutate the KMS state in an arbitrary manner.
For instance, let's say wlroots uses the following connector/CRTC
mapping:

- CRTC 42 drives connector DP-1
- CRTC 43 drives connector DP-2

Then the new DRM master may swap the mapping like so:

- CRTC 42 drives connector DP-2
- CRTC 43 drives connector DP-1

wlroots needs to restore its own state when the user switches back.
Some state is attached to wlr_drm_crtc (e.g. current FB), so reading
back and adopting the CRTC/connector mapping left by the previous DRM
master would be complicated (this was the source of other bugs in the
past, see [1]).

With the previous logic, wlroots merely tries to restore the state
of each connector one after the other. This fails in the scenario
described above: the kernel refuses to use CRTC 42 for DP-1, because
that CRTC is already in-use for DP-2.

Unfortunately with the legacy uAPI it's not possible to restore the
state in one go. We need to support both legacy and atomic uAPIs, so
let's fix the bug for the legacy uAPI first, and then improve the
situation for the atomic uAPI as a second step [2].

We need to disable the CRTCs we're going to switch the connectors for.
This sounds complicated, so let's just disable all CRTCs to simplify.
This causes a black screen because of the on/off modesets, but makes
VT switch much more reliable, so I'll take it.

[1]: c6d8a11d2c
[2]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3794

Closes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3342
2023-01-18 14:10:35 -05:00
llyyr
31b5fcf64e render/vulkan: use correct source offset in read_pixels
(cherry picked from commit 10e16db738)
2023-01-18 12:27:05 +01:00
Kirill Primak
9eb79782bc backend/x11: fix delta_discrete value
Fixes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3563
(cherry picked from commit 9c7db7124e)
2023-01-16 14:21:15 +03:00
Simon Ser
ad5175118b backend/x11: fix initial value of wlr_x11_buffer.n_busy
We lock the buffer there, so we need to initialize the n_busy
count to 1 as well.

Closes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3556
(cherry picked from commit bc8260f377)
2023-01-11 11:10:24 +00:00
Kirill Primak
27a0b8b74f xwayland/xwm: unpair even if surface is NULL
This is a backport of a922428c41
which partially reverts 32daa43a45.

Fixes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3561
2023-01-09 15:58:46 +03:00
Simon Ser
0911a41f17 build: bump version to 0.16.1 2022-12-25 16:50:12 +01:00
bi4k8
88897e69a3 cursor: compare to scaled coords
(cherry picked from commit 790fb93794)
2022-12-22 16:31:34 +01:00
Alexander Orzechowski
fe7e7a1431 wlr_drm: Add missing wlr_buffer import
(cherry picked from commit ec846adb54)
2022-12-09 10:51:00 +01:00
Alexander Orzechowski
1b440dec2e wlr_scene: Expand damage cull region with fractional scales
(cherry picked from commit 32d00984e1)
2022-12-08 11:01:06 +01:00
Simon Ser
8cf1bd5582 backend/drm: fix VRR test
We were calling drm_connector_supports_vrr() before
drm_connector_alloc_crtc(). Thus, when an output is currently off,
the VRR test would always fail, because it checks that the
vrr_enabled CRTC prop exists.

(cherry picked from commit 90a6c7b7e1)
2022-12-07 15:11:46 +01:00
Simon Ser
cdd510a65c backend/x11: ensure buffers are released on shutdown
(cherry picked from commit afe1ae4479)
2022-12-07 15:11:35 +01:00
Simon Ser
14b58a5b3a backend/wayland: ensure buffers are released on shutdown
destroy_wl_buffer() is called from backend_destroy(). We need to
ensure the wlr_buffer is unlocked when we're waiting for a
wl_buffer.release event from the parent compositor.

(cherry picked from commit 378f471d29)
2022-12-07 15:11:35 +01:00
Kirill Primak
d3f3474a59 scene: fix output damage expansion condition
Now, it is checked whether an output pixel corresponds to an integer
number of buffer pixels; if it doesn't, the region is altered to take
this into account.

(cherry picked from commit 5477ad7d90)
2022-12-07 15:07:53 +01:00
Simon Ser
59205cd93e build: exclude <wlr/types/wlr_drm_lease_v1.h> without DRM backend
When the DRM backend is disabled, so is the DRM lease protocol.
Prevent the header from being installed in that case.

(cherry picked from commit ab6607b950)
2022-12-07 15:07:28 +01:00
Simon Ser
5f24c36d30 backend: error out when missing DRM and libinput in wlr_backend_autocreate()
Instead of returning an empty multi backend, fail with a clear
error when both the DRM and libinput backends are disabled.

(cherry picked from commit fb4fb3bac2)
2022-12-07 15:06:29 +01:00
Simon Ser
f1bea43ccc Revert "compositor: enforce surface destruction order"
This reverts commit c09d3450d4.

This doesn't play well with the Xwayland surface role.
2022-11-30 15:58:08 +01:00
Simon Zeni
de5e091996 types/wlr_seat: finish keyboard_state during wlr_seat_destroy
(cherry picked from commit 0611c10909)
2022-11-29 15:45:35 -05:00
Johan Malm
e0fe72ffdd scene/layer_shell_v1.c: remove redundant comment
(cherry picked from commit 338e0a3976)
2022-11-29 21:14:44 +03:00
Johan Malm
4892082836 scene/layer_shell_v1.c: set exclusive zone correctly
...when only one edge is anchored.

The layer-shell protocol specifies that a positive exclusive-zone value is
'meaningful' if the surface is anchored to either:

1. one edge
2. one edge and both perpendicular edges.

For example, if you wish to position a layer-shell client along the top
edge and make it exclusive, you should be able to either set anchor=TOP or
anchor=TOP|LEFT|RIGHT. It appears that many panels/bars use the latter
approach (anchor to an edge and also both perpendicular edges) which is
probably why this has not been reported previously.

This patch adds support for the first case and thereby makes exclusive
zone behaviour consistent with the protocol and also with sway's extant
layer-shell implementation.

(cherry picked from commit 8e80432a72)
2022-11-29 21:14:41 +03:00
Guido Günther
724bc296f5 seat/pointer: Initialize low_res_value
Fixes

    In file included from /usr/include/wayland-server-core.h:32,
                     from ../types/seat/wlr_seat_pointer.c:6:
    In function 'wl_fixed_from_double',
        inlined from 'wlr_seat_pointer_send_axis' at ../types/seat/wlr_seat_pointer.c:367:6:
    /usr/include/wayland-util.h:641:17: error: 'low_res_value' may be used uninitialized [-Werror=maybe-uninitialized]
      641 |         u.d = d + (3LL << (51 - 8));
          |               ~~^~~~~~~~~~~~~~~~~~~
    ../types/seat/wlr_seat_pointer.c: In function 'wlr_seat_pointer_send_axis':
    ../types/seat/wlr_seat_pointer.c:329:16: note: 'low_res_value' was declared here
      329 |         double low_res_value;
          |                ^~~~~~~~~~~~~
2022-11-24 22:05:44 +00:00
Simon Ser
9c54451482 backend/drm: fix FPE when disabling output
Fixes: 65836ce357 ("backend/drm: log modesetting commits")
Closes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3534
(cherry picked from commit a40ba16a64)
2022-11-17 09:09:35 +01:00
Simon Ser
356ac5eed9 backend/drm: log modesetting commits
(cherry picked from commit 65836ce357)
2022-11-17 09:09:35 +01:00
Simon Ser
e169ebb8cf backend/drm: log refresh rate in Hz
(cherry picked from commit b3da33116e)
2022-11-17 09:09:34 +01:00
Kirill Primak
b9b6334639 xwayland: fix wlr_xwayland_surface_from_wlr_surface() docs
32daa43a45 has removed the asymmetry in
the relationship of a wlr_surface and an unmapped wlr_xwayland_surface,
when wlr_surface.role_data wasn't NULL but wlr_xwayland_surface.surface
was. However, this also means that
wlr_xwayland_surface_from_wlr_surface() now returns NULL if the
wlr_surface is unmapped. Fix the documentation to reflect this.

(cherry picked from commit 627a5c5112)
2022-11-17 09:08:57 +01:00
bi4k8
990cba8966 wlr_seat: clear drag->seat_client when destroyed
This was previously a use-after-free in `wlr_drag.c`.

(cherry picked from commit 8b12037cad)
2022-11-16 18:06:01 +01:00
Simon Ser
a6ff023df2 backend/drm: only request page-flip if active
It doesn't make sense to request a page-flip for a disabled output.

Fixes: 84e727daae ("backend/drm: request page-flip event on modeset")
Closes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3528
(cherry picked from commit f863b93c05)
2022-11-16 18:06:01 +01:00
Simon Zeni
bc6422115c render/egl: fix uninitialized pointers in init_dmabuf_formats
`modifiers` and `external_only` are never initialized, and free'd later. This
commit explicitly initializes them to NULL to prevent segfaults on `free()`

(cherry picked from commit ed71915742)
2022-11-16 18:06:01 +01:00
Simon Ser
1712a7d274 build: bump to version 0.16.0 2022-11-11 18:22:17 +01:00
Alexander Orzechowski
c58ad0f171 wlr_scene: Remove duplicate buffer check when submitting a new buffer
wlr_buffer allows mutation during its lifetime. This happens for
wlr_client_buffer which fixes damage tracking issues.
2022-11-11 15:37:22 +00:00
Simon Ser
84e727daae backend/drm: request page-flip event on modeset
The old drm_connector_set_mode() function did that by calling
drm_crtc_page_flip(). We lost this in the refactoring.

Fixes: f216e97983 ("backend/drm: drop drm_connector_set_mode()")
2022-11-11 14:46:51 +00:00
Kirill Primak
a707b7b101 output-damage: deprecate 2022-11-11 05:31:10 +00:00
Alexander Orzechowski
ea40ba4f6a wlr_scene: Fix texture reuse
Add private interface to ignore a buffer that's locking a client_buffer
for damage tracking. This should eventually be replaced by wlr_raster.
2022-11-11 00:08:04 +00:00
illiliti
eec95e3d5e backend/drm: use pnp.ids to fetch EDID data 2022-11-09 00:25:18 +03:00
Simon Ser
d75b4d8e86 Revert "backend/drm: fetch EDID manufacturer from udev_hwdb"
This reverts commit e646d882cf.

This commit has added a dependency on udev_hwdb. This API isn't
available on all platforms (e.g. FreeBSD), and further deepens
our udev dependency. A better solution is being worked on in [1].

[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3638
2022-11-08 19:08:43 +01:00
Kirill Primak
4152db92ef damage-ring: add missing headers 2022-11-08 17:10:56 +00:00
Simon Ser
440d7fa072 scene: destroy addons before cleaning up internal state
This allows addons to access wlr_scene_node/wlr_scene_surface
fields to clean up themselves.
2022-11-08 16:47:59 +00:00
Simon Ser
24c149fefb scene: fix whitespace 2022-11-08 16:47:59 +00:00
Kirill Primak
c284700deb Revert "render/pixman: apply source image cropping"
This reverts commit 9fefeb69d6.

It doesn't really crop anything, actually.
2022-11-08 18:24:44 +03:00
zccrs
270914d379 render/vulkan: add some interfaces to allow compositors to integrate
Added wlr_vk_renderer_get_* functions to allow get the VkInstance,
VkPhysicalDevice, VkDevice, queue family of a wlr_vk_renderer.

Added wlr_vk_renderer_get_current_image_attribs function to allow get
the VkImage of current renderer buffer to use on compositors.

Added wlr_renderer_is_vk function, it's like the wlr_renderer_is_gles2,
returns true if the wlr_renderer is a wlr_vk_renderer.

Added wlr_vk_image_get_attribs function to get a VkImage and it's
extras information (e.g. a VkImageLayout and VkImageFormat of the
VkImage) from a wlr_texture.
2022-11-08 12:56:38 +01:00
Kirill Primak
9fefeb69d6 render/pixman: apply source image cropping 2022-11-08 09:17:04 +00:00
Kirill Primak
123a08b448 scene: fix output damage expansion
This fixes e.g. `weston-simple-damage --use-viewport` which technically
renders at the buffer scale of 0.5.
2022-11-08 06:37:42 +00:00
Simon Ser
6c31f3b078 render/vulkan: use wl_array for wlr_vk_shared_buffer.allocs
Avoids the need to open-code the realloc() logic.
2022-11-07 21:22:33 +00:00
Kirill Primak
388de59df3 compositor: use the correct input region 2022-11-07 21:06:12 +00:00
Kirill Primak
b7623694ac tinywl: handle view unmap while grabbed
Fixes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3372
2022-11-07 20:09:25 +03:00
Simon Ser
ea68506b73 render/vulkan: fix and add missing wl_list comments
In wlroots we add comments near struct wl_list members to indicate
which type it's linked to. The Vulkan renderer had some comments
with mistakes, and some members without a comment.
2022-11-07 14:08:03 +00:00
Simon Ser
9a5cc36818 render/vulkan: simplify texture VkPipelineShaderStageCreateInfo
I simplified the quad VkPipelineShaderStageCreateInfo in [1], but
missed the one for texture.

[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3823
2022-11-07 14:24:39 +01:00