Commit graph

1546 commits

Author SHA1 Message Date
Alexander Orzechowski
ecbe48f3bc backend/drm: Fix typo 2023-06-21 10:23:56 +02:00
Alexander Orzechowski
e8887f76ed backend/drm: Use texture blend_mode for multigpu blit 2023-06-19 13:16:35 -04:00
Simon Ser
2d9659d765 backend/libinput: use struct initializers for events
This is more readable and consistent with the rest of wlroots.
2023-06-14 15:20:41 +02:00
Simon Ser
e1c6801b65 backend/libinput: ignore multiple events for same pointer button
If the same button is pressed on two devices on the same seat,
ignore the second event.

This is also what Mutter does.

Closes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3665
2023-06-14 10:48:44 +00:00
Simon Ser
4339c37f99 backend/drm: clip FB damage
The kernel complains when the damage exceeds the FB bounds:

    [73850.448326] i915 0000:00:02.0: [drm:drm_atomic_check_only] [PLANE:31:plane 1A] invalid damage clip 0 0 2147483647 2147483647

Make the DRM backend behave like the Wayland one and allow compositors
to damage (0, 0, INT32_MAX, INT32_MAX) to repaint everything without
needing to know the exact buffer size.

Closes: https://github.com/swaywm/sway/issues/7632
2023-06-12 20:38:03 +00:00
Rose Hudson
9e8947e4d5 add render timer API
Based on five calls:
wlr_render_timer_create - creates a timer which can be reused across
  frames on the same renderer
wlr_renderer_begin_buffer_pass - now takes a timer so that backends can
  record when the rendering starts and finishes
wlr_render_timer_get_time - should be called as late as possible so that
  queries can make their way back from the GPU
wlr_render_timer_destroy - self-explanatory

The timer is exposed as an opaque `struct wlr_render_timer` so that
backends can store whatever they want in there.
2023-06-05 19:50:07 +00:00
Simon Ser
4e513c93bd backend/wayland: add support for cropping output layers 2023-06-05 18:29:55 +00:00
Simon Ser
4c5eadecce backend/wayland: add scaling support for output layers
Use the viewporter protocol to scale output layers.
2023-06-05 18:29:55 +00:00
Simon Ser
30aca4df0d backend/drm: introduce wlr_drm_mode_get_info()
This allows compositors to get back the raw drmModeModeInfo and
look at DRM-specific fields and flags.
2023-05-31 22:37:12 +00:00
Simon Ser
8fe29e6bd1 backend/drm: use new rendering API 2023-05-30 16:18:19 +00:00
Austin Shafer
0910fa9179 drm_plane_pick_render_format: return false if no format could be found
Commit 90d08f8f1c changed the way
wlr_drm_format_intersect worked, including passing in a destination
format list. This breaks scenarios where the intersection doesn't
find any matching formats, since we still have a valid destination
format set. This changes it to only return true if more than one
matching format is present in the intersection list.
2023-05-17 18:24:20 +00:00
Tobias Predel
3dc5c7e5e7 backend_destroy: Similiar logic like DRM backend
In the logic of the DRM backend in backend_destroy, wlr_backend_finish
is called first, then the outputs are destroyed and then the
display->destroy.link is removed from the list.

This commit applies the same order to the headless backend.
2023-05-15 20:21:23 +02:00
Alexander Orzechowski
300bd80772 wlr_drm_format_set: Store formats on array 2023-05-11 18:25:52 +02:00
Alexander Orzechowski
90d08f8f1c wlr_drm_format: Rework wlr_drm_format_intersect
Now it takes a reference to a destination format
2023-05-11 18:24:43 +02:00
Alexander Orzechowski
b45396c790 wlr_drm_format: Introduce drm_format_finish 2023-05-11 03:51:01 -04:00
zhoulei
2c30500ce1 backend/drm: fix di_info memory leak 2023-05-08 10:16:25 +08:00
ptrcnull
56502be1d1 backend/x11: prevent segfault on empty DRI3 response 2022-05-01 06:13:58 +02:00
Simon Ser
44069dfd5e output-layer: add cropping support
Add a src_box state field. Use the SRC_* KMS props in the DRM
backend, reject the layers in the Wayland backend (for now, we can
support it later via viewporter).
2023-04-20 10:39:46 +02:00
Simon Ser
835208db98 output-layer: add support for scaling buffers
This allows callers to set a destination size different from the
buffer size to scale them.

