1
0
Fork 0

Sync to gnome-46 & Drop !3373, !3912, _disable_docs, and _enable_check

Signed-off-by: Mingi Sung <sungmg@saltyming.net>
This commit is contained in:
Mingi Sung 2024-08-28 20:31:05 +09:00
parent a3543b350d
commit e28d956baf
Signed by: sungmg
GPG key ID: 41BAFD6FFD8036C5
6 changed files with 78 additions and 762 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 = 46.4+r4+gc2c694464c
pkgver = 46.4+r17+g0d60d07204
pkgrel = 1
epoch = 1
url = https://gitlab.gnome.org/GNOME/mutter
@ -73,36 +73,24 @@ pkgbase = mutter-performance
depends = systemd-libs
depends = wayland
depends = xorg-xwayland
source = git+https://gitlab.gnome.org/GNOME/mutter.git#commit=c2c694464c6558bf91a15d6f6807ae5fa6175658
source = git+https://gitlab.gnome.org/GNOME/mutter.git#commit=0d60d072048c8ce8ebb527284e5baa10df26bc7c
source = mr1441.patch
source = mr3373.patch
source = mr3567.patch
source = mr3751.patch
source = mr3912.patch
source = mr3934.patch
sha256sums = 01e53f26a46819a9b933c20a4f845e9aaa0ffaf2632d29d883111d99903b8269
sha256sums = c319d2b1b9060f37ef37ac7112729883192e59bfc42aa13b4c2d73e2e1cccc61
sha256sums = 1292f1dcefa0a3cfff753db942e7c974e39b1265d246634f239aad9437d45609
sha256sums = f72340218b99f0278ca358cfb94fc213ec3e91b5ff7ecae198b3d220829b7e4e
sha256sums = 60638078a3f3c46da61f868c04b2a3424488510702648452c3e8214a3790e37b
sha256sums = 2e474a574edad8dc047a53a920fc7cbe005cac0102907eef80a252fc556d0517
sha256sums = 4c15b0e6d0001c8c3feedf05a9140f7f17d52eb36ff7b8039e0281c1373ccdfe
sha256sums = f02f07abc4072118e175e8028d3ee16ff0aa9b238dd2b10155b3ae2a0534a4a0
sha256sums = 45d9c998053c9b8def5a7b122861101137ce6ac4fd6be9d9c475232529ecb98c
b2sums = c6cc96e1a4044bc3a54a460a5dc5e85f04bb45d975d07711891cb32f41172446bcc537336e937f7196c4e2a2c2f2e3cd944908edee160b2e76ee2a1c0d561f48
b2sums = 9b7a3922c631dfdd7b4466d5aab7309c81527c013fb0c92f520734264b30bfaca0f2b660afbd1e7cf14ce419033ad1ec1d39c00af3ce1576da85c298d1e6b03e
b2sums = 38de03d5fbe7c9d1b9c41a4bc6b76b8d3acc270b93f279c5db591d79a689d9ea748f34da08ec584e49bbfc2d35a5bceeaf2f6b3fd91bc620139b4ee8b4ca6a04
sha256sums = c0ae2855247cddde806a320d031021fd0f7c867c61ac95af99ea3765f290bbf5
b2sums = 86db7a63e6dfd33baf5a6cebc30b96d57de1688de6cbc475a9b46fe21b5e02c50bcb56b4065ab8e2092c4fc7303d2d6d86c75f4d555fcef8a00a9cd243d30e25
b2sums = 802cf82c0d4fa4514dc376bac57a65453df0ce789e6efac334d2f76a24349ad0a2b6e9ce02345839e8de719d7696dfcae911b1e66922103b2ec315e9fbaa8f01
b2sums = 65302b1fa24a7aba26915269fb694c7a64b134ee2062ec7e649036a3a41efb2f2f4110cff6194808af34985855ade641c5fb01f0b97536cd3c912892ea3a0d4c
b2sums = f9f2284d7236d6072a818de3784a339c2d934490da8870876f49d4effd59ce807593ce8b8a3c5e06586fd5fd7e81fb31fedca84115acf1e71cfe23d4a5e727b3
b2sums = 14ed5e8fe9844739903150bf69de03b7136e74eb4b080d2e0264ba9bf5f2ba2c826cb45b78f8c38b2e80c223dd7926aa8e756e9bee23b75ced16ba5af45c2d8d
b2sums = 1ecb06542e117b980329cdc16b14860f045f83be735247f1433d9d2564bc27befd47b124f4d96f0ebc7cc986224ab66d3f1d30b92a831f0f59a11eb6d8aedb8d
b2sums = 18e8d521336422f4c441979fe77ff22c60406e94cd2159c08bbfd127bf6b010dece55c7226b99a953c560b05194fe72e5c2140765577069d970c93479b573bcb
pkgname = mutter-performance
groups = gnome
provides = mutter
provides = libmutter-14.so
conflicts = mutter
pkgname = mutter-performance-docs
pkgdesc = A window manager for GNOME | Attempts to improve performances with non-upstreamed merge-requests and frequent stable branch resync (documentation)
depends =
provides = mutter-docs
conflicts = mutter-docs

116
PKGBUILD
View file

