Commit Graph

3082 Commits

Author SHA1 Message Date
Bilal Elmoussaoui
c1e6948e42 cogl: Port Bitmap away from CoglObject
We still need to use set_qdata_full as CoglBitmapPixbuf would free
the data itself by unrefing the pixbuf

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3193>
2023-10-29 21:16:24 +00:00
Bilal Elmoussaoui
d71fe5c55e cogl: Port OnscreenTemplate away from CoglObject
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3193>
2023-10-29 21:16:24 +00:00
Bilal Elmoussaoui
748c1fb9f4 cogl: Port FrameInfo away from CoglObject
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3193>
2023-10-29 21:16:24 +00:00
Michel Dänzer
f128bb4db1 Remove unused _clutter_stage_window_get_wrapper
Unused since 89daa8d4fa ("wayland: drop wayland backend").

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3178>
2023-10-26 09:49:29 +00:00
Bilal Elmoussaoui
98bd2aa2c2 clutter: Move cairo pixel format to cogl
As Cogl already defines a pixel format enum, it makes sense to move such
endian dependant pixel format there

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3086>
2023-10-25 20:03:08 +00:00
Peter Hutterer
85885c6539 input-capture: Check barriers don't extend into nonexisting monitors
Create a fake monitor region right of the right-most monitor and if a
horizontal barrier extends into that region, fail the barrier. Barriers
are aligned on the top/left edge of the pixel so the most natural
barrier of (e.g. 0-1024) is also wrong - it's one pixel into the next
monitor.

Check this for nonexisting screens on the right too to avoid clients
suddenly failing when multiple monitors are present.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3319>
2023-10-23 06:57:45 +00:00
Peter Hutterer
b7078ddab7 input-capture: Fix off-by-one for barrier validation
Assuming two 1920x1080 screens next to each other: a horizontal barrier
starting at 1920 going east is always outside the left screen.

Assuming two 1920x1080 screens on top of each other: a vertical barrier
starting at 1080 going south is always outside the top screen.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3319>
2023-10-23 06:57:45 +00:00
Olivier Fourdan
909cc6c240 renderer/native: Send modifiers even without AddFb2
When running headless, only the invalid modifiers are advertised.

That breaks with the NVIDIA proprietary driver which then rejects the
buffers created with the invalid modifier, and that kills Xwayland,
meaning that running Xwayland on top of a mutter based compositor
headless is not possible.

The reason the modifiers are not sent is because AddFb2 is not supported
when running headless.

Other compositors (weston, wlroots) would still send the modifiers even
without AddFb2, and Xwayland works fine on those compositors when
running headless.

Remove the requirement for AddFb2 to send the modifiers, so that
Xwayland can work fine on top of mutter headless with the NVIDIA
proprietary driver.

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3060
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3320>
2023-10-18 13:19:28 +00:00
Olivier Fourdan
8de5bdc89c renderer/native: Add a new has_addfb2 property
We want to be able to tell from MetaWaylandDmabuf to fine tweak when and
which modifiers should be sent.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3320>
2023-10-18 13:19:28 +00:00
Robert Mader
8d3d8b86e5 screen-cast/stream-src: Assert that dmabuf handle lookup succeeds
To prevent issues like the one fixed in the previous commit.

Also remove a redundant variable assignment.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3326>
2023-10-13 16:41:04 +00:00
Robert Mader
5809ef62f5 screen-cast/stream-src: Calculate stride after adding handle to hash table
`calculate_stride()` looks up the dmabuf handle from the hash table so
we need to add it first.