The DRM backend supports this. The Wayland backend doesn't yet
(we'd need to wire up viewporter).
2023-04-04 19:39:38 +02:00
Simon Ser
89dcecba39 backend/wayland: only unmap layers when necessary 2023-03-28 22:58:29 +00:00
Simon Ser
fcc092c2a6 backend/wayland: only update layer position when necessary 2023-03-28 22:58:29 +00:00
Simon Ser
e8a2f76eb4 backend/wayland: only re-order sub-surfaces when necessary 2023-03-28 22:58:29 +00:00
Rose Hudson
37f42e2df2 backend/wayland: support touch cancel events
since wayland doesn't provide a touch id in cancel events, track what
points are active so we can cancel all of them

timestamp is also not provided - use 0 because no one's paying attention
to that anyway

Closes #3000
2023-03-24 11:47:08 +00:00
Simon Ser
1d64e12391 backend/drm: log drm_connector_alloc_crtc() failures
Helps figuring out why e.g. get_primary_formats fails.
2023-03-20 20:21:28 +01:00
Simon Ser
1b6fac4aa6 output-layer: require all layers in wlr_output_state.layers
- Simplifies the backends
- Avoids having two ways to do the same thing: previously one could
  disable a layer by either omitting it from wlr_output_state.layers,
  or by passing a NULL buffer
- We can change our mind in the future: we can allow users to omit
  some layers and define a meaning without breaking the API.

References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4017#note_1783997
2023-03-10 11:16:01 +00:00
Simon Ser
97c8ad7c65 backend/wayland: fix leak of some globals
Fix a few globals which weren't properly cleaned up. Discovered
in [1].

[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3604
2023-03-01 16:07:54 +01:00
Simon Ser
af5cc860e1 backend/wayland: destroy zwp_linux_buffer_params_v1 objects
Don't leak these.
2023-02-28 20:05:46 +01:00
Simon Ser
a160304289 backend/drm: use libdisplay-info for CVT mode generation 2023-02-28 14:44:02 +00:00
Simon Ser
35da997001 backend/drm: use libdisplay-info to parse EDID 2023-02-28 14:44:02 +00:00
Simon Ser
bec94cc040 backend: move #ifdefs to nested functions
Instead of littering #ifdefs everywhere, move them to the dedicated
attempt_XXX_backend() functions. This makes the logic in
wlr_backend_autocreate() more readable, and provides better error
messages when the X11/Wayland backends are disabled at compile-time,
or when WLR_BACKENDS contains a backend disabled at compile-time.
2023-02-27 11:33:52 +01:00
Simon Ser
8acaabcbab backend: make wlr_backend_autocreate() fail when DRM is missing
When we change the required dependencies for the DRM backend,
Meson might auto-disable the backend for users missing the new
requirements. This results in confused users [1] because they don't
notice the "drm-backend: NO" line burried in the Meson logs, and
then get a black screen when starting the compositor.

Update wlr_backend_autocreate() to refuse to create a backend with
only libinput (without DRM).

Users really wanting to start their compositor with a libinput
backend and without a DRM backend can manually set WLR_BACKENDS.

[1]: https://github.com/swaywm/sway/issues/7457
2023-02-27 11:18:58 +01:00
Simon Ser
b33ab26fe7 render/swapchain: make public
We've had this struct for a while. It'd be useful for compositors
if they want to manage the swap chains themselves instead of being
forced to use wlr_output's. Some compositors might also want to use
a swapchain without an output.
2023-02-21 17:14:31 +01:00
Simon Ser
c667e64892 backend: disable DRM backend monitor when WLR_DRM_DEVICES is used
WLR_DRM_DEVICES specifies a static list of DRM devices to open
at startup.

Do not create DRM backends for hotplugged DRM devices when it's
set.

Closes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3595
2023-02-21 12:55:26 +01:00
Simon Ser
7303e13808 backend: avoid adding NULL backend in attempt_backend_by_name() 2023-02-21 12:52:20 +01:00
Simon Ser
2849712356 backend: create DRM backend monitor when WLR_BACKENDS is used 2023-02-21 12:51:46 +01:00
Simon Ser
bea6bee55d backend/headless: unconditionally accept all output layers
We don't need to do anything special to handle these.
2023-02-21 10:12:35 +00:00
Simon Ser
8338d17d7e backend/drm: drop wlr_drm_layer.pending_{width,height}
No need to store this info in struct wlr_drm_layer. We can just
extract the size when we need it.
2023-02-21 09:45:47 +00:00
Simon Ser
bbd5145d8a backend/drm: drop unnecessary pixman_region32_t casts
The Pixman API now accepts const parameters.
2023-02-21 09:37:59 +00:00
Simon Ser
22d9df2af4 backend/drm: send output layer feedback events 2023-02-20 18:38:57 +01:00
Simon Ser
4d6fbb2289 backend/drm: add support for output layers 2023-02-20 18:38:57 +01:00
Simon Ser
2398621b8b backend/drm: add libliftoff composition layer
This will be useful for implementing the output layers API.
2023-02-20 18:38:57 +01:00
Simon Ser
9d43e7e4d6 backend/drm: add libliftoff interface 2023-02-20 18:38:57 +01:00
Simon Ser
b4e9487312 backend/drm: init wlr_drm_plane for all plane types 2023-02-20 18:38:57 +01:00
Simon Ser
cd17b18495 backend/wayland: implement output layers 2023-02-20 18:38:57 +01:00
Simon Ser
cfa7696d7b backend/wayland: handle wl_registry.global_remove for wl_seat
Destroy the struct wlr_wl_seat when the global is removed.
2023-02-02 18:24:38 +00:00
Simon Ser
2b5eb0733e backend/wayland: make destroy_wl_seats() handle a single seat
Instead of destroying all seats, destroy a single one. We only need
to destroy all seats at one call-site (backend_destroy), but we'll
need to destroy a single seat elsewhere in the next commit.
2023-02-02 18:24:38 +00:00
Simon Ser
8df62e4016 backend/drm: require hwdata pkg-config file
The hardcoded fallback "/usr/share/hwdata/pnp.ids" was only a
temporary solution to get things working while distributions were
still working on shipping it.
2023-02-02 18:15:29 +00:00
Simon Ser
afa1a7f4ba backend/wayland: update output mode after commit is done
Do not update the output mode if the commit failed in one of the
error codepaths.
2023-02-02 17:24:37 +00:00
Simon Ser
2e49fa1a0a backend/wayland: allow superseding a previous commit
During a modeset, the core wlr_output logic will allocate a buffer
with a new size and commit it. However if we still have a frame
callback pending we'd refuse to perform the commit. This is
inconsistent with the DRM backend, which performs a blocking
modeset.

This is visible when resizing the Wayland toplevel. The logs are
filled with "Skipping buffer swap", and the wlr_damage_ring's
bounds are not properly updated.

Fix this by destroying the pending frame wl_callback.
2023-02-02 17:24:37 +00:00
Simon Ser
c88ad532ad backend/wayland: don't cache next item when destroying buffers
Because wl_buffer.release is per-buffer and not per-commit, the
Wayland backend might create multiple struct wlr_wl_buffer per
struct wlr_buffer. As a result, the wlr_buffer_unlock() call inside
destroy_wl_buffer() can cause another struct wlr_wl_buffer to be
destroyed.

In backend_destroy() we were iterating the list of buffers with
wl_list_for_each_safe(), which is actually not safe in this case:
the next buffer is cached, but might be destroyed as a side-effect
of calling destroy_wl_buffer().

Closes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3572
2023-02-02 16:45:09 +00:00