@ -11,28 +11,16 @@
### PACKAGE OPTIONS
## MERGE REQUESTS SELECTION
# Merge Requests List: ('579' '1441' '3373' '3567' '3751' '3912' '3934')
# Merge Requests List: ('579' '1441' '3567' '3751' '3934')
_merge_requests_to_use=('1441' '3751')
## Disable building the DOCS package (Enabled if not set)
# Remember to unset this variable when producing .SRCINFO
: "${_disable_docs:=""}"
## Enable the `check()` operation (Disabled if not set)
: "${_enable_check:=""}"
### IMPORTANT: Do no edit below this line unless you know what you're doing!
_pkgname=mutter
pkgbase=mutter-performance
if [ -n "$_disable_docs" ]; then
pkgname=mutter-performance
else
pkgname=(mutter-performance mutter-performance-docs)
fi
pkgname=mutter-performance
epoch=1
pkgver=46.4+r4+gc2c694464c
pkgver=46.4+r17+g0d60d07204
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"
@ -112,28 +100,22 @@ makedepends=(
if [ -n "$_enable_check" ]; then
checkdepends=(gnome-session xorg-server-xvfb pipewire-session-manager python-dbusmock zenity)
fi
_commit=c2c694464c6558bf91a15d6f6807ae5fa6175658 # tags/46.4^4
_commit=0d60d072048c8ce8ebb527284e5baa10df26bc7c # tags/46.4^17
source=("git+$url.git#commit=$_commit"
'mr1441.patch'
'mr3373.patch'
'mr3567.patch'
'mr3751.patch'
'mr3912.patch'
'mr3934.patch')
sha256sums=('01e53f26a46819a9b933c20a4f845e9aaa0ffaf2632d29d883111d99903b8269'
'c319d2b1b9060f37ef37ac7112729883192e59bfc42aa13b4c2d73e2e1cccc61'
'1292f1dcefa0a3cfff753db942e7c974e39b1265d246634f239aad9437d45609'
sha256sums=('f72340218b99f0278ca358cfb94fc213ec3e91b5ff7ecae198b3d220829b7e4e'
'60638078a3f3c46da61f868c04b2a3424488510702648452c3e8214a3790e37b'
'2e474a574edad8dc047a53a920fc7cbe005cac0102907eef80a252fc556d0517'
'4c15b0e6d0001c8c3feedf05a9140f7f17d52eb36ff7b8039e0281c1373ccdfe'
'f02f07abc4072118e175e8028d3ee16ff0aa9b238dd2b10155b3ae2a0534a4a0'
'45d9c998053c9b8def5a7b122861101137ce6ac4fd6be9d9c475232529ecb98c')
b2sums=('c6cc96e1a4044bc3a54a460a5dc5e85f04bb45d975d07711891cb32f41172446bcc537336e937f7196c4e2a2c2f2e3cd944908edee160b2e76ee2a1c0d561f48'
'9b7a3922c631dfdd7b4466d5aab7309c81527c013fb0c92f520734264b30bfaca0f2b660afbd1e7cf14ce419033ad1ec1d39c00af3ce1576da85c298d1e6b03e'
'38de03d5fbe7c9d1b9c41a4bc6b76b8d3acc270b93f279c5db591d79a689d9ea748f34da08ec584e49bbfc2d35a5bceeaf2f6b3fd91bc620139b4ee8b4ca6a04'
'c0ae2855247cddde806a320d031021fd0f7c867c61ac95af99ea3765f290bbf5')
b2sums=('86db7a63e6dfd33baf5a6cebc30b96d57de1688de6cbc475a9b46fe21b5e02c50bcb56b4065ab8e2092c4fc7303d2d6d86c75f4d555fcef8a00a9cd243d30e25'
'802cf82c0d4fa4514dc376bac57a65453df0ce789e6efac334d2f76a24349ad0a2b6e9ce02345839e8de719d7696dfcae911b1e66922103b2ec315e9fbaa8f01'
'65302b1fa24a7aba26915269fb694c7a64b134ee2062ec7e649036a3a41efb2f2f4110cff6194808af34985855ade641c5fb01f0b97536cd3c912892ea3a0d4c'
'f9f2284d7236d6072a818de3784a339c2d934490da8870876f49d4effd59ce807593ce8b8a3c5e06586fd5fd7e81fb31fedca84115acf1e71cfe23d4a5e727b3'
'14ed5e8fe9844739903150bf69de03b7136e74eb4b080d2e0264ba9bf5f2ba2c826cb45b78f8c38b2e80c223dd7926aa8e756e9bee23b75ced16ba5af45c2d8d'
'1ecb06542e117b980329cdc16b14860f045f83be735247f1433d9d2564bc27befd47b124f4d96f0ebc7cc986224ab66d3f1d30b92a831f0f59a11eb6d8aedb8d')
'18e8d521336422f4c441979fe77ff22c60406e94cd2159c08bbfd127bf6b010dece55c7226b99a953c560b05194fe72e5c2140765577069d970c93479b573bcb')
for mr in "${_merge_requests_to_use[@]}"; do
if [ '3567' = "$mr" ]; then
@ -142,7 +124,7 @@ for mr in "${_merge_requests_to_use[@]}"; do
done
pkgver() {
cd mutter
cd $_pkgname
git describe --tags | sed -r 's/\.([a-z])/\1/;s/([a-z])\./\1/;s/[^-]*-g/r&/;s/-/+/g'
}
@ -222,14 +204,6 @@ prepare() {
# If you use stenography software or play hardcore rhythm games like Lunatic Rave 2/osumania, use it.
pick_mr '579' ce86f90efbaa51522ba14c5b4cad933c2106de42 'revert'
# Title: kms/crtc: Increase default deadline evasion to 1000 microseconds
# Author: Daniel van Vugt <daniel.van.vugt@canonical.com>
# URL: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3373
# Type: 3
# Status: 2
# Comment: This fix cursor stutter.
pick_mr '3373' 'mr3373.patch' 'patch'
# Title: Let scaling-aware Xwayland clients scale themselves with "scale-monitor-framebuffers"
# Author: Jonas Dreßler <verdre@v0yd.nl>
# URL: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3567
@ -248,20 +222,13 @@ prepare() {
# (mostly Chromium/Electron based apps with Ozone Wayland.)
pick_mr '3751' 'mr3751.patch' 'patch'
# Title: backends/native: Avoid duplicating or losing KMS property sets
# Author: Daniel van Vugt <daniel.van.vugt@canonical.com>
# URL: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3912
# Type: 1
# Status: 2
# Comment: Cannot be used with mr1441 as it already includes mr3912.
pick_mr '3912' 'mr3912.patch' 'patch'
# Title: kms/impl-device: Track dispatch duration in crtc_frame_deadline_dispatch
# Author: Michel Dänzer <mdaenzer@redhat.com>
# URL: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3934
# Type: 1
# Status: 2
# Comment: Cannot be used with mr1441 as it already includes mr3934.
# Comment: This fixes cursor stutter.
# Do not enable this if !1441 is enabled since it already includes !3934.
pick_mr '3934' 'mr3934.patch' 'patch'
# Title: Draft: Dynamic triple/double buffering (v4)
@ -269,8 +236,8 @@ prepare() {
# URL: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1441
# Type: 1
# Status: 2 & 3
# Comment: Help GPU frequencies to scale up.
# Including mr3912 and mr3934.
# Comment: Helps GPU frequencies to scale up.
# Backported: !3934.
pick_mr '1441' 'mr1441.patch' 'patch'
}
@ -281,8 +248,8 @@ build() {
-D wayland_eglstream=true
-D installed_tests=false
-D libdisplay_info=enabled
-D docs=$(if ! [ -n "$_disable_docs" ]; then echo "true"; else echo "false"; fi)
-D tests=$(if [ -n "$_enable_check" ]; then echo "true"; else echo "false"; fi)
-D docs=false
-D tests=false
)
CFLAGS="${CFLAGS/-O2/-O3} -fno-semantic-interposition"
@ -292,57 +259,10 @@ build() {
meson compile -C build
}
if [ -n "$_enable_check" ]; then
check() {
mkdir -p -m 700 "${XDG_RUNTIME_DIR:=$PWD/runtime-dir}"
glib-compile-schemas "${GSETTINGS_SCHEMA_DIR:=$PWD/build/data}"
export XDG_RUNTIME_DIR GSETTINGS_SCHEMA_DIR
export NO_AT_BRIDGE=1 GTK_A11Y=none
export MUTTER_DEBUG_DUMMY_MODE_SPECS="800x600@10.0"
local _pipewire_session_manager=$(pacman -Qq pipewire-session-manager)
msg2 "It is possible to fail some tests. Use with caution!"
# Tests fail:
# mutter:cogl+cogl/conform / cogl-test-offscreen-texture-formats-gles2
# mutter:core+mutter/stacking / fullscreen-maximize
## https://gitlab.gnome.org/GNOME/mutter/-/issues/3343
xvfb-run -s '-nolisten local +iglx -noreset' \
${_pkgname}/src/tests/meta-dbus-runner.py --launch=pipewire --launch=${_pipewire_session_manager} \
meson test -C build --no-suite 'mutter/kvm' --no-rebuild \
--print-errorlogs --setup plain ||:
}
fi
_pick() {
local p="$1" f d; shift
for f; do
d="$srcdir/$p/${f#$pkgdir/}"
mkdir -p "$(dirname "$d")"
mv "$f" "$d"
rmdir -p --ignore-fail-on-non-empty "$(dirname "$f")"
done
}
package_mutter-performance() {
package() {
provides=(mutter libmutter-14.so)
conflicts=(mutter)
groups=(gnome)
meson install -C build --destdir "$pkgdir"
if ! [ -n "$_disable_docs" ]; then
_pick docs "$pkgdir"/usr/share/mutter-*/doc
fi
}
if ! [ -n "$_disable_docs" ]; then
package_mutter-performance-docs() {
provides=(mutter-docs)
conflicts=(mutter-docs)
pkgdesc+=" (documentation)"
depends=()
mv docs/* "$pkgdir"
}
fi

View file

@ -1,7 +1,7 @@
From 2d1ae79c3f4120d4df34423d256ae48ce0e76a22 Mon Sep 17 00:00:00 2001
From 21fe0f94e6472d94f8a4943442464eb01785d6bc Mon Sep 17 00:00:00 2001
From: Mingi Sung <sungmg@saltyming.net>
Date: Wed, 14 Aug 2024 17:22:29 +0900
Subject: [PATCH] Merge branch 'triple-buffering-v4-46' into gnome-46
Date: Wed, 28 Aug 2024 20:11:32 +0900
Subject: [PATCH] Merge branch 'sungmg-triple-buffering-v4-46' into gnome-46
Use triple buffering if and when the previous frame is running late.
This means the next frame will be dispatched on time instead of also starting
@ -15,7 +15,7 @@ there's no latency penalty when the system is able to maintain full frame rate.
Author: Daniel van Vugt <daniel.van.vugt@canonical.com>
Source: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1441
Commit: 9abd14c9b77d382a8ef792d990d423fbb1db4698
Commit: 7a1dbab76a49b6dde6813604a3776ced39be91e1
Backported: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3184
Backported: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3265
@ -27,7 +27,7 @@ Backported: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3934
Signed-off-by: Mingi Sung <sungmg@saltyming.net>
---
clutter/clutter/clutter-frame-clock.c | 384 +++++++++++++---
clutter/clutter/clutter-frame-clock.c | 384 +++++++++++++++----
clutter/clutter/clutter-frame-clock.h | 15 +-
clutter/clutter/clutter-frame-private.h | 1 +
clutter/clutter/clutter-frame.c | 13 +
@ -41,14 +41,14 @@ Signed-off-by: Mingi Sung <sungmg@saltyming.net>
src/backends/native/meta-crtc-native.c | 8 +
src/backends/native/meta-crtc-native.h | 3 +
src/backends/native/meta-crtc-virtual.c | 8 +
src/backends/native/meta-frame-native.c | 63 +++
src/backends/native/meta-frame-native.c | 63 ++++
src/backends/native/meta-frame-native.h | 20 +
src/backends/native/meta-kms-crtc.c | 63 ++-
src/backends/native/meta-kms-crtc.c | 63 +++-
src/backends/native/meta-kms-crtc.h | 5 +
src/backends/native/meta-kms-impl-device.c | 55 ++-
src/backends/native/meta-kms-impl-device.c | 51 ++-
src/backends/native/meta-kms.c | 9 +
src/backends/native/meta-kms.h | 2 +
src/backends/native/meta-onscreen-native.c | 582 +++++++++++++++++-------
src/backends/native/meta-onscreen-native.c | 478 +++++++++++++++++-------
src/backends/native/meta-onscreen-native.h | 2 +
src/backends/native/meta-renderer-native.c | 34 +-
src/backends/native/meta-renderer-view-native.c | 41 ++
@ -56,8 +56,8 @@ Signed-off-by: Mingi Sung <sungmg@saltyming.net>
src/meta/meta-debug.h | 2 +
src/meta/util.h | 3 +
src/tests/meta-monitor-manager-test.c | 6 +
src/tests/native-kms-render.c | 106 ++++-
30 files changed, 1195 insertions(+), 282 deletions(-)
src/tests/native-kms-render.c | 106 +++++-
30 files changed, 1125 insertions(+), 244 deletions(-)
diff --git a/clutter/clutter/clutter-frame-clock.c b/clutter/clutter/clutter-frame-clock.c
index 30a319f604..c299705663 100644
@ -906,10 +906,10 @@ index 959a60533b..cfd45a6250 100644
+COGL_EXPORT unsigned int
+cogl_onscreen_get_pending_frame_count (CoglOnscreen *onscreen);
diff --git a/cogl/cogl/cogl-onscreen.c b/cogl/cogl/cogl-onscreen.c
index afb648bcd8..8c010b8cd5 100644
index e2b3a0b462..53ffa649bc 100644
--- a/cogl/cogl/cogl-onscreen.c
+++ b/cogl/cogl/cogl-onscreen.c
@@ -515,6 +515,14 @@ cogl_onscreen_pop_head_frame_info (CoglOnscreen *onscreen)
@@ -514,6 +514,14 @@ cogl_onscreen_pop_head_frame_info (CoglOnscreen *onscreen)
return g_queue_pop_head (&priv->pending_frame_infos);
}
@ -1259,7 +1259,7 @@ index 580ee9a89c..b293f8e7cc 100644
+
+int64_t meta_kms_crtc_get_deadline_evasion (MetaKmsCrtc *crtc);
diff --git a/src/backends/native/meta-kms-impl-device.c b/src/backends/native/meta-kms-impl-device.c
index 6758982a6a..3873526330 100644
index 6758982a6a..6ce62cd697 100644
--- a/src/backends/native/meta-kms-impl-device.c
+++ b/src/backends/native/meta-kms-impl-device.c
@@ -39,6 +39,7 @@
@ -1368,16 +1368,7 @@ index 6758982a6a..3873526330 100644
if (meta_kms_feedback_did_pass (feedback))
crtc_frame->deadline.is_deadline_page_flip = TRUE;
disarm_crtc_frame_deadline_timer (crtc_frame);
@@ -1586,12 +1624,19 @@ meta_kms_impl_device_handle_update (MetaKmsImplDevice *impl_device,
meta_kms_update_merge_from (crtc_frame->pending_update, update);
meta_kms_update_free (update);
update = g_steal_pointer (&crtc_frame->pending_update);
- disarm_crtc_frame_deadline_timer (crtc_frame);
}
+ if (crtc_frame->deadline.armed)
+ disarm_crtc_frame_deadline_timer (crtc_frame);
+
@@ -1592,6 +1630,11 @@ meta_kms_impl_device_handle_update (MetaKmsImplDevice *impl_device,
meta_kms_device_handle_flush (priv->device, latch_crtc);
feedback = do_process (impl_device, latch_crtc, update, flags);
@ -1437,7 +1428,7 @@ index 7434014063..f6b19520be 100644
MetaKmsFlags flags,
GError **error);
diff --git a/src/backends/native/meta-onscreen-native.c b/src/backends/native/meta-onscreen-native.c
index 1a31f04a16..ba5090b3cc 100644
index 9b739faf39..6120eeec7b 100644
--- a/src/backends/native/meta-onscreen-native.c
+++ b/src/backends/native/meta-onscreen-native.c
@@ -76,7 +76,7 @@ typedef struct _MetaOnscreenNativeSecondaryGpuState
@ -1449,21 +1440,7 @@ index 1a31f04a16..ba5090b3cc 100644
} cpu;
gboolean noted_primary_gpu_copy_ok;
@@ -84,6 +84,13 @@ typedef struct _MetaOnscreenNativeSecondaryGpuState
MetaSharedFramebufferImportStatus import_status;
} MetaOnscreenNativeSecondaryGpuState;
+typedef struct _KmsProperty
+{
+ gboolean invalidated;
+ int updates_pending;
+ gulong signal_handler_id;
+} KmsProperty;
+
struct _MetaOnscreenNative
{
CoglOnscreenEgl parent;
@@ -95,12 +102,13 @@ struct _MetaOnscreenNative
@@ -102,12 +102,13 @@ struct _MetaOnscreenNative
MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state;
@ -1481,7 +1458,7 @@ index 1a31f04a16..ba5090b3cc 100644
} gbm;
#ifdef HAVE_EGL_DEVICE
@@ -111,20 +119,23 @@ struct _MetaOnscreenNative
@@ -118,6 +119,9 @@ struct _MetaOnscreenNative
} egl;
#endif
@ -1491,30 +1468,7 @@ index 1a31f04a16..ba5090b3cc 100644
gboolean frame_sync_requested;
gboolean frame_sync_enabled;
MetaRendererView *view;
- gboolean is_gamma_lut_invalid;
- gboolean is_privacy_screen_invalid;
- gboolean is_color_space_invalid;
- gboolean is_hdr_metadata_invalid;
-
- gulong gamma_lut_changed_handler_id;
- gulong privacy_screen_changed_handler_id;
- gulong color_space_changed_handler_id;
- gulong hdr_metadata_changed_handler_id;
+ union {
+ struct {
+ KmsProperty gamma_lut;
+ KmsProperty privacy_screen;
+ KmsProperty color_space;
+ KmsProperty hdr_metadata;
+ } property;
+ KmsProperty properties[4];
+ };
};
G_DEFINE_TYPE (MetaOnscreenNative, meta_onscreen_native,
@@ -132,44 +143,37 @@ G_DEFINE_TYPE (MetaOnscreenNative, meta_onscreen_native,
@@ -139,44 +143,37 @@ G_DEFINE_TYPE (MetaOnscreenNative, meta_onscreen_native,
static GQuark blit_source_quark = 0;
@ -1572,7 +1526,7 @@ index 1a31f04a16..ba5090b3cc 100644
}
static void
@@ -207,7 +211,7 @@ meta_onscreen_native_notify_frame_complete (CoglOnscreen *onscreen)
@@ -214,7 +211,7 @@ meta_onscreen_native_notify_frame_complete (CoglOnscreen *onscreen)
info = cogl_onscreen_pop_head_frame_info (onscreen);
@ -1581,24 +1535,7 @@ index 1a31f04a16..ba5090b3cc 100644
_cogl_onscreen_notify_frame_sync (onscreen, info);
_cogl_onscreen_notify_complete (onscreen, info);
@@ -233,16 +237,20 @@ notify_view_crtc_presented (MetaRendererView *view,
g_return_if_fail (frame_info != NULL);
- onscreen_native->is_gamma_lut_invalid = FALSE;
- onscreen_native->is_privacy_screen_invalid = FALSE;
- onscreen_native->is_color_space_invalid = FALSE;
- onscreen_native->is_hdr_metadata_invalid = FALSE;
+ for (int i = 0; i < G_N_ELEMENTS (onscreen_native->properties); i++)
+ {
+ KmsProperty *prop = &onscreen_native->properties[i];
+
+ if (prop->updates_pending > 0)
+ prop->updates_pending--;
+ }
crtc = META_CRTC (meta_crtc_kms_from_kms_crtc (kms_crtc));
maybe_update_frame_info (crtc, frame_info, time_us, flags, sequence);
@@ -256,6 +253,7 @@ notify_view_crtc_presented (MetaRendererView *view,
meta_onscreen_native_notify_frame_complete (onscreen);
meta_onscreen_native_swap_drm_fb (onscreen);
@ -1606,7 +1543,7 @@ index 1a31f04a16..ba5090b3cc 100644
}
static void
@@ -292,15 +300,13 @@ page_flip_feedback_ready (MetaKmsCrtc *kms_crtc,
@@ -305,15 +303,13 @@ page_flip_feedback_ready (MetaKmsCrtc *kms_crtc,
CoglFramebuffer *framebuffer =
clutter_stage_view_get_onscreen (CLUTTER_STAGE_VIEW (view));
CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer);
@ -1623,31 +1560,8 @@ index 1a31f04a16..ba5090b3cc 100644
}
static void
@@ -333,6 +339,7 @@ page_flip_feedback_discarded (MetaKmsCrtc *kms_crtc,
CoglFramebuffer *framebuffer =
clutter_stage_view_get_onscreen (CLUTTER_STAGE_VIEW (view));
CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer);
+ MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen);
CoglFrameInfo *frame_info;
/*
@@ -346,11 +353,23 @@ page_flip_feedback_discarded (MetaKmsCrtc *kms_crtc,
G_IO_ERROR_PERMISSION_DENIED))
g_warning ("Page flip discarded: %s", error->message);
+ for (int i = 0; i < G_N_ELEMENTS (onscreen_native->properties); i++)
+ {
+ KmsProperty *prop = &onscreen_native->properties[i];
+
+ if (prop->updates_pending > 0)
+ {
+ prop->invalidated = TRUE;
+ prop->updates_pending--;
+ }
+ }
+
frame_info = cogl_onscreen_peek_head_frame_info (onscreen);
frame_info->flags |= COGL_FRAME_INFO_FLAG_SYMBOLIC;
@@ -379,7 +375,8 @@ page_flip_feedback_discarded (MetaKmsCrtc *kms_crtc,
}
meta_onscreen_native_notify_frame_complete (onscreen);
- meta_onscreen_native_clear_next_fb (onscreen);
@ -1656,7 +1570,7 @@ index 1a31f04a16..ba5090b3cc 100644
}
static const MetaKmsPageFlipListenerVtable page_flip_listener_vtable = {
@@ -411,18 +430,36 @@ custom_egl_stream_page_flip (gpointer custom_page_flip_data,
@@ -440,18 +437,36 @@ custom_egl_stream_page_flip (gpointer custom_page_flip_data,
}
#endif /* HAVE_EGL_DEVICE */
@ -1696,7 +1610,7 @@ index 1a31f04a16..ba5090b3cc 100644
static void
apply_transform (MetaCrtcKms *crtc_kms,
MetaKmsPlaneAssignment *kms_plane_assignment,
@@ -499,12 +536,15 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
@@ -528,12 +543,15 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
{
MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen);
MetaRendererNative *renderer_native = onscreen_native->renderer_native;
@ -1712,7 +1626,7 @@ index 1a31f04a16..ba5090b3cc 100644
MetaKmsPlaneAssignment *plane_assignment;
graphene_rect_t src_rect;
MtkRectangle dst_rect;
@@ -512,6 +552,9 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
@@ -541,6 +559,9 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
COGL_TRACE_BEGIN_SCOPED (MetaOnscreenNativeFlipCrtcs,
"Meta::OnscreenNative::flip_crtc()");
@ -1722,7 +1636,7 @@ index 1a31f04a16..ba5090b3cc 100644
gpu_kms = META_GPU_KMS (meta_crtc_get_gpu (crtc));
g_assert (meta_gpu_kms_is_crtc_active (gpu_kms, crtc));
@@ -521,14 +564,14 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
@@ -550,14 +571,14 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
switch (renderer_gpu_data->mode)
{
case META_RENDERER_NATIVE_MODE_GBM:
@ -1743,7 +1657,7 @@ index 1a31f04a16..ba5090b3cc 100644
}
else
{
@@ -571,6 +614,10 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
@@ -600,6 +621,10 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
#endif
}
@ -1754,7 +1668,7 @@ index 1a31f04a16..ba5090b3cc 100644
meta_kms_update_add_page_flip_listener (kms_update,
kms_crtc,
&page_flip_listener_vtable,
@@ -918,12 +965,17 @@ static MetaDrmBufferDumb *
@@ -947,12 +972,17 @@ static MetaDrmBufferDumb *
secondary_gpu_get_next_dumb_buffer (MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state)
{
MetaDrmBufferDumb *current_dumb_fb;
@ -1776,7 +1690,7 @@ index 1a31f04a16..ba5090b3cc 100644
}
static MetaDrmBuffer *
@@ -1163,56 +1215,54 @@ update_secondary_gpu_state_pre_swap_buffers (CoglOnscreen *onscreen,
@@ -1192,56 +1222,54 @@ update_secondary_gpu_state_pre_swap_buffers (CoglOnscreen *onscreen,
return copy;
}
@ -1869,7 +1783,7 @@ index 1a31f04a16..ba5090b3cc 100644
}
static void
@@ -1255,10 +1305,36 @@ swap_buffer_result_feedback (const MetaKmsFeedback *kms_feedback,
@@ -1284,10 +1312,36 @@ swap_buffer_result_feedback (const MetaKmsFeedback *kms_feedback,
g_warning ("Page flip failed: %s", error->message);
frame_info = cogl_onscreen_peek_head_frame_info (onscreen);
@ -1909,7 +1823,7 @@ index 1a31f04a16..ba5090b3cc 100644
}
static const MetaKmsResultListenerVtable swap_buffer_result_listener_vtable = {
@@ -1279,32 +1355,38 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
@@ -1308,32 +1362,38 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
MetaRendererNativeGpuData *renderer_gpu_data = cogl_renderer_egl->platform;
MetaRendererNative *renderer_native = renderer_gpu_data->renderer_native;
@ -1956,7 +1870,7 @@ index 1a31f04a16..ba5090b3cc 100644
secondary_gpu_fb =
update_secondary_gpu_state_pre_swap_buffers (onscreen,
rectangles,
@@ -1371,21 +1453,17 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
@@ -1400,21 +1460,17 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
#endif
}
@ -1984,7 +1898,7 @@ index 1a31f04a16..ba5090b3cc 100644
{
g_warning ("Failed to ensure KMS FB ID on %s: %s",
meta_device_file_get_path (render_device_file),
@@ -1404,6 +1482,11 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
@@ -1433,6 +1489,11 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
#endif
}
@ -1996,7 +1910,7 @@ index 1a31f04a16..ba5090b3cc 100644
/*
* If we changed EGL context, cogl will have the wrong idea about what is
* current, making it fail to set it when it needs to. Avoid that by making
@@ -1413,12 +1496,73 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
@@ -1442,12 +1503,73 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
if (egl_context_changed)
_cogl_winsys_egl_ensure_current (cogl_display);
@ -2072,7 +1986,7 @@ index 1a31f04a16..ba5090b3cc 100644
kms_update = meta_frame_native_ensure_kms_update (frame_native,
kms_device);
meta_kms_update_add_result_listener (kms_update,
@@ -1440,13 +1584,11 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
@@ -1469,13 +1591,11 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
{
meta_renderer_native_queue_power_save_page_flip (renderer_native,
onscreen);
@ -2087,7 +2001,7 @@ index 1a31f04a16..ba5090b3cc 100644
switch (renderer_gpu_data->mode)
{
@@ -1461,8 +1603,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
@@ -1490,8 +1610,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
kms_update = meta_frame_native_steal_kms_update (frame_native);
meta_renderer_native_queue_mode_set_update (renderer_native,
kms_update);
@ -2096,7 +2010,7 @@ index 1a31f04a16..ba5090b3cc 100644
return;
}
else if (meta_renderer_native_has_pending_mode_set (renderer_native))
@@ -1476,8 +1616,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
@@ -1505,8 +1623,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
meta_frame_native_steal_kms_update (frame_native);
meta_renderer_native_post_mode_set_updates (renderer_native);
@ -2105,7 +2019,7 @@ index 1a31f04a16..ba5090b3cc 100644
return;
}
break;
@@ -1493,8 +1631,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
@@ -1522,8 +1638,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
kms_update);
meta_renderer_native_post_mode_set_updates (renderer_native);
@ -2114,7 +2028,7 @@ index 1a31f04a16..ba5090b3cc 100644
return;
}
break;
@@ -1509,7 +1645,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
@@ -1538,7 +1652,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
kms_update = meta_frame_native_steal_kms_update (frame_native);
meta_kms_device_post_update (kms_device, kms_update,
META_KMS_UPDATE_FLAG_NONE);
@ -2122,7 +2036,7 @@ index 1a31f04a16..ba5090b3cc 100644
}
gboolean
@@ -1577,11 +1712,15 @@ scanout_result_feedback (const MetaKmsFeedback *kms_feedback,
@@ -1606,11 +1719,15 @@ scanout_result_feedback (const MetaKmsFeedback *kms_feedback,
G_IO_ERROR_PERMISSION_DENIED))
{
ClutterStageView *view = CLUTTER_STAGE_VIEW (onscreen_native->view);
@ -2140,7 +2054,7 @@ index 1a31f04a16..ba5090b3cc 100644
clutter_stage_view_add_redraw_clip (view, NULL);
clutter_stage_view_schedule_update_now (view);
}
@@ -1590,7 +1729,7 @@ scanout_result_feedback (const MetaKmsFeedback *kms_feedback,
@@ -1619,7 +1736,7 @@ scanout_result_feedback (const MetaKmsFeedback *kms_feedback,
frame_info->flags |= COGL_FRAME_INFO_FLAG_SYMBOLIC;
meta_onscreen_native_notify_frame_complete (onscreen);
@ -2149,7 +2063,7 @@ index 1a31f04a16..ba5090b3cc 100644
}
static const MetaKmsResultListenerVtable scanout_result_listener_vtable = {
@@ -1642,16 +1781,28 @@ meta_onscreen_native_direct_scanout (CoglOnscreen *onscreen,
@@ -1671,16 +1788,28 @@ meta_onscreen_native_direct_scanout (CoglOnscreen *onscreen,
return FALSE;
}
@ -2183,7 +2097,7 @@ index 1a31f04a16..ba5090b3cc 100644
frame_info->cpu_time_before_buffer_swap_us = g_get_monotonic_time ();
@@ -1757,11 +1908,15 @@ meta_onscreen_native_before_redraw (CoglOnscreen *onscreen,
@@ -1786,11 +1915,15 @@ meta_onscreen_native_before_redraw (CoglOnscreen *onscreen,
ClutterFrame *frame)
{
MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen);
@ -2203,64 +2117,7 @@ index 1a31f04a16..ba5090b3cc 100644
maybe_update_frame_sync (onscreen_native, frame);
}
@@ -1776,7 +1931,7 @@ meta_onscreen_native_prepare_frame (CoglOnscreen *onscreen,
MetaKmsDevice *kms_device = meta_kms_crtc_get_device (kms_crtc);;
MetaFrameNative *frame_native = meta_frame_native_from_frame (frame);
- if (onscreen_native->is_gamma_lut_invalid)
+ if (onscreen_native->property.gamma_lut.invalidated)
{
const MetaGammaLut *gamma;
MetaKmsUpdate *kms_update;
@@ -1786,9 +1941,11 @@ meta_onscreen_native_prepare_frame (CoglOnscreen *onscreen,
gamma = meta_crtc_kms_peek_gamma_lut (crtc_kms);
meta_kms_update_set_crtc_gamma (kms_update, kms_crtc, gamma);
+ onscreen_native->property.gamma_lut.invalidated = FALSE;
+ onscreen_native->property.gamma_lut.updates_pending++;
}
- if (onscreen_native->is_privacy_screen_invalid)
+ if (onscreen_native->property.privacy_screen.invalidated)
{
MetaKmsConnector *kms_connector =
meta_output_kms_get_kms_connector (output_kms);
@@ -1800,9 +1957,11 @@ meta_onscreen_native_prepare_frame (CoglOnscreen *onscreen,
enabled = meta_output_is_privacy_screen_enabled (onscreen_native->output);
meta_kms_update_set_privacy_screen (kms_update, kms_connector, enabled);
+ onscreen_native->property.privacy_screen.invalidated = FALSE;
+ onscreen_native->property.privacy_screen.updates_pending++;
}
- if (onscreen_native->is_color_space_invalid)
+ if (onscreen_native->property.color_space.invalidated)
{
MetaKmsConnector *kms_connector =
meta_output_kms_get_kms_connector (output_kms);
@@ -1814,9 +1973,11 @@ meta_onscreen_native_prepare_frame (CoglOnscreen *onscreen,
color_space = meta_output_peek_color_space (onscreen_native->output);
meta_kms_update_set_color_space (kms_update, kms_connector, color_space);
+ onscreen_native->property.color_space.invalidated = FALSE;
+ onscreen_native->property.color_space.updates_pending++;
}
- if (onscreen_native->is_hdr_metadata_invalid)
+ if (onscreen_native->property.hdr_metadata.invalidated)
{
MetaKmsConnector *kms_connector =
meta_output_kms_get_kms_connector (output_kms);
@@ -1828,6 +1989,8 @@ meta_onscreen_native_prepare_frame (CoglOnscreen *onscreen,
metadata = meta_output_peek_hdr_metadata (onscreen_native->output);
meta_kms_update_set_hdr_metadata (kms_update, kms_connector, metadata);
+ onscreen_native->property.hdr_metadata.invalidated = FALSE;
+ onscreen_native->property.hdr_metadata.updates_pending++;
}
}
@@ -1877,22 +2040,79 @@ meta_onscreen_native_finish_frame (CoglOnscreen *onscreen,
@@ -1919,22 +2052,79 @@ meta_onscreen_native_finish_frame (CoglOnscreen *onscreen,
MetaKmsDevice *kms_device = meta_kms_crtc_get_device (kms_crtc);
MetaFrameNative *frame_native = meta_frame_native_from_frame (frame);
MetaKmsUpdate *kms_update;
@ -2348,7 +2205,7 @@ index 1a31f04a16..ba5090b3cc 100644
meta_kms_update_add_result_listener (kms_update,
&finish_frame_result_listener_vtable,
NULL,
@@ -1915,7 +2135,17 @@ meta_onscreen_native_finish_frame (CoglOnscreen *onscreen,
@@ -1957,7 +2147,17 @@ meta_onscreen_native_finish_frame (CoglOnscreen *onscreen,
meta_kms_update_set_flushing (kms_update, kms_crtc);
meta_kms_device_post_update (kms_device, kms_update,
META_KMS_UPDATE_FLAG_NONE);
@ -2367,125 +2224,7 @@ index 1a31f04a16..ba5090b3cc 100644
}
static gboolean
@@ -2677,15 +2907,15 @@ meta_onscreen_native_invalidate (MetaOnscreenNative *onscreen_native)
meta_output_get_info (onscreen_native->output);
if (meta_crtc_get_gamma_lut_size (onscreen_native->crtc) > 0)
- onscreen_native->is_gamma_lut_invalid = TRUE;
+ onscreen_native->property.gamma_lut.invalidated = TRUE;
if (output_info->supports_privacy_screen)
- onscreen_native->is_privacy_screen_invalid = TRUE;
+ onscreen_native->property.privacy_screen.invalidated = TRUE;
if (output_info->supported_color_spaces &
(1 << META_OUTPUT_COLORSPACE_DEFAULT))
- onscreen_native->is_color_space_invalid = TRUE;
+ onscreen_native->property.color_space.invalidated = TRUE;
if (output_info->supported_hdr_eotfs &
(1 << META_OUTPUT_HDR_METADATA_EOTF_TRADITIONAL_GAMMA_SDR))
- onscreen_native->is_hdr_metadata_invalid = TRUE;
+ onscreen_native->property.hdr_metadata.invalidated = TRUE;
}
static void
@@ -2694,7 +2924,7 @@ on_gamma_lut_changed (MetaCrtc *crtc,
{
ClutterStageView *stage_view = CLUTTER_STAGE_VIEW (onscreen_native->view);
- onscreen_native->is_gamma_lut_invalid = TRUE;
+ onscreen_native->property.gamma_lut.invalidated = TRUE;
clutter_stage_view_schedule_update (stage_view);
}
@@ -2705,7 +2935,7 @@ on_privacy_screen_enabled_changed (MetaOutput *output,
{
ClutterStageView *stage_view = CLUTTER_STAGE_VIEW (onscreen_native->view);
- onscreen_native->is_privacy_screen_invalid = TRUE;
+ onscreen_native->property.privacy_screen.invalidated = TRUE;
clutter_stage_view_schedule_update (stage_view);
}
@@ -2715,7 +2945,7 @@ on_color_space_changed (MetaOutput *output,
{
ClutterStageView *stage_view = CLUTTER_STAGE_VIEW (onscreen_native->view);
- onscreen_native->is_color_space_invalid = TRUE;
+ onscreen_native->property.color_space.invalidated = TRUE;
clutter_stage_view_schedule_update (stage_view);
}
@@ -2725,7 +2955,7 @@ on_hdr_metadata_changed (MetaOutput *output,
{
ClutterStageView *stage_view = CLUTTER_STAGE_VIEW (onscreen_native->view);
- onscreen_native->is_hdr_metadata_invalid = TRUE;
+ onscreen_native->property.hdr_metadata.invalidated = TRUE;
clutter_stage_view_schedule_update (stage_view);
}
@@ -2760,8 +2990,8 @@ meta_onscreen_native_new (MetaRendererNative *renderer_native,
if (meta_crtc_get_gamma_lut_size (crtc) > 0)
{
- onscreen_native->is_gamma_lut_invalid = TRUE;
- onscreen_native->gamma_lut_changed_handler_id =
+ onscreen_native->property.gamma_lut.invalidated = TRUE;
+ onscreen_native->property.gamma_lut.signal_handler_id =
g_signal_connect (crtc, "gamma-lut-changed",
G_CALLBACK (on_gamma_lut_changed),
onscreen_native);
@@ -2769,8 +2999,8 @@ meta_onscreen_native_new (MetaRendererNative *renderer_native,
if (output_info->supports_privacy_screen)
{
- onscreen_native->is_privacy_screen_invalid = TRUE;
- onscreen_native->privacy_screen_changed_handler_id =
+ onscreen_native->property.privacy_screen.invalidated = TRUE;
+ onscreen_native->property.privacy_screen.signal_handler_id =
g_signal_connect (output, "notify::is-privacy-screen-enabled",
G_CALLBACK (on_privacy_screen_enabled_changed),
onscreen_native);
@@ -2779,8 +3009,8 @@ meta_onscreen_native_new (MetaRendererNative *renderer_native,
if (output_info->supported_color_spaces &
(1 << META_OUTPUT_COLORSPACE_DEFAULT))
{
- onscreen_native->is_color_space_invalid = TRUE;
- onscreen_native->color_space_changed_handler_id =
+ onscreen_native->property.color_space.invalidated = TRUE;
+ onscreen_native->property.color_space.signal_handler_id =
g_signal_connect (output, "color-space-changed",
G_CALLBACK (on_color_space_changed),
onscreen_native);
@@ -2789,8 +3019,8 @@ meta_onscreen_native_new (MetaRendererNative *renderer_native,
if (output_info->supported_hdr_eotfs &
(1 << META_OUTPUT_HDR_METADATA_EOTF_TRADITIONAL_GAMMA_SDR))
{
- onscreen_native->is_hdr_metadata_invalid = TRUE;
- onscreen_native->hdr_metadata_changed_handler_id =
+ onscreen_native->property.hdr_metadata.invalidated = TRUE;
+ onscreen_native->property.hdr_metadata.signal_handler_id =
g_signal_connect (output, "hdr-metadata-changed",
G_CALLBACK (on_hdr_metadata_changed),
onscreen_native);
@@ -2802,13 +3032,13 @@ meta_onscreen_native_new (MetaRendererNative *renderer_native,
static void
clear_invalidation_handlers (MetaOnscreenNative *onscreen_native)
{
- g_clear_signal_handler (&onscreen_native->gamma_lut_changed_handler_id,
+ g_clear_signal_handler (&onscreen_native->property.gamma_lut.signal_handler_id,
onscreen_native->crtc);
- g_clear_signal_handler (&onscreen_native->privacy_screen_changed_handler_id,
+ g_clear_signal_handler (&onscreen_native->property.privacy_screen.signal_handler_id,
onscreen_native->output);
- g_clear_signal_handler (&onscreen_native->color_space_changed_handler_id,
+ g_clear_signal_handler (&onscreen_native->property.color_space.signal_handler_id,
onscreen_native->output);
- g_clear_signal_handler (&onscreen_native->hdr_metadata_changed_handler_id,
+ g_clear_signal_handler (&onscreen_native->property.hdr_metadata.signal_handler_id,
onscreen_native->output);
}
@@ -2823,15 +3053,17 @@ meta_onscreen_native_dispose (GObject *object)
@@ -2865,15 +3065,17 @@ meta_onscreen_native_dispose (GObject *object)
meta_onscreen_native_detach (onscreen_native);

View file

@ -1,36 +0,0 @@
From d99a0017e66bdd0e1a278e6b08126f5b04cac096 Mon Sep 17 00:00:00 2001
From: Daniel van Vugt <daniel.van.vugt@canonical.com>
Date: Tue, 7 Nov 2023 16:30:01 +0200
Subject: [PATCH] kms/crtc: Increase default deadline evasion to 1000
microseconds
This seems to be enough to fix cursor stutter on X1 Carbon 10 (OLED)
where the display is 90Hz and the touchpad ~145Hz.
Bug: https://gitlab.gnome.org/GNOME/mutter/-/issues/3146
Bug-Ubuntu: https://launchpad.net/bugs/2040977
Origin: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3373
Commit: 83de83513cbe6904e744ed4b495d835128f27434
Signed-off-by: Mingi Sung <sungmg@saltyming.net>
---
src/backends/native/meta-kms-crtc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/backends/native/meta-kms-crtc.c b/src/backends/native/meta-kms-crtc.c
index a0872089a0..8fcb2d9495 100644
--- a/src/backends/native/meta-kms-crtc.c
+++ b/src/backends/native/meta-kms-crtc.c
@@ -28,7 +28,7 @@
#include "backends/native/meta-kms-update-private.h"
#include "backends/native/meta-kms-utils.h"
-#define DEADLINE_EVASION_US 800
+#define DEADLINE_EVASION_US 1000
#define DEADLINE_EVASION_WITH_KMS_TOPIC_US 1000
#define MINIMUM_REFRESH_RATE 30.f
--
2.46.0

View file

@ -1,295 +0,0 @@
From 9cc50ce03e29614740a1e524866f113dbf7fe27c Mon Sep 17 00:00:00 2001
From: Daniel van Vugt <daniel.van.vugt@canonical.com>
Date: Mon, 29 Jul 2024 17:44:53 +0800
Subject: [PATCH] backends/native: Avoid duplicating or losing KMS property
sets
When triple buffering, `meta_onscreen_native_prepare_frame` for the next
frame is called before `notify_view_crtc_presented` for the previous frame.
So our booleans were unfortunately still TRUE in the second prepare_frame,
resulting in two frames with the same property updates.
When double buffering, having roughly one frame interval between
`meta_onscreen_native_prepare_frame` and `notify_view_crtc_presented`
meant that property updates signalled between the swap and presentation
wouldn't get attached to a KMS update, and would be forgotten when
`notify_view_crtc_presented` resets the flags to FALSE.
To solve these we now keep a separate flag and counter per property,
tracking invalidation and pending updates respectively. The latter is a
counter rather than a boolean in support of triple buffering where two
updates may be pending concurrently (next and posted).
Origin: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3912
Commit: f7b59445e437aa84ec00b372cd26f3b35ece7c8b
Signed-off-by: Mingi Sung <sungmg@saltyming.net>
---
src/backends/native/meta-onscreen-native.c | 104 +++++++++++++--------
1 file changed, 67 insertions(+), 37 deletions(-)
diff --git a/src/backends/native/meta-onscreen-native.c b/src/backends/native/meta-onscreen-native.c
index 1a31f04a16..60b7d877a5 100644
--- a/src/backends/native/meta-onscreen-native.c
+++ b/src/backends/native/meta-onscreen-native.c
@@ -84,6 +84,13 @@ typedef struct _MetaOnscreenNativeSecondaryGpuState
MetaSharedFramebufferImportStatus import_status;
} MetaOnscreenNativeSecondaryGpuState;
+typedef struct _KmsProperty
+{
+ gboolean invalidated;
+ int updates_pending;
+ gulong signal_handler_id;
+} KmsProperty;
+
struct _MetaOnscreenNative
{
CoglOnscreenEgl parent;
@@ -116,15 +123,15 @@ struct _MetaOnscreenNative
MetaRendererView *view;
- gboolean is_gamma_lut_invalid;
- gboolean is_privacy_screen_invalid;
- gboolean is_color_space_invalid;
- gboolean is_hdr_metadata_invalid;
-
- gulong gamma_lut_changed_handler_id;
- gulong privacy_screen_changed_handler_id;
- gulong color_space_changed_handler_id;
- gulong hdr_metadata_changed_handler_id;
+ union {
+ struct {
+ KmsProperty gamma_lut;
+ KmsProperty privacy_screen;
+ KmsProperty color_space;
+ KmsProperty hdr_metadata;
+ } property;
+ KmsProperty properties[4];
+ };
};
G_DEFINE_TYPE (MetaOnscreenNative, meta_onscreen_native,
@@ -233,10 +240,13 @@ notify_view_crtc_presented (MetaRendererView *view,
g_return_if_fail (frame_info != NULL);
- onscreen_native->is_gamma_lut_invalid = FALSE;
- onscreen_native->is_privacy_screen_invalid = FALSE;
- onscreen_native->is_color_space_invalid = FALSE;
- onscreen_native->is_hdr_metadata_invalid = FALSE;
+ for (int i = 0; i < G_N_ELEMENTS (onscreen_native->properties); i++)
+ {
+ KmsProperty *prop = &onscreen_native->properties[i];
+
+ if (prop->updates_pending > 0)
+ prop->updates_pending--;
+ }
crtc = META_CRTC (meta_crtc_kms_from_kms_crtc (kms_crtc));
maybe_update_frame_info (crtc, frame_info, time_us, flags, sequence);
@@ -333,6 +343,7 @@ page_flip_feedback_discarded (MetaKmsCrtc *kms_crtc,
CoglFramebuffer *framebuffer =
clutter_stage_view_get_onscreen (CLUTTER_STAGE_VIEW (view));
CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer);
+ MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen);
CoglFrameInfo *frame_info;
/*
@@ -346,6 +357,17 @@ page_flip_feedback_discarded (MetaKmsCrtc *kms_crtc,
G_IO_ERROR_PERMISSION_DENIED))
g_warning ("Page flip discarded: %s", error->message);
+ for (int i = 0; i < G_N_ELEMENTS (onscreen_native->properties); i++)
+ {
+ KmsProperty *prop = &onscreen_native->properties[i];
+
+ if (prop->updates_pending > 0)
+ {
+ prop->invalidated = TRUE;
+ prop->updates_pending--;
+ }
+ }
+
frame_info = cogl_onscreen_peek_head_frame_info (onscreen);
frame_info->flags |= COGL_FRAME_INFO_FLAG_SYMBOLIC;
@@ -1776,7 +1798,7 @@ meta_onscreen_native_prepare_frame (CoglOnscreen *onscreen,
MetaKmsDevice *kms_device = meta_kms_crtc_get_device (kms_crtc);;
MetaFrameNative *frame_native = meta_frame_native_from_frame (frame);
- if (onscreen_native->is_gamma_lut_invalid)
+ if (onscreen_native->property.gamma_lut.invalidated)
{
const MetaGammaLut *gamma;
MetaKmsUpdate *kms_update;
@@ -1786,9 +1808,11 @@ meta_onscreen_native_prepare_frame (CoglOnscreen *onscreen,
gamma = meta_crtc_kms_peek_gamma_lut (crtc_kms);
meta_kms_update_set_crtc_gamma (kms_update, kms_crtc, gamma);
+ onscreen_native->property.gamma_lut.invalidated = FALSE;
+ onscreen_native->property.gamma_lut.updates_pending++;
}
- if (onscreen_native->is_privacy_screen_invalid)
+ if (onscreen_native->property.privacy_screen.invalidated)
{
MetaKmsConnector *kms_connector =
meta_output_kms_get_kms_connector (output_kms);
@@ -1800,9 +1824,11 @@ meta_onscreen_native_prepare_frame (CoglOnscreen *onscreen,
enabled = meta_output_is_privacy_screen_enabled (onscreen_native->output);
meta_kms_update_set_privacy_screen (kms_update, kms_connector, enabled);
+ onscreen_native->property.privacy_screen.invalidated = FALSE;
+ onscreen_native->property.privacy_screen.updates_pending++;
}
- if (onscreen_native->is_color_space_invalid)
+ if (onscreen_native->property.color_space.invalidated)
{
MetaKmsConnector *kms_connector =
meta_output_kms_get_kms_connector (output_kms);
@@ -1814,9 +1840,11 @@ meta_onscreen_native_prepare_frame (CoglOnscreen *onscreen,
color_space = meta_output_peek_color_space (onscreen_native->output);
meta_kms_update_set_color_space (kms_update, kms_connector, color_space);
+ onscreen_native->property.color_space.invalidated = FALSE;
+ onscreen_native->property.color_space.updates_pending++;
}
- if (onscreen_native->is_hdr_metadata_invalid)
+ if (onscreen_native->property.hdr_metadata.invalidated)
{
MetaKmsConnector *kms_connector =
meta_output_kms_get_kms_connector (output_kms);
@@ -1828,6 +1856,8 @@ meta_onscreen_native_prepare_frame (CoglOnscreen *onscreen,
metadata = meta_output_peek_hdr_metadata (onscreen_native->output);
meta_kms_update_set_hdr_metadata (kms_update, kms_connector, metadata);
+ onscreen_native->property.hdr_metadata.invalidated = FALSE;
+ onscreen_native->property.hdr_metadata.updates_pending++;
}
}
@@ -2677,15 +2707,15 @@ meta_onscreen_native_invalidate (MetaOnscreenNative *onscreen_native)
meta_output_get_info (onscreen_native->output);
if (meta_crtc_get_gamma_lut_size (onscreen_native->crtc) > 0)
- onscreen_native->is_gamma_lut_invalid = TRUE;
+ onscreen_native->property.gamma_lut.invalidated = TRUE;
if (output_info->supports_privacy_screen)
- onscreen_native->is_privacy_screen_invalid = TRUE;
+ onscreen_native->property.privacy_screen.invalidated = TRUE;
if (output_info->supported_color_spaces &
(1 << META_OUTPUT_COLORSPACE_DEFAULT))
- onscreen_native->is_color_space_invalid = TRUE;
+ onscreen_native->property.color_space.invalidated = TRUE;
if (output_info->supported_hdr_eotfs &
(1 << META_OUTPUT_HDR_METADATA_EOTF_TRADITIONAL_GAMMA_SDR))
- onscreen_native->is_hdr_metadata_invalid = TRUE;
+ onscreen_native->property.hdr_metadata.invalidated = TRUE;
}
static void
@@ -2694,7 +2724,7 @@ on_gamma_lut_changed (MetaCrtc *crtc,
{
ClutterStageView *stage_view = CLUTTER_STAGE_VIEW (onscreen_native->view);
- onscreen_native->is_gamma_lut_invalid = TRUE;
+ onscreen_native->property.gamma_lut.invalidated = TRUE;
clutter_stage_view_schedule_update (stage_view);
}
@@ -2705,7 +2735,7 @@ on_privacy_screen_enabled_changed (MetaOutput *output,
{
ClutterStageView *stage_view = CLUTTER_STAGE_VIEW (onscreen_native->view);
- onscreen_native->is_privacy_screen_invalid = TRUE;
+ onscreen_native->property.privacy_screen.invalidated = TRUE;
clutter_stage_view_schedule_update (stage_view);
}
@@ -2715,7 +2745,7 @@ on_color_space_changed (MetaOutput *output,
{
ClutterStageView *stage_view = CLUTTER_STAGE_VIEW (onscreen_native->view);
- onscreen_native->is_color_space_invalid = TRUE;
+ onscreen_native->property.color_space.invalidated = TRUE;
clutter_stage_view_schedule_update (stage_view);
}
@@ -2725,7 +2755,7 @@ on_hdr_metadata_changed (MetaOutput *output,
{
ClutterStageView *stage_view = CLUTTER_STAGE_VIEW (onscreen_native->view);
- onscreen_native->is_hdr_metadata_invalid = TRUE;
+ onscreen_native->property.hdr_metadata.invalidated = TRUE;
clutter_stage_view_schedule_update (stage_view);
}
@@ -2760,8 +2790,8 @@ meta_onscreen_native_new (MetaRendererNative *renderer_native,
if (meta_crtc_get_gamma_lut_size (crtc) > 0)
{
- onscreen_native->is_gamma_lut_invalid = TRUE;
- onscreen_native->gamma_lut_changed_handler_id =
+ onscreen_native->property.gamma_lut.invalidated = TRUE;
+ onscreen_native->property.gamma_lut.signal_handler_id =
g_signal_connect (crtc, "gamma-lut-changed",
G_CALLBACK (on_gamma_lut_changed),
onscreen_native);
@@ -2769,8 +2799,8 @@ meta_onscreen_native_new (MetaRendererNative *renderer_native,
if (output_info->supports_privacy_screen)
{
- onscreen_native->is_privacy_screen_invalid = TRUE;
- onscreen_native->privacy_screen_changed_handler_id =
+ onscreen_native->property.privacy_screen.invalidated = TRUE;
+ onscreen_native->property.privacy_screen.signal_handler_id =
g_signal_connect (output, "notify::is-privacy-screen-enabled",
G_CALLBACK (on_privacy_screen_enabled_changed),
onscreen_native);
@@ -2779,8 +2809,8 @@ meta_onscreen_native_new (MetaRendererNative *renderer_native,
if (output_info->supported_color_spaces &
(1 << META_OUTPUT_COLORSPACE_DEFAULT))
{
- onscreen_native->is_color_space_invalid = TRUE;
- onscreen_native->color_space_changed_handler_id =
+ onscreen_native->property.color_space.invalidated = TRUE;
+ onscreen_native->property.color_space.signal_handler_id =
g_signal_connect (output, "color-space-changed",
G_CALLBACK (on_color_space_changed),
onscreen_native);
@@ -2789,8 +2819,8 @@ meta_onscreen_native_new (MetaRendererNative *renderer_native,
if (output_info->supported_hdr_eotfs &
(1 << META_OUTPUT_HDR_METADATA_EOTF_TRADITIONAL_GAMMA_SDR))
{
- onscreen_native->is_hdr_metadata_invalid = TRUE;
- onscreen_native->hdr_metadata_changed_handler_id =
+ onscreen_native->property.hdr_metadata.invalidated = TRUE;
+ onscreen_native->property.hdr_metadata.signal_handler_id =
g_signal_connect (output, "hdr-metadata-changed",
G_CALLBACK (on_hdr_metadata_changed),
onscreen_native);
@@ -2802,13 +2832,13 @@ meta_onscreen_native_new (MetaRendererNative *renderer_native,
static void
clear_invalidation_handlers (MetaOnscreenNative *onscreen_native)
{
- g_clear_signal_handler (&onscreen_native->gamma_lut_changed_handler_id,
+ g_clear_signal_handler (&onscreen_native->property.gamma_lut.signal_handler_id,
onscreen_native->crtc);
- g_clear_signal_handler (&onscreen_native->privacy_screen_changed_handler_id,
+ g_clear_signal_handler (&onscreen_native->property.privacy_screen.signal_handler_id,
onscreen_native->output);
- g_clear_signal_handler (&onscreen_native->color_space_changed_handler_id,
+ g_clear_signal_handler (&onscreen_native->property.color_space.signal_handler_id,
onscreen_native->output);
- g_clear_signal_handler (&onscreen_native->hdr_metadata_changed_handler_id,
+ g_clear_signal_handler (&onscreen_native->property.hdr_metadata.signal_handler_id,
onscreen_native->output);
}
--
2.46.0

View file

@ -1,6 +1,6 @@
From 85e79bbb26f2248ec1387f89568c52c4b3048d67 Mon Sep 17 00:00:00 2001
From adb26372d0dc18c90293733f1c5f3b0479badf6c Mon Sep 17 00:00:00 2001
From: Mingi Sung <sungmg@saltyming.net>
Date: Wed, 14 Aug 2024 17:25:41 +0900
Date: Wed, 28 Aug 2024 20:21:07 +0900
Subject: [PATCH] Merge branch 'crtc_frame_deadline_dispatch-track-duration'
into gnome-46
MIME-Version: 1.0
@ -444,10 +444,10 @@ index 6758982a6a..6ce62cd697 100644
return;
diff --git a/src/backends/native/meta-onscreen-native.c b/src/backends/native/meta-onscreen-native.c
index 1a31f04a16..98e106fffa 100644
index 9b739faf39..b790c1e5c8 100644
--- a/src/backends/native/meta-onscreen-native.c
+++ b/src/backends/native/meta-onscreen-native.c
@@ -1757,11 +1757,15 @@ meta_onscreen_native_before_redraw (CoglOnscreen *onscreen,
@@ -1786,11 +1786,15 @@ meta_onscreen_native_before_redraw (CoglOnscreen *onscreen,
ClutterFrame *frame)
{
MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen);