Commit Graph

31410 Commits

Author SHA1 Message Date
Michel Dänzer
200fc76f14 wayland/idle-inhibit: Pass actor instance in on_actor_changed
This matches the other g_signal_connect / g_clear_signal_handler calls
for these signal handlers.

Fixes: a3c62bf8aa ("wayland/idle-inhibit: Add state tracking to fix races")
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3444>
2023-12-06 16:01:36 +00:00
Michel Dänzer
212283c13b wayland/idle-inhibit: Handle NULL inhibitor->actor
Fixes: a3c62bf8aa ("wayland/idle-inhibit: Add state tracking to fix races")
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3444>
2023-12-06 16:01:36 +00:00
Sebastian Keller
dfe4d218f1 clutter/actor: Make get_transformed_paint_volume() transfer full
Transfer none was achieved using a stack GArray in the stage which
would get resized to 0 at the end of every frame to "free" it.
In the case of direct scanout however, painting the next frame only
happens after leaving fullscreen again. Until then the array just kept
growing and because GArrays don't reallocate when shrunk, this memory
remained allocated even after leaving fullscreen.

There is no cache benefit from storing paint volumes this way, because
nothing accesses them after their immediate use in the calling code.
Also the reduced overhead from avoiding malloc calls seems negligible as
according to heaptrack this only makes up about 2-3% of the temporary
allocations.

Changing this to transfer full and removing the stack array simplifies
the code and fixes the "leak".

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3191
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3442>
2023-12-06 14:07:39 +00:00
Jonas Ådahl
05efc92084 cogl/pipeline/glsl: Add line numbers to displayed source
When running with COGL_DEBUG=show-source include line numbers so that it
becomes easier to understand compilation errors.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3443>
2023-12-06 13:45:03 +00:00
Jonas Ådahl
ae3a20a0a0 clutter/paint-nodes: Use g_clear_object() in a few places
It's possible now that they are GObject's.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3443>
2023-12-06 13:45:03 +00:00
Jonas Ådahl
83e2f70f1f backend: Rename update_screen_size() to update_stage()
We don't only update the size of the screen / stage, but also regenerate
views etc. Make this a bit more obvious by renaming the function to
update_stage().

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3443>
2023-12-06 13:45:03 +00:00
Jonas Ådahl
08d2155b6c shaped-texture: Rename GObjectClass pointer variable
To be consistent with the rest of mutter, call it `object_class`.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3443>
2023-12-06 13:45:03 +00:00
Jonas Ådahl
68412cedac shaped-texture: Get type from klass
We don't need to get the type from the type casted class pointer, just
get it from the one from the function argument.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3443>
2023-12-06 13:45:03 +00:00
Jonas Ådahl
7152779ae0 clutter/stage-view: Remove unused double buffered shadow fb
It was for a failed expriment that tried to mmap() dmabuf memory and
find damaged regions to decrease the amount that was eventually used to
write to an onscreen, but mmap:ing is only fast enough on intel, and
it's only relevant on various server GPUs. For it to be achievable, we
need to render to system memory in a way that we don't need to copy it
out of OpenGL, but that's currently not possible.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3443>
2023-12-06 13:45:03 +00:00
Jonas Ådahl
d8ff97ebf6 clutter/stage-view: Pass around view when creating shadow fb
Instead of passing around the CoglContext, pass around the view, which
can be used to fetch the CoglContext. We'll use it for more stuff later.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3443>
2023-12-06 13:45:03 +00:00
Jonas Ådahl
b282097834 clutter/stage-view: Rename offscreen pipeline vfunc
It doesn't really "set it up", it just sets the transform according to
the renderer view state. We'll do more setup outside, so lets rename it.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3443>
2023-12-06 13:45:03 +00:00
Jonas Ådahl
a27949d25e renderer/native: Stop passing around CoglContext when creating offscreen
We can easily get it, so it's unnecessary to pass it around everywhere.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3443>
2023-12-06 13:45:03 +00:00
Jonas Ådahl
008f2642ca clutter/enums: Add trailing comma in colorspace enum
Would make it easier would we add more colorspaces later on.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3443>
2023-12-06 13:45:03 +00:00
Sebastian Wick
0f1c5223ff clutter: Add ClutterContext to clutter-types.h
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3443>
2023-12-06 13:45:03 +00:00
Michel Dänzer
c47730894e wayland/dma-buf: Prefer sync_file for dma-buf readiness source
Similarly to https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3389,
this avoids over-synchronization due to the client reading from the
buffer, e.g. if drawing a frame re-uses the previous frame contents.

v2:
* Rename owned_fd → owned_sync_fd (Sebastian Wick)
* Put curly braces around do/while loop

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3408>
2023-12-05 14:53:21 +00:00
Michel Dänzer
0e471bcea7 wayland/dma-buf: Refactor create_source helper
No functional change intended.

v2:
* Make local source assignment separate from its declaration
  (Ivan Molodetskikh)

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3408>
2023-12-05 14:53:21 +00:00
Jonas Ådahl
501d19656e context: Make ClutterContext a GObject and move to separate file
This is a step in cleaning up the Clutter context management. By making
it a GObject it's easier to add e.g. properties and features that helps
with introspection.

For now, this means the context creation is changed to go via a
"constructor" (clutter_create_context()). This is so that the global
context singleton can be mantained outsid of ClutterContext, until it
can be removed.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2016>
2023-12-05 14:39:25 +00:00
Jonas Ådahl
6aebd5407d stage/impl: Fix variable naming consistency
Changed to follow convention in mutter.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2016>
2023-12-05 14:39:25 +00:00
Jonas Ådahl
d96e458d93 clutter: Remove unused sync-to-vblank setter
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2016>
2023-12-05 14:39:25 +00:00
Jonas Ådahl
1209320cd2 clutter/context: Remove left-over locking declarations
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2016>
2023-12-05 14:39:25 +00:00
Jonas Ådahl
f14b5da387 clutter/backend: Remove 'finish_init()' vfunc
The original purpose of being able to report errors is no longer
relevant, since the Clutter backend is now practically a thin wrapper
around the actual backend, which has already dealt with error reporting.
Thus move this to the regular constructor path.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2016>
2023-12-05 14:39:25 +00:00
Jonas Ådahl
579532f644 clutter: Rename ClutterMainContext to ClutterContext
The intention for ClutterContext is to be more or less the MetaContext
or CoglContext equivalent. Lets rename the type so that it becomes more
consistent with the other similar types.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2016>
2023-12-05 14:39:25 +00:00
Carlos Garnacho
6ad0114d1f compositor: Undo MetaWindowDrag on MetaWindow::unmanaged signal
The current usage of MetaWindow::unmanaging may result in confused
focus window lookups while undoing the MetaWindowDrag grab (i.e.
still pointing to the window that is now being unmanaged).

The meta_window_unmanage() function itself takes care of changing
focus outside of the window being unmanaged, so postpone the
MetaWindowDrag undoing to a point after that is done.