Fixes 9b663f44e6

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3326>
2023-10-13 16:41:04 +00:00
Jonas Ådahl
ed6c335140 backends: Use helper to translate from/to clutter/evdev button codes
This fixes an issue in the MetaEisClient implementation which didn't
offset correctly.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3325>
2023-10-13 16:24:43 +00:00
Jonas Ådahl
26b4583164 backend: Introduce helpers for turning from/to clutter/evdev buttons
We have multiple implementations of these types of transformations, and
one is broken. Instead of just fixing it, add this helper so that it can
use it instead.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3325>
2023-10-13 16:24:43 +00:00
Ray Strode
5d3e31a499 kms/impl-device: Inhibit real-time scheduling when mode setting
Certain kernel drivers can take an unreasonably long time to
complete mode setting operations. That excessive CPU time is charged
to the process's rlimits which can lead to the process getting killed
if the thread is a real-time thread.

This commit inhibits real-time scheduling around mode setting
commits, since those commits are the ones currently presenting as
excessively slow.

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3037
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3324>
2023-10-11 10:25:55 -04:00
Ray Strode
b1db87ae30 thread: Allow turning off rt scheduling for running thread
At the moment if a thread is made real-time there's no going back,
it stays real-time for the duration of its life.

That's suboptimal because real-time threads are expected by RTKit to
have an rlimit on their CPU time and certain GPU drivers in the kernel
can exceed that CPU time during certain operations like DPMS off.

This commit adds two new ref counted functions:

    meta_thread_{un,}inhibit_realtime_in_impl

that allow turning a thread real-time or normally scheduled. At the same
time, this commit stores the RTKit proxy as private data on the thread
so that it can be reused by the above apis.

A subsequent commit will use the new APIs.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3324>
2023-10-11 10:25:55 -04:00
Ray Strode
f46e428a5c thread: For consistency, s/real_time/realtime/
Most of the code writes "real-time" as "realtime" not "real_time".

The only exception is one function `request_real_time_scheduling`.

This commit changes that function for consistency.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3324>
2023-10-11 10:23:02 -04:00
Jonas Ådahl
b1b95c8681 tests/kms/render: Add test for setting empty config
This should disable CRTCs and unassign outputs.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3318>
2023-10-11 01:57:19 +00:00
Jonas Ådahl
f9bbe22499 monitor-manager/native: Update assignments on empty-config too
Not doing so means we'll have whatever old assignments were there, which
can cause problems when e.g. newly generated output/crtc objects
automatically find old assignments.

Related: https://bugzilla.redhat.com/show_bug.cgi?id=2242612
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3318>
2023-10-11 01:57:19 +00:00
Jonas Ådahl
23876efad3 renderer/native: Clear old pending mode sets when unsetting all modes
If we queued a mode set, but didn't end up compositing all frames, we'll
have pending mode sets in a hash table waiting to be applied. If we
before all monitors again try to reconfigure things we should drop the
old pending mode sets and start fresh.

We already do this when we're doing so when generating views, but when
just unsetting modes, we didn't, so fix that.

Related: https://bugzilla.redhat.com/show_bug.cgi?id=2242612
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3318>
2023-10-11 01:57:19 +00:00
Jonas Ådahl
a4e1afc648 renderer/native: Fold mode unsetting into renamed unset_modes()
We had a function called "reset_modes()" on MetaRendererNative, but what
it expected to do was to unset all modes on all CRTCs. Despite this, it
had code to unset modes on unconfigured CRTCs, probably because it was
used for multiple things in the past.

Make this a bit easier to follow by renaming the function
"unset_modes()" and fold the function doing the unsetting into the
function itself.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3318>
2023-10-11 01:57:19 +00:00
Sebastian Wick
3d318e18b5 kms/impl-device/atomic: Fix blob size
Fixes: ed0682003 ("kms/impl-device/atomic: Fix stack overflow")
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3323>
2023-10-11 00:54:23 +02:00
Sebastian Wick
ed06820035 kms/impl-device/atomic: Fix stack overflow
Intel has started to advertise big gamma LUT sizes on some hardware
because the hardware supports segmented LUTs. This means they have a lot
more precision at certain segments then others. The uAPI can't expose
this functionality meaningfully so they chose to expose a huge number of
TAPs to sample from to their segmented LUT.

This increase in uAPI LUT size resulted in stack overflows because we
allocated the LUT on the stack. This commit moves it to the heap
instead.

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3064
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3322>
2023-10-10 14:20:27 +00:00
Robert Mader
9b663f44e6 screen-cast/strieam-src: Fix stride and max buffer size calculation
1. Centralize stride calculation in one function.
2. For dmabufs query the stride instead of assuming a certain value.
3. For system memory buffers use the pixel format to calculate the
   stride.
4. Stop negotiating `SPA_PARAM_BUFFERS_size` and
   `SPA_PARAM_BUFFERS_stride`.

2. fixes an actual bug where we reported wrong max buffer sizes,
resulting in crashes in Gstreamer when doing area screencasts on AMD
GPUs.

The reasoning for 4. is that the values were possibly wrong for
dmabufs as the negotiation happens before we create any buffers.
Further more neither Mutter nor the common consumers required it.
The later either ignore the values (OBS), always accept (gstpipewiresrc)
them or calculate the exact same possibly wrong values (libwebrtc).

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/6747
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3311>
2023-10-09 23:11:16 +02:00
Robert Mader
b258e1f7ee screen-cast/stream-src: Various code cleanups
No functional changes.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3311>
2023-10-09 23:11:16 +02:00
Michel Dänzer
83b762e0e4 kms/impl-device: Reverse update merge order in process_mode_set_update
This makes sure the new update takes effect over the pending update for
any common properties. It matches the other users of
meta_kms_update_merge_from.

Fixes: 27ed069766 ("kms/impl-device: Add deadline based KMS commit scheduling")
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3316>
2023-10-08 19:35:36 +00:00
Rohan Hendrik Jotz-Lean
74b9d46d7c input-settings: Apply pointing stick settings
Apply the pointing stick (TrackPoint) configuration -- speed,
acceleration profile, and scrolling method -- from the gsettings desktop
schema.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3089>
2023-10-06 15:06:02 +00:00
Jonas Ådahl
1802065953 monitor-config-store: Discard config with fractional scale when unusable
When a configuration has a fractional scale, but we're using a physical
monitor layout, we can't use the scale, but if we do, we end up with
wierd issues down the line. Just discard the config if we run into this.

