1
0
Fork 0

Sync to gnome-43 & Add mr2671

Signed-off-by: Mingi Sung <FiestaLake@protonmail.com>
This commit is contained in:
Mingi Sung 2022-11-16 11:41:36 +09:00
parent c4d2bcb421
commit 606dbea8a2
No known key found for this signature in database
GPG key ID: 67B568F99ECE42DC
3 changed files with 220 additions and 8 deletions

View file

@ -1,6 +1,6 @@
pkgbase = mutter-performance
pkgdesc = A window manager for GNOME | Attempts to improve performances with non-upstreamed merge-requests and frequent stable branch resync
pkgver = 43.0+r97+gd313c8f4f
pkgver = 43.1
pkgrel = 1
url = https://gitlab.gnome.org/GNOME/mutter
arch = x86_64
@ -35,12 +35,14 @@ pkgbase = mutter-performance
depends = libsysprof-capture
depends = lcms2
depends = colord
source = mutter-performance::git+https://gitlab.gnome.org/GNOME/mutter.git#commit=d313c8f4fe14d8a287bd75bb202434c538048808
source = mutter-performance::git+https://gitlab.gnome.org/GNOME/mutter.git#commit=8329a3eb5f4960df919e0348bd445c40568d3d60
source = mr1441.patch
source = mr1880.patch
source = mr2671.patch
sha256sums = SKIP
sha256sums = d7a014965cbb90892ccbe65d0de49ddce50191dbd7521467d7f11c2f4825045c
sha256sums = a075fad955d589ea5e59178221a80fe162f7b10cd0c77fcb94219fb380810952
sha256sums = d7f8e1a52ddcc02af677b7a7167b720028a4363f1b4df8a9a47fdf5b770ca721
pkgname = mutter-performance
groups = gnome

View file