Fixes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3073
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3376>
2023-12-05 14:16:27 +00:00
Michel Dänzer
75d00027ca kms: Remove dead MetaKmsPageFlipListenerFlag type
Unused since 02b1cfe08f ("onscreen/native: Handle unexpected scanout
failures async").

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3389>
2023-12-05 12:51:32 +00:00
Michel Dänzer
e8a213beef kms/impl-device/atomic: Set IN_FENCE_FD for direct scanout
Since meta_kms_impl_device_get_sync_file always returns the same
file descriptor referencing the same sync_file, this means the atomic
ioctl doesn't need to wait for any fences to signal. This is fine
because we already waited for the buffer to become idle before applying
the Wayland surface state.

Fixes the atomic commit ioctl spuriously synchronizing to the screen
cast paint (at least with the amdgpu driver), which could result in
the page flip missing its target scanout cycle.

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3148

v2:
* Rename local variable to signaled_sync_file for consistency with new
  function name

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3389>
2023-12-05 12:51:32 +00:00
Michel Dänzer
281ff86b4b kms/impl-device: Add meta_kms_impl_device_get_signaled_sync_file helper
It returns a file descriptor which references a signaled sync_file.

v2:
* Change function name and add Doxygen comment to hopefully make its
  purpose a bit clearer (Ivan Molodetskikh)
v3: (Jonas Ådahl)
* Create sync_file from scratch via a syncobj, no buffer needed anymore
* Initialize priv->sync_file = 1 and use g_clear_fd in finalize

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3389>
2023-12-05 12:51:32 +00:00
Michel Dänzer
3ad32ee0bc kms/plane: Add META_KMS_ASSIGN_PLANE_FLAG_DIRECT_SCANOUT flag
It marks plane assignments for direct scanout.

Preparation for following commits, no functional change intended.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3389>
2023-12-05 12:51:32 +00:00
Michel Dänzer
0f52c2a6da onscreen/native: Plumb through MetaKmsAssignPlaneFlag
Through meta_onscreen_native_flip_crtc and
meta_crtc_kms_assign_primary_plane.

Preparation for following commits, no functional change intended.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3389>
2023-12-05 12:51:32 +00:00
Michel Dänzer
ebf9a1edde ksm/plane: Add support for IN_FENCE_FD property
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3389>
2023-12-05 12:51:32 +00:00
Sebastian Wick
962ca18341 cogl/tests: Skip 10bpc tests if the pixel formats are not supported
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3429>
2023-12-05 08:47:11 +00:00
Sebastian Wick
7f943613a8 cogl: Use sized internal renderable formats
Using sized internal formats is required to make sure we actually get
the precision that we want.

The formats should also be renderable, otherwise they can not be used as
a framebuffer attachment. For GLES we have to check for a bunch of
extensions and fall back to internal formats with more bits when they
are not available.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3429>
2023-12-05 08:47:11 +00:00
Sebastian Wick
bbf2d83e94 cogl/gles: Require OES_rgb8_rgba8 to have color-renderable 8bpc formats
In GLES 2.0 the required color-renderable formats to support to not
include 8bpc RGB/RGBA formats. The extension adds this requirement and
makes GLES 2.0 actually useable. Not specifying a gl internal format in
Cogl so far has hidden the problem and let the implementation fall back
to RGB585 for example.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3429>
2023-12-05 08:47:11 +00:00
Sebastian Wick
f77d95c9ae cogl: Make FP16 and RGBA1010102 public features
Also be more strict about what we consider RGBA1010102 support. Before
GLES 3.0, using ReadPixels on a framebuffers with format RGB10_A2 was
not possible with type GL_UNSIGNED_INT_2_10_10_10_REV_EXT and thus our
code to read back pixels could fail.

Users of cogl should check those feature flags before using FP16 and
RGBA1010102 pixel formats via CoglFeatureIDs:
 * COGL_FEATURE_ID_TEXTURE_RGBA1010102
 * COGL_FEATURE_ID_TEXTURE_HALF_FLOAT

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3429>
2023-12-05 08:47:11 +00:00
Sebastian Wick
5d0fc6d8c1 cogl: Remove unused COGL_PIXEL_FORMAT_DEPTH_32
It's not depth-renderable or required to be supported and we don't use
it anyway, so just get rid of it.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3429>
2023-12-05 08:47:11 +00:00
Daniel van Vugt
2a17a5dee8 onscreen/native: Remove trailing whitespace
check-code-style complains about this, when it works (after !3426).

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3430>
2023-12-05 08:30:03 +00:00
Qiu Wenbo
48515d917c cogl: Fix memory allocation of CoglGLContext
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3440>
2023-12-04 16:54:05 +08:00
Carlos Garnacho
625a7950c4 ci: Add fallback to $CI_COMMIT_TAG for tag pipelines
The script to check out the mutter repository is missing the
case of tag pipelines, and resorts to CI_DEFAULT_BRANCH. Add
a fallback through $CI_COMMIT_TAG, so these pipelines fetch
the expected commit.

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3188
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3438>
2023-12-02 22:59:25 +01:00
Ivan Molodetskikh
edbc9a2086 clutter/pick-stack: Add an allocation check to calculate_clear_area ()
We might pick an actor that needs relayout. I've seen this happen inside
hiding / unmapping in particular. In this case, calculate_clear_area ()
will call clutter_actor_get_abs_allocation_vertices () which in turn
will force a relayout. However, this is not what we want, because:

1. We don't want to run layout during picking.
2. If the actor needs an allocation, then the pick stack could not have
   used an up-to-date allocation, because it is not computed. Therefore
   this clear area would use a potentially completely different
   allocation than the one stored in the pick stack.

Thankfully, clear area seems to be used as a cache/optimization, so
let's just avoid computing it if the actor is not allocated.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3425>
2023-12-01 15:36:32 +00:00
Jonas Ådahl
adc5489ba7 Add debug controller
The debug controller can optionally, when passing --debug-control,
enable manipulating debug state, so far enabling/disabling HDR, via
D-Bus.

It's always created, in order to have a place to store debug state and
emit signals etc when it changes, but so far, it doesn't have its own
state it tracks, it just mirrors that of the monitor manager.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3432>
2023-12-01 14:25:08 +00:00
Jonas Ådahl
d5253b1385 build: Make input-capture use declarative D-Bus code generation
This was cleaned up, but a input capture rebased didn't port to the new
way of declaring what D-Bus protocol files that should go through code
generation.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3432>
2023-12-01 14:25:08 +00:00
Jonas Ådahl
294739db15 monitor-manager: Apply HDR settings before updating the stage
This means we can make use of the HDR configuration of outputs to derive
stage rendering configuration.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3432>
2023-12-01 14:25:08 +00:00
Jonas Ådahl
3561f3c20e monitor-manager: Set up experimental HDR change listener after starting
This means we can fiddle with it during startup without an accidental
reconfigure being sneaked in by the listener.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3432>
2023-12-01 14:25:08 +00:00
Jonas Ådahl
e4badfecb3 monitor-manager: Allow forcing experimental HDR mode with an env var
This makes it possible to test without GNOME Shell and looking glass.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3432>
2023-12-01 14:25:08 +00:00
Jonas Ådahl
be3394646f monitor-manager: Stop leaking experimental HDR setting
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3432>
2023-12-01 14:25:08 +00:00
Carlos Garnacho
9f89421ef5 backends: Attempt a fallback to 'default' cursor on failed lookups
While we should ideally have a sensible cursor theme, handle the
case of cursor themes that lack certain cursor names, and fallback
to the 'default' cursor in those cases.

The 'grey rectangle' fallback is still left, in case we even fail
to load a 'default' cursor.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3295>
2023-11-30 20:38:22 +00:00
Carlos Garnacho
d970c9db1a backends: Use standard cursor names from the CSS specification
This is the preferred name set, and handled by adwaita icon theme.
Use the names from https://www.w3.org/TR/css-ui-4/#cursor, like
GDK does at https://docs.gtk.org/gdk4/ctor.Cursor.new_from_name.html.

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3040
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3295>
2023-11-30 20:38:22 +00:00
Pascal Nowack
a2a4067e07 screencast: Add ability to stop streams
When a stream is destroyed by a consumer, mutter won't be able to
recognize that.
For mutter, the stream just paused, but did not disconnect, because the
connection state of a PipeWire stream only represents, whether the
respective PipeWire context is connected to PipeWire.
In addition to that, it may be the case, that the stream consumer just
recreates the stream.
So even if mutter would be able to know, when the stream consumer
destroyed a stream, but not the whole screencast or remote-desktop
session, then mutter would not know, whether the stream will be resumed
eventually or not.

So, add an explicit API call to the screencast interface to stop a
stream.
For virtual streams, this also means, that the respective virtual
monitor is destroyed.

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2889
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3307>
2023-11-30 12:22:59 +01:00
Pascal Nowack
d2122a02a3 monitor-manager: Reload monitor manager in idle callback
When a virtual stream is destroyed, its respective virtual monitor is
destroyed too. When the virtual monitor is destroyed, mutter reloads
the monitor manager.
However, at this point, the virtual stream is not completely destroyed
yet. The viewport of the virtual monitor still exists at this point and
when the monitor manager reloads, it will try to fetch the logical
monitor of the now destroyed virtual monitor, which will fail and thus
gnome-shell will run into a segfault.

Fix this situation by reloading the monitor manager in an idle callback.
When the monitor manager reloads, the virtual monitor is completely
gone, since the viewport of the virtual monitor is destroyed after the
virtual monitor itself.

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2864
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3307>
2023-11-30 12:22:52 +01:00
Pascal Nowack
e70fa342a9 monitor-manager: Fix minor code style issue
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3307>
2023-11-30 12:13:26 +01:00
Jonas Ådahl
822ea67358 tests/utils: Add helper for waiting for monitor reconfigurations
This is useful after having removed a virtual monitor, which
will soon reconfigure in an idle callback.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3307>
2023-11-30 12:13:26 +01:00