Eventually we probably want to store the layout mode in the
configuration so we can handle more seamless switching between physical
and logical layout mode, but first do this.

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3057
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3299>
2023-10-06 13:48:53 +00:00
Robert Mader
d71c0a94a1 stage-view: Add API to query cursor overlay inhibition
It will be used in a later commit to check if the stage-view maybe have
a software cursor on it.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3302>
2023-10-03 15:41:05 +00:00
Carlos Garnacho
6fe1b3145f backends/native: Translate keycodes with xkb_key_state_get_one_sym()
There's two aspects from its documentation
(https://xkbcommon.org/doc/current/group__state.html#gae56031a8c1d48e7802da32f5f39f5738)
affecting us here:

1. "This function is similar to xkb_state_key_get_syms(), but intended for
    users which cannot or do not want to handle the case where multiple
    keysyms are returned (in which case this function is preferred)."

   We are indeed in that field, and have been for a long time.

2. "This function performs Capitalization Keysym Transformations."

   This is unlike the xkb_key_get_syms() function that we use, and
   convenient here for parity with X11 since it behaves exactly that
   way.

Fixes cases where the keysym for some keys is not properly capitalized
when caps lock is toggled, due to the output of capslock+key being
different from shift+key. An example of this is 'é' in french(azerty)
layout (bound to the '2' key). Even though shift+2 outputs '2',
capslock+é should output 'É'.

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3058
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3306>
2023-09-29 13:51:36 +02:00
Jonas Dreßler
c4b9431bb2 screen-cast/stream: Pass redraw clip to stage watches instead of paint context
The virtual stream source with CURSOR_MODE_EMBEDDED uses
META_STAGE_WATCH_AFTER_PAINT as the callback for recording its frame. In
this stage of the paint though, there is no ClutterPaintContext anymore
(there only is a paint context during the paint, not afterwards).
The callback (actors_painted()) tries to get the redraw clip from the paint
context, and we end up with a NULL pointer crash.

We actually do still have a redraw clip at this point, so because everyone
uses the paint context to get the redraw clip anyway, just pass the redraw
clip to the stage watches directly.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3283>
2023-09-26 18:07:10 +00:00
Daniel van Vugt
7cf9997757 kms/crtc: Increase default deadline evasion to 800 microseconds
This seems to be enough to fix:
 * Constant stuttering on Apple Magic Trackpad 2 (90Hz)
 * Constant stuttering on Microsoft IntelliMouse Explorer 3.0 (125Hz)
 * Wake-from-idle frame skips on Microsoft Classic IntelliMouse (1000Hz)

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2974
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3212>
2023-09-25 09:48:07 +00:00
Pascal Nowack
483601844b backends/eis-client: Do not add device before adding EIS regions
When a device is added, libei does not allow adding additional regions
for that particular device, as it is already advertised to the EI
client.
As a result, mutter currently effectively only adds the first region to
a device, but not the others.
This makes input in multi monitor sessions only possible on one monitor,
as the EI client cannot look up the other regions, since they were not
advertised to it.

Fix this situation by not adding and resuming the device, when a shared
device is used.
Instead, for shared devices, always add all regions first, and then
after that, add and resume the device.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3273>
2023-09-16 22:13:05 +02:00
Pascal Nowack
4c5db8e3bd backends/eis-client: Fix type of index
libei uses as index size_t. To avoid a potential endless loop due to
overflow, fix that type accordingly.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3273>
2023-09-16 22:13:05 +02:00
Pascal Nowack
83454e944b screen-cast-stream: Also release mapping id when clearing stream
Use the previously added API to release acquired mapping ids, when the
corresponding stream is destroyed.
Otherwise, the remote desktop session would maintain a whole bunch of
unused mapping ids, as their corresponding streams are already
destroyed, but maybe not the session.
Such situation would be a remote multimonitor session, where the amount
of used virtual monitors changes multiple times during the session.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3273>
2023-09-16 22:13:05 +02:00
Pascal Nowack
3461e1e18c backends/remote-desktop-session: Add API to release mapping ids
The remote desktop session currently provides a mechanism to acquire
mapping ids.
However, when they are not used anymore, they currently cannot be
removed and thus just linger around.

So, add an API to release these acquired ids.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3273>
2023-09-16 22:13:05 +02:00
Carlos Garnacho
e056ce0ea3 backends/native: Pass ClutterSeat into virtual input device constructor
Avoid passing the MetaSeatImpl, since it may be potentially null at
MetaSeatNative construction time. An example of this triggering issues
are mousekeys, since those work on an emulated pointer device created
indirectly after a keyboard device is added (and the right settings are
enabled) at a time that the MetaSeatImpl is still being created, so the
MetaSeatNative cannot yet have a reference to it.

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2869
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3278>
2023-09-16 10:29:21 +00:00
Carlos Garnacho
00bb4190b3 backends/native: Drop device_native->seat_impl field
Work our way to the MetaSeatImpl internally in MetaInputDeviceNative,
instead of keeping a pointer right to it.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3278>
2023-09-16 10:29:21 +00:00
Carlos Garnacho
4ce97fba6c backends/native: Avoid meta_input_device_native_get_seat_impl()
These objects already have a pointer to the ClutterSeat that has a
pointer to the MetaSeatImpl in its native implementation. This data
may be considered pretty much immutable (a pointer to the seat is
held, and the native implementation will shut down the implementation
thread within ClutterSeat finalization.

Avoids some awkward code, since the MetaInputDeviceNative needs to
be aware of the Clutter object implementation and the implementation
object.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3278>
2023-09-16 10:29:21 +00:00
Daniel van Vugt
48c9b638f3 kms/impl-device: Inhibit deadline timer on vc4 (Raspberry Pi)
vc4's implementation of `drmModeAtomicCommit` seems to require a few
milliseconds advanced notice or else it will miss the frame deadline.
That's too high for our deadline evasion threshold which is measured
in microseconds. Let's stop trying to use deadline timers on vc4 to
avoid this conflict without having to disable atomic KMS.

Suggested-by: Jonas Ådahl <jadahl@gmail.com>
Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2953
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3279>
2023-09-15 13:30:52 +08:00
Daniel van Vugt
eab5e94862 kms/impl-device: Rename deadline_timer_failed to deadline_timer_inhibited
Because in the next commit we'll reuse the flag for conditional
inhibition on platforms where the deadline timer doesn't fail.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3279>
2023-09-15 13:25:20 +08:00
Jonas Ådahl
4ff54997b6 cursor-renderer/native: Create all view objects before realizing
Realizing a cursor will assume view related state objects are valid so
they can mark them as dirty. This assumption broke when there were a
scale changed that happened with multiple CRTCs, as we'd create view
object by view object as we realized the texture. Realizing the texture
would trigger a signal that had the handler assuming the validity of all
view objects, but if we only had gotten to the first, the second view
would not be there yet, thus we'd be doing a NULL pointer dereference.

Creating the view objects first, then handling the updating avoids this
problem by making the already done assumption valid on hotplugs.

The test case added tests exactly this series of events, and uses a
virtual monitor as a cheap trick to make the KMS CRTC based view the
first one, and an arbitrary view the second that previously had its view
object initialized too late.

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3012
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3262>
2023-09-13 10:38:06 +00:00
Sebastian Wick
e3b659cfe8 monitor-manager: Add logging to enabling and disabling HDR mode
It's hard to tell why turning on HDR mode failed without these log
messages. It could be missing support in the sink (EDID/DisplayID) or
missing support in the driver/display hardware (connector properties) or
just a failure turning it on.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3251>
2023-09-13 08:19:23 +00:00
Sebastian Wick
c96341dcd5 output: Validate EDID information as UTF-8 only if it exists
Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3021
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3268>
2023-09-12 20:48:18 +02:00
Sebastian Wick
4514d29c90 edid: Copy the Manufacturer Code char array to a NULL-term string
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3268>
2023-09-12 20:06:22 +02:00
Sebastian Wick
de4cf18bd0 edid: Move libdisplay-info and fallback code around
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3116>
2023-09-12 17:52:34 +02:00
Sebastian Wick
d382d55eae edid: Fix up libdisplay-info support
* The code did not compile before.
* Change the MetaEdidInfo struct to be more friendly to libdisplay-info
* Change to nit based luminance from encoded values

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2896
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3116>
2023-09-12 17:52:34 +02:00
Jonas Ådahl
4749c073eb monitor-manager/xrandr: Trap DPMS changes
Apparently DPMSForceLevel() can fail to force a valid level sometimes.

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2857
Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/6883
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3160>
2023-09-12 14:41:26 +00:00
Carlos Garnacho
4075847278 backends/native: Use correct constructor for CLUTTER_TOUCH_CANCEL events
We were using the generic constructor for BEGIN/UPDATE/END events, that
have more data than CLUTTER_TOUCH_CANCEL. Since that function checks for
the event type, we were awkwardly forwarding a NULL event here.

Related: https://gitlab.gnome.org/GNOME/mutter/-/issues/3016
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3261>
2023-09-12 13:38:16 +00:00
Daniel van Vugt
c7815f33a2 backends/x11: Trap errors from XIAllowTouchEvents
And report them as debug messages instead of crashing. We don't want them
to be visible usually because failures are expected in the autodeny
code path.

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2808,
        https://launchpad.net/bugs/2029413

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3253>
2023-09-07 15:04:55 +08:00
Joan Torres
33eef7211a launcher: Fix unrefing seat_proxy
When using meta-laucher headlessly, there isn't a seat_proxy.
In that context, doing directly g_object_unref gives an error.
This commit fixes it.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3249>
2023-09-06 13:02:30 +00:00