@ -13,8 +13,8 @@
### PACKAGE OPTIONS
## MERGE REQUESTS SELECTION
# Merge Requests List: ('579' '1441' '1880')
_merge_requests_to_use=('1441' '1880')
# Merge Requests List: ('579' '1441' '1880' '2671')
_merge_requests_to_use=('1441' '1880' '2671')
## Disable building a DOCS package
# Remember to unset this variable when producing .SRCINFO
@ -29,7 +29,7 @@ if [ -n "$_disable_docs" ]; then
else
pkgname=(mutter-performance mutter-performance-docs)
fi
pkgver=43.0+r97+gd313c8f4f
pkgver=43.1
pkgrel=1
pkgdesc="A window manager for GNOME | Attempts to improve performances with non-upstreamed merge-requests and frequent stable branch resync"
url="https://gitlab.gnome.org/GNOME/mutter"
@ -42,13 +42,15 @@ depends=(dconf gobject-introspection-runtime gsettings-desktop-schemas
makedepends=(gobject-introspection git egl-wayland meson xorg-server
wayland-protocols sysprof gi-docgen)
checkdepends=(xorg-server-xvfb pipewire-session-manager python-dbusmock zenity)
_commit=d313c8f4fe14d8a287bd75bb202434c538048808 # tags/43.0^97
_commit=8329a3eb5f4960df919e0348bd445c40568d3d60 # tags/43.1^0
source=("$pkgname::git+https://gitlab.gnome.org/GNOME/mutter.git#commit=$_commit"
'mr1441.patch'
'mr1880.patch')
'mr1880.patch'
'mr2671.patch')
sha256sums=('SKIP'
'd7a014965cbb90892ccbe65d0de49ddce50191dbd7521467d7f11c2f4825045c'
'a075fad955d589ea5e59178221a80fe162f7b10cd0c77fcb94219fb380810952')
'a075fad955d589ea5e59178221a80fe162f7b10cd0c77fcb94219fb380810952'
'd7f8e1a52ddcc02af677b7a7167b720028a4363f1b4df8a9a47fdf5b770ca721')
pkgver() {
cd $pkgname
@ -150,6 +152,14 @@ prepare() {
# Fixes: #1162
pick_mr '1880' 'mr1880.patch' 'patch'
# Title: surface-actor-wayland: Clean up and optimize check for primary view
# Author: Robert Mader <robert.mader@posteo.de>
# URL: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2671
# Type: 1
# Status: 2
# Comment: Avoid some allocations, save some CPU cycles and make the code easier to read.
pick_mr '2671' 'mr2671.patch' 'patch'
}
build() {

200
mr2671.patch Normal file
View file

@ -0,0 +1,200 @@
Author: Robert Mader <robert.mader@posteo.de>
Source: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2671
Editor: Mingi Sung <FiestaLake@protonmail.com>
Commit: d9f1681b149c12c94e3e457c6decd34babed951f
Last Updated: 11/16/22 (Mutter 43.0-1)
---
Avoid some allocations, save some CPU cycles and make the code easier
to read.
Behaviourwise the only expected change is that now, if there are mapped
clones, we unconditionally choose the view with the highest refresh
rate the actor (or one of its clones) is on and don't check the
obscurred region any more.
Thus in some cases a client may receive a higher rate of frame callbacks
when obscurred on a faster view while a clone is present on a slower
one. The assumption is that cases like this are relatively rare and
that the reduction of code complexity, the reduction of allocations in
meta_surface_actor_is_obscured_on_stage_view() whenever the actor is
not fully obscurred and has clones on other views, as well as generally
fewer lookups and less code in most common cases, compensate for that.
---
diff --git a/src/compositor/meta-surface-actor-wayland.c b/src/compositor/meta-surface-actor-wayland.c
index b58f328dc3272b9f418beda90c607b1759d5b345..7cbaa65ce3f628295337c6dc471895f4c9681aae 100644
--- a/src/compositor/meta-surface-actor-wayland.c
+++ b/src/compositor/meta-surface-actor-wayland.c
@@ -67,60 +67,79 @@ meta_surface_actor_wayland_is_opaque (MetaSurfaceActor *actor)
#define UNOBSCURED_TRESHOLD 0.1
-ClutterStageView *
-meta_surface_actor_wayland_get_current_primary_view (MetaSurfaceActor *actor,
- ClutterStage *stage)
+gboolean
+meta_surface_actor_wayland_is_stage_view_current_primary_view (MetaSurfaceActor *actor,
+ ClutterStageView *stage_view)
{
ClutterStageView *current_primary_view = NULL;
float highest_refresh_rate = 0.f;
float biggest_unobscurred_fraction = 0.f;
GList *l;
- for (l = clutter_stage_peek_stage_views (stage); l; l = l->next)
+ if (!clutter_actor_is_effectively_on_stage_view (CLUTTER_ACTOR (actor),
+ stage_view))
+ return FALSE;
+
+ if (clutter_actor_has_mapped_clones (CLUTTER_ACTOR (actor)))
{
- ClutterStageView *stage_view = l->data;
- float refresh_rate;
- float unobscurred_fraction = 1.f;
+ ClutterStage *stage;
- if (clutter_actor_has_mapped_clones (CLUTTER_ACTOR (actor)))
+ stage = CLUTTER_STAGE (clutter_actor_get_stage (CLUTTER_ACTOR (actor)));
+ for (l = clutter_stage_peek_stage_views (stage); l; l = l->next)
{
+ ClutterStageView *view = l->data;
+ float refresh_rate;
+
if (!clutter_actor_is_effectively_on_stage_view (CLUTTER_ACTOR (actor),
- stage_view))
+ view))
continue;
- }
- else
- {
- if (l->next || biggest_unobscurred_fraction > 0.f)
- {
- if (meta_surface_actor_is_obscured_on_stage_view (actor,
- stage_view,
- &unobscurred_fraction))
- continue;
- }
- else
+
+ refresh_rate = clutter_stage_view_get_refresh_rate (view);
+ if (refresh_rate > highest_refresh_rate)
{
- if (meta_surface_actor_is_obscured (actor) ||
- !clutter_actor_is_effectively_on_stage_view (CLUTTER_ACTOR (actor),
- stage_view))
- continue;
+ current_primary_view = view;
+ highest_refresh_rate = refresh_rate;
}
}
- refresh_rate = clutter_stage_view_get_refresh_rate (stage_view);
+ return current_primary_view == stage_view;
+ }
+
+ l = clutter_actor_peek_stage_views (CLUTTER_ACTOR (actor));
+ g_assert (l != NULL);
+
+ if (!l->next)
+ {
+ g_assert (l->data == stage_view);
+ return !meta_surface_actor_is_obscured (actor);
+ }
+
+ for (; l; l = l->next)
+ {
+ ClutterStageView *view = l->data;
+ float refresh_rate;
+ float unobscurred_fraction;
+
+ if (meta_surface_actor_is_obscured_on_stage_view (actor,
+ view,
+ &unobscurred_fraction))
+ continue;
+
+ refresh_rate = clutter_stage_view_get_refresh_rate (view);
if ((refresh_rate > highest_refresh_rate &&
- (unobscurred_fraction > UNOBSCURED_TRESHOLD ||
- biggest_unobscurred_fraction < UNOBSCURED_TRESHOLD)) ||
+ (biggest_unobscurred_fraction < UNOBSCURED_TRESHOLD ||
+ unobscurred_fraction > UNOBSCURED_TRESHOLD)) ||
(biggest_unobscurred_fraction < UNOBSCURED_TRESHOLD &&
unobscurred_fraction > UNOBSCURED_TRESHOLD))
{
- current_primary_view = stage_view;
+ current_primary_view = view;
highest_refresh_rate = refresh_rate;
biggest_unobscurred_fraction = unobscurred_fraction;
}
}
- return current_primary_view;
+ return current_primary_view == stage_view;
}
static void
diff --git a/src/compositor/meta-surface-actor-wayland.h b/src/compositor/meta-surface-actor-wayland.h
index 1a349af91f250978ff356a3114d1da3817010089..1898147d55e0180efdb7320efbf421ad67958b24 100644
--- a/src/compositor/meta-surface-actor-wayland.h
+++ b/src/compositor/meta-surface-actor-wayland.h
@@ -44,8 +44,8 @@ MetaSurfaceActor * meta_surface_actor_wayland_new (MetaWaylandSurface *surface);
MetaWaylandSurface * meta_surface_actor_wayland_get_surface (MetaSurfaceActorWayland *self);
void meta_surface_actor_wayland_surface_destroyed (MetaSurfaceActorWayland *self);
-ClutterStageView * meta_surface_actor_wayland_get_current_primary_view (MetaSurfaceActor *actor,
- ClutterStage *stage);
+gboolean meta_surface_actor_wayland_is_stage_view_current_primary_view (MetaSurfaceActor *actor,
+ ClutterStageView *stage_view);
G_END_DECLS
diff --git a/src/wayland/meta-wayland-presentation-time.c b/src/wayland/meta-wayland-presentation-time.c
index fb99445eb70dd72d95e8e425a3230be8505b8b25..0025b62e1e6a0381f30b70e3ef2da817dc3dc214 100644
--- a/src/wayland/meta-wayland-presentation-time.c
+++ b/src/wayland/meta-wayland-presentation-time.c
@@ -156,7 +156,6 @@ on_after_paint (ClutterStage *stage,
GList *l_cur = l;
MetaWaylandSurface *surface = l->data;
MetaSurfaceActor *actor;
- ClutterStageView *surface_primary_view;
l = l->next;
@@ -164,9 +163,8 @@ on_after_paint (ClutterStage *stage,
if (!actor)
continue;
- surface_primary_view =
- meta_surface_actor_wayland_get_current_primary_view (actor, stage);
- if (stage_view != surface_primary_view)
+ if (!meta_surface_actor_wayland_is_stage_view_current_primary_view (actor,
+ stage_view))
continue;
if (!wl_list_empty (&surface->presentation_time.feedback_list))
diff --git a/src/wayland/meta-wayland.c b/src/wayland/meta-wayland.c
index 9d066b19cb4d555b720f908b3f099ee8fbab4235..af8f9db1c3db8c1dc1876e3a4ec53ef5d25a5a65 100644
--- a/src/wayland/meta-wayland.c
+++ b/src/wayland/meta-wayland.c
@@ -224,7 +224,6 @@ on_after_update (ClutterStage *stage,
MetaWaylandSurface *surface = l->data;
MetaSurfaceActor *actor;
MetaWaylandActorSurface *actor_surface;
- ClutterStageView *surface_primary_view;
l = l->next;
@@ -232,9 +231,8 @@ on_after_update (ClutterStage *stage,
if (!actor)
continue;
- surface_primary_view =
- meta_surface_actor_wayland_get_current_primary_view (actor, stage);
- if (stage_view != surface_primary_view)
+ if (!meta_surface_actor_wayland_is_stage_view_current_primary_view (actor,
+ stage_view))
continue;
actor_surface = META_WAYLAND_ACTOR_SURFACE (surface->role);