From a0ae40539ecfe096e1b2d4ef6377edf487e693ec Mon Sep 17 00:00:00 2001 From: Mingi Sung Date: Mon, 5 Aug 2024 12:39:17 +0900 Subject: [PATCH] Sync to gnome-46 & Refresh patches Signed-off-by: Mingi Sung --- .SRCINFO | 30 +- PKGBUILD | 33 +- mr1441.patch | 919 ++++++++++++++++++++++++++++++++++++++++----------- mr3373.patch | 16 +- mr3567.patch | 110 +++--- mr3751.patch | 27 +- mr3912.patch | 264 +++++++++++++-- 7 files changed, 1081 insertions(+), 318 deletions(-) diff --git a/.SRCINFO b/.SRCINFO index 8a178ca..d71aeb4 100644 --- a/.SRCINFO +++ b/.SRCINFO @@ -1,7 +1,7 @@ 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.3.1+r5+g1ccf2cfb5 - pkgrel = 2 + pkgver = 46.4 + pkgrel = 1 epoch = 1 url = https://gitlab.gnome.org/GNOME/mutter arch = x86_64 @@ -73,24 +73,24 @@ pkgbase = mutter-performance depends = systemd-libs depends = wayland depends = xorg-xwayland - source = git+https://gitlab.gnome.org/GNOME/mutter.git#commit=1ccf2cfb568d4f9aeee2d23e5ededca21927d133 + source = git+https://gitlab.gnome.org/GNOME/mutter.git#commit=04995f56641012d71b5b226782e63d82c3ca3081 source = mr1441.patch source = mr3373.patch source = mr3567.patch source = mr3751.patch source = mr3912.patch - sha256sums = 893c784ff14ab886615e7a58cd37c2409895fd73b8c95cc83fca209fbecbc1aa - sha256sums = 7a5e1bcc90bbab100bf57b0dd052a96f34dd1673a5f43e53acd34ee648fd7b29 - sha256sums = 3e1f07b696ad37b1c639a524c092cd9259444bc6156542901ccaec936bea240f - sha256sums = 47885ffe6c0aa06fa798cc0b9b48b4f6acf21b6f250b7003819db3854d52635a - sha256sums = 9d925b810629074285388b5a1a9a88514a6cb45463a98ada6f66c2cba2ad9d2f - sha256sums = 43ea9e96f2bafaa40edc48510b1391a055ee507af82d81721fb76752c9295c6b - b2sums = 3d2fccc192c53d7c80ba7f6d97e6392d8e5d6d884161b4b9d120294cc95627167e45d43737374781a8e52ca64e21caab3a07abb7bc38e3f358e593c43d9e69c6 - b2sums = 55bf09c286a361297952dc55670e3974ad35a91d54649892259fe423c422c6580e00e9f194bad97bebe3c53a65858a23d6e332d426c8572bd14cdc8e5cbcbbfb - b2sums = 71f10db4ebe04a787940c7048131eac67cffd3ec8e415cfc961b8041b881f272650581e9df273e2a8da23a50ec9151c790dc2d5ecc0309ab2847a22f8c922c9c - b2sums = 8e57fa09e4742cf350436c5d54f3114495543151df71fbb684199d85ca9b138bcedd1dfb5df5724d0efc74aa786f6b1ebf54f3c260a48a4937a700dcb1d5b178 - b2sums = f720718049c1f9d0f338c203a5ae4520b5e7079b57e692ec95d8183705d7b7627ccd7d3d350d0010d0b225226641afccd699b65a81bd044fd32c441d413a0779 - b2sums = f7a7ef368d2d15cc7edcb1d2def23ed9a349410620aeebe83d8ca0e612dad868e7a2fe731323bd4382fb4cef71d65a15c849df0b4ff0f8da972261728fdf6f6f + sha256sums = 864cce3adbb04b4213fda77b715f84fe1ed918a58adbc251c4804bbaf6e348ed + sha256sums = 07909ef8fc77f5527e169c31637a3bfdf080bc8040863f059db5541b35ec6ff7 + sha256sums = 1292f1dcefa0a3cfff753db942e7c974e39b1265d246634f239aad9437d45609 + sha256sums = 2e474a574edad8dc047a53a920fc7cbe005cac0102907eef80a252fc556d0517 + sha256sums = 4c15b0e6d0001c8c3feedf05a9140f7f17d52eb36ff7b8039e0281c1373ccdfe + sha256sums = f02f07abc4072118e175e8028d3ee16ff0aa9b238dd2b10155b3ae2a0534a4a0 + b2sums = fc21cb8e56728873196fba12ba7a0522aeb9d6e7f6204ac21ade4c632b081fe45e0633d1c072c2416d81faa0f6b63cb69b278ef7b440e2bfccaff775501d3028 + b2sums = 0419379cda7871c0b45b7a707948738b5a55fd81083ba325e915928aaa731cd2be23cebddf04b179bc69a26e1f4176b06fabb4d5baffba604a4980f578f5ba4d + b2sums = 38de03d5fbe7c9d1b9c41a4bc6b76b8d3acc270b93f279c5db591d79a689d9ea748f34da08ec584e49bbfc2d35a5bceeaf2f6b3fd91bc620139b4ee8b4ca6a04 + b2sums = 65302b1fa24a7aba26915269fb694c7a64b134ee2062ec7e649036a3a41efb2f2f4110cff6194808af34985855ade641c5fb01f0b97536cd3c912892ea3a0d4c + b2sums = f9f2284d7236d6072a818de3784a339c2d934490da8870876f49d4effd59ce807593ce8b8a3c5e06586fd5fd7e81fb31fedca84115acf1e71cfe23d4a5e727b3 + b2sums = 14ed5e8fe9844739903150bf69de03b7136e74eb4b080d2e0264ba9bf5f2ba2c826cb45b78f8c38b2e80c223dd7926aa8e756e9bee23b75ced16ba5af45c2d8d pkgname = mutter-performance groups = gnome diff --git a/PKGBUILD b/PKGBUILD index a9383ec..1b32913 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -12,7 +12,7 @@ ### PACKAGE OPTIONS ## MERGE REQUESTS SELECTION # Merge Requests List: ('579' '1441' '3373' '3567' '3751' '3912') -_merge_requests_to_use=('1441' '3751' '3912') +_merge_requests_to_use=('1441' '3751') ## Disable building the DOCS package (Enabled if not set) # Remember to unset this variable when producing .SRCINFO @@ -32,8 +32,8 @@ else pkgname=(mutter-performance mutter-performance-docs) fi epoch=1 -pkgver=46.3.1+r5+g1ccf2cfb5 -pkgrel=2 +pkgver=46.4 +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" arch=(x86_64 aarch64) @@ -112,25 +112,25 @@ makedepends=( if [ -n "$_enable_check" ]; then checkdepends=(gnome-session xorg-server-xvfb pipewire-session-manager python-dbusmock zenity) fi -_commit=1ccf2cfb568d4f9aeee2d23e5ededca21927d133 # tags/46.3.1^5 +_commit=04995f56641012d71b5b226782e63d82c3ca3081 # tags/46.4^0 source=("git+$url.git#commit=$_commit" 'mr1441.patch' 'mr3373.patch' 'mr3567.patch' 'mr3751.patch' 'mr3912.patch') -sha256sums=('893c784ff14ab886615e7a58cd37c2409895fd73b8c95cc83fca209fbecbc1aa' - '7a5e1bcc90bbab100bf57b0dd052a96f34dd1673a5f43e53acd34ee648fd7b29' - '3e1f07b696ad37b1c639a524c092cd9259444bc6156542901ccaec936bea240f' - '47885ffe6c0aa06fa798cc0b9b48b4f6acf21b6f250b7003819db3854d52635a' - '9d925b810629074285388b5a1a9a88514a6cb45463a98ada6f66c2cba2ad9d2f' - '43ea9e96f2bafaa40edc48510b1391a055ee507af82d81721fb76752c9295c6b') -b2sums=('3d2fccc192c53d7c80ba7f6d97e6392d8e5d6d884161b4b9d120294cc95627167e45d43737374781a8e52ca64e21caab3a07abb7bc38e3f358e593c43d9e69c6' - '55bf09c286a361297952dc55670e3974ad35a91d54649892259fe423c422c6580e00e9f194bad97bebe3c53a65858a23d6e332d426c8572bd14cdc8e5cbcbbfb' - '71f10db4ebe04a787940c7048131eac67cffd3ec8e415cfc961b8041b881f272650581e9df273e2a8da23a50ec9151c790dc2d5ecc0309ab2847a22f8c922c9c' - '8e57fa09e4742cf350436c5d54f3114495543151df71fbb684199d85ca9b138bcedd1dfb5df5724d0efc74aa786f6b1ebf54f3c260a48a4937a700dcb1d5b178' - 'f720718049c1f9d0f338c203a5ae4520b5e7079b57e692ec95d8183705d7b7627ccd7d3d350d0010d0b225226641afccd699b65a81bd044fd32c441d413a0779' - 'f7a7ef368d2d15cc7edcb1d2def23ed9a349410620aeebe83d8ca0e612dad868e7a2fe731323bd4382fb4cef71d65a15c849df0b4ff0f8da972261728fdf6f6f') +sha256sums=('864cce3adbb04b4213fda77b715f84fe1ed918a58adbc251c4804bbaf6e348ed' + '07909ef8fc77f5527e169c31637a3bfdf080bc8040863f059db5541b35ec6ff7' + '1292f1dcefa0a3cfff753db942e7c974e39b1265d246634f239aad9437d45609' + '2e474a574edad8dc047a53a920fc7cbe005cac0102907eef80a252fc556d0517' + '4c15b0e6d0001c8c3feedf05a9140f7f17d52eb36ff7b8039e0281c1373ccdfe' + 'f02f07abc4072118e175e8028d3ee16ff0aa9b238dd2b10155b3ae2a0534a4a0') +b2sums=('fc21cb8e56728873196fba12ba7a0522aeb9d6e7f6204ac21ade4c632b081fe45e0633d1c072c2416d81faa0f6b63cb69b278ef7b440e2bfccaff775501d3028' + '0419379cda7871c0b45b7a707948738b5a55fd81083ba325e915928aaa731cd2be23cebddf04b179bc69a26e1f4176b06fabb4d5baffba604a4980f578f5ba4d' + '38de03d5fbe7c9d1b9c41a4bc6b76b8d3acc270b93f279c5db591d79a689d9ea748f34da08ec584e49bbfc2d35a5bceeaf2f6b3fd91bc620139b4ee8b4ca6a04' + '65302b1fa24a7aba26915269fb694c7a64b134ee2062ec7e649036a3a41efb2f2f4110cff6194808af34985855ade641c5fb01f0b97536cd3c912892ea3a0d4c' + 'f9f2284d7236d6072a818de3784a339c2d934490da8870876f49d4effd59ce807593ce8b8a3c5e06586fd5fd7e81fb31fedca84115acf1e71cfe23d4a5e727b3' + '14ed5e8fe9844739903150bf69de03b7136e74eb4b080d2e0264ba9bf5f2ba2c826cb45b78f8c38b2e80c223dd7926aa8e756e9bee23b75ced16ba5af45c2d8d') for mr in "${_merge_requests_to_use[@]}"; do if [ '3567' = "$mr" ]; then @@ -250,6 +250,7 @@ prepare() { # 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: Draft: Dynamic triple/double buffering (v4) diff --git a/mr1441.patch b/mr1441.patch index 52bbce4..f0c24f3 100644 --- a/mr1441.patch +++ b/mr1441.patch @@ -1,8 +1,7 @@ -From a04f307c44746fadb957aaf0f406a4fb9c2d5748 Mon Sep 17 00:00:00 2001 +From 41bcfacb47533d7aeff7398c641bf8bbe7c6e63f Mon Sep 17 00:00:00 2001 From: Mingi Sung -Date: Sun, 14 Jul 2024 08:22:25 +0900 -Subject: [PATCH] Merge remote-tracking branch 'Ubuntu/triple-buffering-v4-46' - into gnome-46 +Date: Mon, 5 Aug 2024 12:30:34 +0900 +Subject: [PATCH] Merge branch '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 @@ -17,11 +16,16 @@ there's no latency penalty when the system is able to maintain full frame rate. Author: Daniel van Vugt Source: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1441 Source: https://gitlab.gnome.org/Community/Ubuntu/mutter/-/tree/triple-buffering-v4-46 -Commit: 0d46de978d3dccc3784ba1902cbd9dada61d8a86 +Commit: 9abd14c9b77d382a8ef792d990d423fbb1db4698 + +Backported: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3799 +Backported: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3829 +Backported: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3830 +Backported: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3891 Signed-off-by: Mingi Sung --- - clutter/clutter/clutter-frame-clock.c | 369 +++++++++++++++++++++++------ + clutter/clutter/clutter-frame-clock.c | 372 +++++++++++++++---- clutter/clutter/clutter-frame-clock.h | 11 +- clutter/clutter/clutter-frame-private.h | 1 + clutter/clutter/clutter-frame.c | 13 + @@ -30,17 +34,19 @@ Signed-off-by: Mingi Sung cogl/cogl/cogl-onscreen-private.h | 5 +- cogl/cogl/cogl-onscreen.c | 8 + src/backends/meta-stage-impl.c | 2 + + src/backends/native/meta-frame-native.c | 63 ++++ + src/backends/native/meta-frame-native.h | 20 + src/backends/native/meta-kms-impl-device.c | 4 +- src/backends/native/meta-kms.c | 9 + src/backends/native/meta-kms.h | 2 + - src/backends/native/meta-onscreen-native.c | 368 ++++++++++++++++++++++------ + src/backends/native/meta-onscreen-native.c | 574 ++++++++++++++++++++--------- src/backends/native/meta-onscreen-native.h | 2 + - src/backends/native/meta-renderer-native.c | 34 ++- - src/tests/native-kms-render.c | 106 +++++++-- - 16 files changed, 779 insertions(+), 173 deletions(-) + src/backends/native/meta-renderer-native.c | 34 +- + src/tests/native-kms-render.c | 106 +++++- + 18 files changed, 973 insertions(+), 271 deletions(-) diff --git a/clutter/clutter/clutter-frame-clock.c b/clutter/clutter/clutter-frame-clock.c -index 30a319f604..75e33088c1 100644 +index 30a319f604..e91b31d80b 100644 --- a/clutter/clutter/clutter-frame-clock.c +++ b/clutter/clutter/clutter-frame-clock.c @@ -42,6 +42,15 @@ enum @@ -114,7 +120,7 @@ index 30a319f604..75e33088c1 100644 COGL_TRACE_BEGIN_SCOPED (ClutterFrameClockNotifyPresented, "Clutter::FrameClock::presented()"); COGL_TRACE_DESCRIBE (ClutterFrameClockNotifyPresented, -@@ -366,22 +383,52 @@ clutter_frame_clock_notify_presented (ClutterFrameClock *frame_clock, +@@ -366,22 +383,54 @@ clutter_frame_clock_notify_presented (ClutterFrameClock *frame_clock, frame_clock->got_measurements_last_frame = FALSE; @@ -152,9 +158,11 @@ index 30a319f604..75e33088c1 100644 + + if (frame_info->cpu_time_before_buffer_swap_us == 0) + { -+ /* Cursor-only updates with no "swap" or "flip" */ ++ /* User thread cursor-only updates with no "swap": we do know ++ * the combined time from dispatch to flip at least. ++ */ + dispatch_to_swap_us = 0; -+ swap_to_flip_us = 0; ++ swap_to_flip_us = flip_time_us - dispatch_time_us; + } + else + { @@ -176,7 +184,7 @@ index 30a319f604..75e33088c1 100644 frame_clock->last_dispatch_lateness_us, dispatch_to_swap_us, swap_to_rendering_done_us, -@@ -391,7 +438,7 @@ clutter_frame_clock_notify_presented (ClutterFrameClock *frame_clock, +@@ -391,7 +440,7 @@ clutter_frame_clock_notify_presented (ClutterFrameClock *frame_clock, CLAMP (frame_clock->last_dispatch_lateness_us + dispatch_to_swap_us + MAX (swap_to_rendering_done_us, swap_to_flip_us), frame_clock->shortterm_max_update_duration_us, @@ -185,7 +193,7 @@ index 30a319f604..75e33088c1 100644 maybe_update_longterm_max_duration_us (frame_clock, frame_info); -@@ -400,7 +447,8 @@ clutter_frame_clock_notify_presented (ClutterFrameClock *frame_clock, +@@ -400,7 +449,8 @@ clutter_frame_clock_notify_presented (ClutterFrameClock *frame_clock, } else { @@ -195,7 +203,7 @@ index 30a319f604..75e33088c1 100644 frame_clock->last_dispatch_lateness_us); } -@@ -418,11 +466,22 @@ clutter_frame_clock_notify_presented (ClutterFrameClock *frame_clock, +@@ -418,11 +468,22 @@ clutter_frame_clock_notify_presented (ClutterFrameClock *frame_clock, case CLUTTER_FRAME_CLOCK_STATE_SCHEDULED_NOW: g_warn_if_reached (); break; @@ -220,7 +228,7 @@ index 30a319f604..75e33088c1 100644 } } -@@ -440,26 +499,37 @@ clutter_frame_clock_notify_ready (ClutterFrameClock *frame_clock) +@@ -440,26 +501,37 @@ clutter_frame_clock_notify_ready (ClutterFrameClock *frame_clock) case CLUTTER_FRAME_CLOCK_STATE_SCHEDULED_NOW: g_warn_if_reached (); break; @@ -264,7 +272,7 @@ index 30a319f604..75e33088c1 100644 /* Max render time shows how early the frame clock needs to be dispatched * to make it to the predicted next presentation time. It is an estimate of -@@ -473,15 +543,15 @@ clutter_frame_clock_compute_max_render_time_us (ClutterFrameClock *frame_clock) +@@ -473,15 +545,15 @@ clutter_frame_clock_compute_max_render_time_us (ClutterFrameClock *frame_clock) * - The duration of vertical blank. * - A constant to account for variations in the above estimates. */ @@ -283,7 +291,7 @@ index 30a319f604..75e33088c1 100644 } static void -@@ -496,7 +566,9 @@ calculate_next_update_time_us (ClutterFrameClock *frame_clock, +@@ -496,7 +568,9 @@ calculate_next_update_time_us (ClutterFrameClock *frame_clock, int64_t min_render_time_allowed_us; int64_t max_render_time_allowed_us; int64_t next_presentation_time_us; @@ -293,7 +301,7 @@ index 30a319f604..75e33088c1 100644 now_us = g_get_monotonic_time (); -@@ -516,10 +588,13 @@ calculate_next_update_time_us (ClutterFrameClock *frame_clock, +@@ -516,10 +590,13 @@ calculate_next_update_time_us (ClutterFrameClock *frame_clock, } min_render_time_allowed_us = refresh_interval_us / 2; @@ -310,7 +318,7 @@ index 30a319f604..75e33088c1 100644 min_render_time_allowed_us = max_render_time_allowed_us; /* -@@ -540,7 +615,28 @@ calculate_next_update_time_us (ClutterFrameClock *frame_clock, +@@ -540,7 +617,29 @@ calculate_next_update_time_us (ClutterFrameClock *frame_clock, * */ last_presentation_time_us = frame_clock->last_presentation_time_us; @@ -331,6 +339,7 @@ index 30a319f604..75e33088c1 100644 + 2 * refresh_interval_us; + break; + case CLUTTER_FRAME_CLOCK_STATE_DISPATCHED_TWO: ++ g_warn_if_reached (); /* quad buffering would be a bug */ + next_smooth_presentation_time_us = last_presentation_time_us + + 3 * refresh_interval_us; + break; @@ -340,7 +349,7 @@ index 30a319f604..75e33088c1 100644 /* * However, the last presentation could have happened more than a frame ago. -@@ -607,7 +703,7 @@ calculate_next_update_time_us (ClutterFrameClock *frame_clock, +@@ -607,7 +706,7 @@ calculate_next_update_time_us (ClutterFrameClock *frame_clock, } if (frame_clock->last_presentation_flags & CLUTTER_FRAME_INFO_FLAG_VSYNC && @@ -349,7 +358,7 @@ index 30a319f604..75e33088c1 100644 { /* There was an idle period since the last presentation, so there seems * be no constantly updating actor. In this case it's best to start -@@ -619,6 +715,24 @@ calculate_next_update_time_us (ClutterFrameClock *frame_clock, +@@ -619,6 +718,24 @@ calculate_next_update_time_us (ClutterFrameClock *frame_clock, } else { @@ -366,7 +375,7 @@ index 30a319f604..75e33088c1 100644 + if (!max_render_time_is_known) + { + max_render_time_allowed_us = -+ refresh_interval_us * SYNC_DELAY_FALLBACK_FRACTION; ++ (int64_t) (refresh_interval_us * SYNC_DELAY_FALLBACK_FRACTION); + next_presentation_time_us = + last_presentation_time_us + refresh_interval_us; + } @@ -374,7 +383,7 @@ index 30a319f604..75e33088c1 100644 while (next_presentation_time_us - min_render_time_allowed_us < now_us) next_presentation_time_us += refresh_interval_us; -@@ -650,7 +764,9 @@ calculate_next_variable_update_time_us (ClutterFrameClock *frame_clock, +@@ -650,7 +767,9 @@ calculate_next_variable_update_time_us (ClutterFrameClock *frame_clock, refresh_interval_us = frame_clock->refresh_interval_us; @@ -385,7 +394,7 @@ index 30a319f604..75e33088c1 100644 { *out_next_update_time_us = frame_clock->last_dispatch_time_us ? -@@ -663,9 +779,6 @@ calculate_next_variable_update_time_us (ClutterFrameClock *frame_clock, +@@ -663,9 +782,6 @@ calculate_next_variable_update_time_us (ClutterFrameClock *frame_clock, return; } @@ -395,7 +404,7 @@ index 30a319f604..75e33088c1 100644 last_presentation_time_us = frame_clock->last_presentation_time_us; next_presentation_time_us = last_presentation_time_us + refresh_interval_us; -@@ -739,8 +852,17 @@ clutter_frame_clock_inhibit (ClutterFrameClock *frame_clock) +@@ -739,8 +855,17 @@ clutter_frame_clock_inhibit (ClutterFrameClock *frame_clock) frame_clock->pending_reschedule_now = TRUE; frame_clock->state = CLUTTER_FRAME_CLOCK_STATE_IDLE; break; @@ -415,7 +424,7 @@ index 30a319f604..75e33088c1 100644 break; } -@@ -759,6 +881,25 @@ clutter_frame_clock_uninhibit (ClutterFrameClock *frame_clock) +@@ -759,6 +884,25 @@ clutter_frame_clock_uninhibit (ClutterFrameClock *frame_clock) maybe_reschedule_update (frame_clock); } @@ -441,7 +450,7 @@ index 30a319f604..75e33088c1 100644 void clutter_frame_clock_schedule_update_now (ClutterFrameClock *frame_clock) { -@@ -776,11 +917,24 @@ clutter_frame_clock_schedule_update_now (ClutterFrameClock *frame_clock) +@@ -776,11 +920,24 @@ clutter_frame_clock_schedule_update_now (ClutterFrameClock *frame_clock) case CLUTTER_FRAME_CLOCK_STATE_INIT: case CLUTTER_FRAME_CLOCK_STATE_IDLE: case CLUTTER_FRAME_CLOCK_STATE_SCHEDULED: @@ -468,7 +477,7 @@ index 30a319f604..75e33088c1 100644 frame_clock->pending_reschedule = TRUE; frame_clock->pending_reschedule_now = TRUE; return; -@@ -809,13 +963,17 @@ clutter_frame_clock_schedule_update_now (ClutterFrameClock *frame_clock) +@@ -809,13 +966,17 @@ clutter_frame_clock_schedule_update_now (ClutterFrameClock *frame_clock) frame_clock->next_update_time_us = next_update_time_us; g_source_set_ready_time (frame_clock->source, next_update_time_us); @@ -487,7 +496,7 @@ index 30a319f604..75e33088c1 100644 if (frame_clock->inhibit_count > 0) { -@@ -831,12 +989,33 @@ clutter_frame_clock_schedule_update (ClutterFrameClock *frame_clock) +@@ -831,12 +992,33 @@ clutter_frame_clock_schedule_update (ClutterFrameClock *frame_clock) frame_clock->state = CLUTTER_FRAME_CLOCK_STATE_SCHEDULED; return; case CLUTTER_FRAME_CLOCK_STATE_IDLE: @@ -523,7 +532,7 @@ index 30a319f604..75e33088c1 100644 frame_clock->pending_reschedule = TRUE; return; } -@@ -861,11 +1040,11 @@ clutter_frame_clock_schedule_update (ClutterFrameClock *frame_clock) +@@ -861,11 +1043,11 @@ clutter_frame_clock_schedule_update (ClutterFrameClock *frame_clock) break; } @@ -536,7 +545,7 @@ index 30a319f604..75e33088c1 100644 } void -@@ -881,6 +1060,8 @@ clutter_frame_clock_set_mode (ClutterFrameClock *frame_clock, +@@ -881,6 +1063,8 @@ clutter_frame_clock_set_mode (ClutterFrameClock *frame_clock, { case CLUTTER_FRAME_CLOCK_STATE_INIT: case CLUTTER_FRAME_CLOCK_STATE_IDLE: @@ -545,7 +554,7 @@ index 30a319f604..75e33088c1 100644 break; case CLUTTER_FRAME_CLOCK_STATE_SCHEDULED: frame_clock->pending_reschedule = TRUE; -@@ -891,8 +1072,14 @@ clutter_frame_clock_set_mode (ClutterFrameClock *frame_clock, +@@ -891,8 +1075,14 @@ clutter_frame_clock_set_mode (ClutterFrameClock *frame_clock, frame_clock->pending_reschedule_now = TRUE; frame_clock->state = CLUTTER_FRAME_CLOCK_STATE_IDLE; break; @@ -562,7 +571,7 @@ index 30a319f604..75e33088c1 100644 break; } -@@ -928,7 +1115,7 @@ clutter_frame_clock_dispatch (ClutterFrameClock *frame_clock, +@@ -928,7 +1118,7 @@ clutter_frame_clock_dispatch (ClutterFrameClock *frame_clock, frame_clock->refresh_interval_us; lateness_us = time_us - ideal_dispatch_time_us; @@ -571,7 +580,7 @@ index 30a319f604..75e33088c1 100644 frame_clock->last_dispatch_lateness_us = 0; else frame_clock->last_dispatch_lateness_us = lateness_us; -@@ -949,10 +1136,27 @@ clutter_frame_clock_dispatch (ClutterFrameClock *frame_clock, +@@ -949,10 +1139,27 @@ clutter_frame_clock_dispatch (ClutterFrameClock *frame_clock, } #endif @@ -600,7 +609,7 @@ index 30a319f604..75e33088c1 100644 frame_count = frame_clock->frame_count++; -@@ -983,26 +1187,36 @@ clutter_frame_clock_dispatch (ClutterFrameClock *frame_clock, +@@ -983,26 +1190,36 @@ clutter_frame_clock_dispatch (ClutterFrameClock *frame_clock, result = iface->frame (frame_clock, frame, frame_clock->listener.user_data); COGL_TRACE_END (ClutterFrameClockFrame); @@ -650,7 +659,7 @@ index 30a319f604..75e33088c1 100644 } break; } -@@ -1035,21 +1249,31 @@ frame_clock_source_dispatch (GSource *source, +@@ -1035,21 +1252,31 @@ frame_clock_source_dispatch (GSource *source, } void @@ -687,7 +696,7 @@ index 30a319f604..75e33088c1 100644 if (frame_clock->got_measurements_last_frame) g_string_append_printf (string, " ="); -@@ -1216,8 +1440,6 @@ clutter_frame_clock_dispose (GObject *object) +@@ -1216,8 +1443,6 @@ clutter_frame_clock_dispose (GObject *object) { ClutterFrameClock *frame_clock = CLUTTER_FRAME_CLOCK (object); @@ -696,7 +705,7 @@ index 30a319f604..75e33088c1 100644 if (frame_clock->source) { g_signal_emit (frame_clock, signals[DESTROY], 0); -@@ -1241,6 +1463,15 @@ static void +@@ -1241,6 +1466,15 @@ static void clutter_frame_clock_class_init (ClutterFrameClockClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); @@ -818,7 +827,7 @@ index f5188e2acf..d53e377851 100644 _clutter_stage_window_finish_frame (stage_window, view, frame); diff --git a/cogl/cogl/cogl-onscreen-private.h b/cogl/cogl/cogl-onscreen-private.h -index 959a60533b..86d8ea2d5f 100644 +index 959a60533b..cfd45a6250 100644 --- a/cogl/cogl/cogl-onscreen-private.h +++ b/cogl/cogl/cogl-onscreen-private.h @@ -78,4 +78,7 @@ COGL_EXPORT CoglFrameInfo * @@ -829,9 +838,9 @@ index 959a60533b..86d8ea2d5f 100644 +cogl_onscreen_pop_head_frame_info (CoglOnscreen *onscreen); + +COGL_EXPORT unsigned int -+cogl_onscreen_count_pending_frames (CoglOnscreen *onscreen); ++cogl_onscreen_get_pending_frame_count (CoglOnscreen *onscreen); diff --git a/cogl/cogl/cogl-onscreen.c b/cogl/cogl/cogl-onscreen.c -index afb648bcd8..086be7ed7a 100644 +index afb648bcd8..8c010b8cd5 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) @@ -839,7 +848,7 @@ index afb648bcd8..086be7ed7a 100644 } +unsigned int -+cogl_onscreen_count_pending_frames (CoglOnscreen *onscreen) ++cogl_onscreen_get_pending_frame_count (CoglOnscreen *onscreen) +{ + CoglOnscreenPrivate *priv = cogl_onscreen_get_instance_private (onscreen); + @@ -862,6 +871,127 @@ index 7aa24439d7..727e1a5f30 100644 if (meta_stage_impl_scanout_view (stage_impl, stage_view, scanout, +diff --git a/src/backends/native/meta-frame-native.c b/src/backends/native/meta-frame-native.c +index 146144db0e..8dc9dba9b9 100644 +--- a/src/backends/native/meta-frame-native.c ++++ b/src/backends/native/meta-frame-native.c +@@ -27,7 +27,15 @@ struct _MetaFrameNative + { + ClutterFrame base; + ++ MetaDrmBuffer *buffer; ++ CoglScanout *scanout; ++ + MetaKmsUpdate *kms_update; ++ ++ struct { ++ int n_rectangles; ++ int *rectangles; /* 4 x n_rectangles */ ++ } damage; + }; + + static void +@@ -35,6 +43,10 @@ meta_frame_native_release (ClutterFrame *frame) + { + MetaFrameNative *frame_native = meta_frame_native_from_frame (frame); + ++ g_clear_pointer (&frame_native->damage.rectangles, g_free); ++ g_clear_object (&frame_native->buffer); ++ g_clear_object (&frame_native->scanout); ++ + g_return_if_fail (!frame_native->kms_update); + } + +@@ -76,3 +88,54 @@ meta_frame_native_has_kms_update (MetaFrameNative *frame_native) + { + return !!frame_native->kms_update; + } ++ ++void ++meta_frame_native_set_buffer (MetaFrameNative *frame_native, ++ MetaDrmBuffer *buffer) ++{ ++ g_set_object (&frame_native->buffer, buffer); ++} ++ ++MetaDrmBuffer * ++meta_frame_native_get_buffer (MetaFrameNative *frame_native) ++{ ++ return frame_native->buffer; ++} ++ ++void ++meta_frame_native_set_scanout (MetaFrameNative *frame_native, ++ CoglScanout *scanout) ++{ ++ g_set_object (&frame_native->scanout, scanout); ++} ++ ++CoglScanout * ++meta_frame_native_get_scanout (MetaFrameNative *frame_native) ++{ ++ return frame_native->scanout; ++} ++ ++void ++meta_frame_native_set_damage (MetaFrameNative *frame_native, ++ const int *rectangles, ++ int n_rectangles) ++{ ++ size_t rectangles_size; ++ ++ rectangles_size = n_rectangles * 4 * sizeof (int); ++ ++ frame_native->damage.rectangles = ++ g_realloc (frame_native->damage.rectangles, rectangles_size); ++ memcpy (frame_native->damage.rectangles, rectangles, rectangles_size); ++ frame_native->damage.n_rectangles = n_rectangles; ++} ++ ++int ++meta_frame_native_get_damage (MetaFrameNative *frame_native, ++ int **rectangles) ++{ ++ if (rectangles) ++ *rectangles = frame_native->damage.rectangles; ++ ++ return frame_native->damage.n_rectangles; ++} +diff --git a/src/backends/native/meta-frame-native.h b/src/backends/native/meta-frame-native.h +index f86d3b0b02..84bd43b8c6 100644 +--- a/src/backends/native/meta-frame-native.h ++++ b/src/backends/native/meta-frame-native.h +@@ -17,6 +17,7 @@ + + #pragma once + ++#include "backends/native/meta-backend-native-types.h" + #include "backends/native/meta-kms-types.h" + #include "clutter/clutter.h" + #include "core/util-private.h" +@@ -36,3 +37,22 @@ MetaKmsUpdate * meta_frame_native_steal_kms_update (MetaFrameNative *frame_nativ + + META_EXPORT_TEST + gboolean meta_frame_native_has_kms_update (MetaFrameNative *frame_native); ++ ++void meta_frame_native_set_buffer (MetaFrameNative *frame_native, ++ MetaDrmBuffer *buffer); ++ ++MetaDrmBuffer * meta_frame_native_get_buffer (MetaFrameNative *frame_native); ++ ++void meta_frame_native_set_scanout (MetaFrameNative *frame_native, ++ CoglScanout *scanout); ++ ++CoglScanout * meta_frame_native_get_scanout (MetaFrameNative *frame_native); ++ ++void ++meta_frame_native_set_damage (MetaFrameNative *frame_native, ++ const int *rectangles, ++ int n_rectangles); ++ ++int ++meta_frame_native_get_damage (MetaFrameNative *frame_native, ++ int **rectangles); diff --git a/src/backends/native/meta-kms-impl-device.c b/src/backends/native/meta-kms-impl-device.c index 6758982a6a..315ed27174 100644 --- a/src/backends/native/meta-kms-impl-device.c @@ -927,7 +1057,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..9836663d0c 100644 +index 1a31f04a16..f1553d3b2c 100644 --- a/src/backends/native/meta-onscreen-native.c +++ b/src/backends/native/meta-onscreen-native.c @@ -76,7 +76,7 @@ typedef struct _MetaOnscreenNativeSecondaryGpuState @@ -939,38 +1069,72 @@ index 1a31f04a16..9836663d0c 100644 } cpu; gboolean noted_primary_gpu_copy_ok; -@@ -98,9 +98,13 @@ struct _MetaOnscreenNative +@@ -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 + + MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state; + ++ ClutterFrame *presented_frame; ++ ClutterFrame *posted_frame; ++ ClutterFrame *stalled_frame; ++ ClutterFrame *next_frame; ++ struct { struct gbm_surface *surface; - MetaDrmBuffer *current_fb; -+ MetaDrmBuffer *posted_fb; - MetaDrmBuffer *next_fb; -+ MetaDrmBuffer *stalled_fb; - CoglScanout *current_scanout; -+ CoglScanout *posted_scanout; - CoglScanout *next_scanout; -+ CoglScanout *stalled_scanout; +- MetaDrmBuffer *current_fb; +- MetaDrmBuffer *next_fb; +- CoglScanout *current_scanout; +- CoglScanout *next_scanout; } gbm; #ifdef HAVE_EGL_DEVICE -@@ -125,6 +129,16 @@ struct _MetaOnscreenNative - gulong privacy_screen_changed_handler_id; - gulong color_space_changed_handler_id; - gulong hdr_metadata_changed_handler_id; -+ +@@ -111,20 +119,23 @@ struct _MetaOnscreenNative + } egl; + #endif + + gboolean needs_flush; -+ + unsigned int swaps_pending; + -+ struct { -+ int *rectangles; /* 4 x n_rectangles */ -+ int n_rectangles; -+ ClutterFrame *frame; -+ } next_post; + 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 +146,42 @@ G_DEFINE_TYPE (MetaOnscreenNative, meta_onscreen_native, +@@ -132,44 +143,37 @@ G_DEFINE_TYPE (MetaOnscreenNative, meta_onscreen_native, static GQuark blit_source_quark = 0; @@ -1001,21 +1165,19 @@ index 1a31f04a16..9836663d0c 100644 MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen); - if (!onscreen_native->gbm.next_fb) -+ if (!onscreen_native->gbm.posted_fb) ++ if (!onscreen_native->posted_frame) return; - free_current_bo (onscreen); -+ g_set_object (&onscreen_native->gbm.current_fb, -+ onscreen_native->gbm.posted_fb); -+ g_clear_object (&onscreen_native->gbm.posted_fb); - +- - g_set_object (&onscreen_native->gbm.current_fb, onscreen_native->gbm.next_fb); - g_clear_object (&onscreen_native->gbm.next_fb); - g_set_object (&onscreen_native->gbm.current_scanout, +- g_set_object (&onscreen_native->gbm.current_scanout, - onscreen_native->gbm.next_scanout); - g_clear_object (&onscreen_native->gbm.next_scanout); -+ onscreen_native->gbm.posted_scanout); -+ g_clear_object (&onscreen_native->gbm.posted_scanout); ++ g_clear_pointer (&onscreen_native->presented_frame, clutter_frame_unref); ++ onscreen_native->presented_frame = ++ g_steal_pointer (&onscreen_native->posted_frame); } static void @@ -1026,12 +1188,11 @@ index 1a31f04a16..9836663d0c 100644 - g_clear_object (&onscreen_native->gbm.next_fb); - g_clear_object (&onscreen_native->gbm.next_scanout); -+ g_clear_object (&onscreen_native->gbm.posted_fb); -+ g_clear_object (&onscreen_native->gbm.posted_scanout); ++ g_clear_pointer (&onscreen_native->posted_frame, clutter_frame_unref); } static void -@@ -207,7 +219,7 @@ meta_onscreen_native_notify_frame_complete (CoglOnscreen *onscreen) +@@ -207,7 +211,7 @@ meta_onscreen_native_notify_frame_complete (CoglOnscreen *onscreen) info = cogl_onscreen_pop_head_frame_info (onscreen); @@ -1040,7 +1201,24 @@ index 1a31f04a16..9836663d0c 100644 _cogl_onscreen_notify_frame_sync (onscreen, info); _cogl_onscreen_notify_complete (onscreen, info); -@@ -243,6 +255,7 @@ notify_view_crtc_presented (MetaRendererView *view, +@@ -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); meta_onscreen_native_notify_frame_complete (onscreen); meta_onscreen_native_swap_drm_fb (onscreen); @@ -1048,7 +1226,7 @@ index 1a31f04a16..9836663d0c 100644 } static void -@@ -292,15 +305,13 @@ page_flip_feedback_ready (MetaKmsCrtc *kms_crtc, +@@ -292,15 +300,13 @@ page_flip_feedback_ready (MetaKmsCrtc *kms_crtc, CoglFramebuffer *framebuffer = clutter_stage_view_get_onscreen (CLUTTER_STAGE_VIEW (view)); CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer); @@ -1065,7 +1243,30 @@ index 1a31f04a16..9836663d0c 100644 } static void -@@ -350,7 +361,8 @@ page_flip_feedback_discarded (MetaKmsCrtc *kms_crtc, +@@ -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; meta_onscreen_native_notify_frame_complete (onscreen); @@ -1075,7 +1276,7 @@ index 1a31f04a16..9836663d0c 100644 } static const MetaKmsPageFlipListenerVtable page_flip_listener_vtable = { -@@ -411,18 +423,41 @@ custom_egl_stream_page_flip (gpointer custom_page_flip_data, +@@ -411,18 +430,36 @@ custom_egl_stream_page_flip (gpointer custom_page_flip_data, } #endif /* HAVE_EGL_DEVICE */ @@ -1088,17 +1289,12 @@ index 1a31f04a16..9836663d0c 100644 + MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen); - meta_onscreen_native_swap_drm_fb (onscreen); -+ /* Remember we can't compare stalled_fb because it's not used by -+ * META_RENDERER_NATIVE_MODE_EGL_DEVICE. So we judge stalled to be whenever -+ * swaps_pending > 1. -+ */ + if (onscreen_native->swaps_pending <= 1) + return; + + onscreen_native->swaps_pending--; + -+ g_clear_object (&onscreen_native->gbm.stalled_fb); -+ g_clear_object (&onscreen_native->gbm.stalled_scanout); ++ g_clear_pointer (&onscreen_native->stalled_frame, clutter_frame_unref); frame_info = cogl_onscreen_peek_tail_frame_info (onscreen); frame_info->flags |= COGL_FRAME_INFO_FLAG_SYMBOLIC; @@ -1120,33 +1316,65 @@ index 1a31f04a16..9836663d0c 100644 static void apply_transform (MetaCrtcKms *crtc_kms, MetaKmsPlaneAssignment *kms_plane_assignment, -@@ -521,13 +556,21 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen, +@@ -499,12 +536,15 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen, + { + MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen); + MetaRendererNative *renderer_native = onscreen_native->renderer_native; ++ g_autoptr (ClutterFrame) frame = NULL; ++ MetaFrameNative *frame_native; + MetaGpuKms *render_gpu = onscreen_native->render_gpu; + MetaCrtcKms *crtc_kms = META_CRTC_KMS (crtc); + MetaKmsCrtc *kms_crtc = meta_crtc_kms_get_kms_crtc (crtc_kms); + MetaRendererNativeGpuData *renderer_gpu_data; + MetaGpuKms *gpu_kms; + MetaDrmBuffer *buffer; ++ CoglScanout *scanout; + MetaKmsPlaneAssignment *plane_assignment; + graphene_rect_t src_rect; + MtkRectangle dst_rect; +@@ -512,6 +552,9 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen, + COGL_TRACE_BEGIN_SCOPED (MetaOnscreenNativeFlipCrtcs, + "Meta::OnscreenNative::flip_crtc()"); + ++ frame = g_steal_pointer (&onscreen_native->next_frame); ++ g_return_if_fail (frame); ++ + 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, switch (renderer_gpu_data->mode) { case META_RENDERER_NATIVE_MODE_GBM: - buffer = onscreen_native->gbm.next_fb; -+ g_set_object (&onscreen_native->gbm.posted_fb, -+ onscreen_native->gbm.next_fb); -+ g_clear_object (&onscreen_native->gbm.next_fb); -+ -+ buffer = onscreen_native->gbm.posted_fb; ++ frame_native = meta_frame_native_from_frame (frame); ++ buffer = meta_frame_native_get_buffer (frame_native); ++ scanout = meta_frame_native_get_scanout (frame_native); - if (onscreen_native->gbm.next_scanout) -+ g_set_object (&onscreen_native->gbm.posted_scanout, -+ onscreen_native->gbm.next_scanout); -+ g_clear_object (&onscreen_native->gbm.next_scanout); -+ -+ if (onscreen_native->gbm.posted_scanout) ++ if (scanout) { - cogl_scanout_get_src_rect (onscreen_native->gbm.next_scanout, -+ cogl_scanout_get_src_rect (onscreen_native->gbm.posted_scanout, - &src_rect); +- &src_rect); - cogl_scanout_get_dst_rect (onscreen_native->gbm.next_scanout, -+ cogl_scanout_get_dst_rect (onscreen_native->gbm.posted_scanout, - &dst_rect); +- &dst_rect); ++ cogl_scanout_get_src_rect (scanout, &src_rect); ++ cogl_scanout_get_dst_rect (scanout, &dst_rect); } else -@@ -918,12 +961,17 @@ static MetaDrmBufferDumb * + { +@@ -571,6 +614,10 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen, + #endif + } + ++ g_warn_if_fail (!onscreen_native->posted_frame); ++ g_clear_pointer (&onscreen_native->posted_frame, clutter_frame_unref); ++ onscreen_native->posted_frame = g_steal_pointer (&frame); ++ + meta_kms_update_add_page_flip_listener (kms_update, + kms_crtc, + &page_flip_listener_vtable, +@@ -918,12 +965,17 @@ static MetaDrmBufferDumb * secondary_gpu_get_next_dumb_buffer (MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state) { MetaDrmBufferDumb *current_dumb_fb; @@ -1168,7 +1396,100 @@ index 1a31f04a16..9836663d0c 100644 } static MetaDrmBuffer * -@@ -1255,10 +1303,17 @@ swap_buffer_result_feedback (const MetaKmsFeedback *kms_feedback, +@@ -1163,56 +1215,54 @@ update_secondary_gpu_state_pre_swap_buffers (CoglOnscreen *onscreen, + return copy; + } + +-static void +-update_secondary_gpu_state_post_swap_buffers (CoglOnscreen *onscreen, +- gboolean *egl_context_changed, +- MetaDrmBuffer *primary_gpu_fb, +- MetaDrmBuffer **secondary_gpu_fb) ++static MetaDrmBuffer * ++acquire_front_buffer (CoglOnscreen *onscreen, ++ gboolean *egl_context_changed, ++ MetaDrmBuffer *primary_gpu_fb, ++ MetaDrmBuffer *secondary_gpu_fb) + { + MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen); + MetaRendererNative *renderer_native = onscreen_native->renderer_native; + MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state; ++ MetaRendererNativeGpuData *renderer_gpu_data; ++ MetaDrmBuffer *imported_fb; + + COGL_TRACE_BEGIN_SCOPED (MetaRendererNativeGpuStatePostSwapBuffers, +- "update_secondary_gpu_state_post_swap_buffers()"); ++ "acquire_front_buffer()"); + + secondary_gpu_state = onscreen_native->secondary_gpu_state; +- if (secondary_gpu_state) +- { +- MetaRendererNativeGpuData *renderer_gpu_data; +- g_autoptr (MetaDrmBuffer) next_fb = NULL; ++ if (!secondary_gpu_state) ++ return g_object_ref (primary_gpu_fb); + +- renderer_gpu_data = +- meta_renderer_native_get_gpu_data (renderer_native, +- secondary_gpu_state->gpu_kms); +- switch (renderer_gpu_data->secondary.copy_mode) +- { +- case META_SHARED_FRAMEBUFFER_COPY_MODE_ZERO: +- next_fb = import_shared_framebuffer (onscreen, ++ renderer_gpu_data = ++ meta_renderer_native_get_gpu_data (renderer_native, ++ secondary_gpu_state->gpu_kms); ++ switch (renderer_gpu_data->secondary.copy_mode) ++ { ++ case META_SHARED_FRAMEBUFFER_COPY_MODE_ZERO: ++ imported_fb = import_shared_framebuffer (onscreen, + secondary_gpu_state, + primary_gpu_fb); +- if (next_fb) +- break; +- /* The fallback was prepared in pre_swap_buffers and is currently +- * in secondary_gpu_fb. +- */ +- renderer_gpu_data->secondary.copy_mode = +- META_SHARED_FRAMEBUFFER_COPY_MODE_PRIMARY; +- G_GNUC_FALLTHROUGH; +- case META_SHARED_FRAMEBUFFER_COPY_MODE_PRIMARY: +- next_fb = g_object_ref (*secondary_gpu_fb); +- break; +- case META_SHARED_FRAMEBUFFER_COPY_MODE_SECONDARY_GPU: +- next_fb = copy_shared_framebuffer_gpu (onscreen, +- secondary_gpu_state, +- renderer_gpu_data, +- egl_context_changed, +- primary_gpu_fb); +- break; +- } +- +- g_set_object (secondary_gpu_fb, next_fb); ++ if (imported_fb) ++ return imported_fb; ++ /* The fallback was prepared in pre_swap_buffers and is currently ++ * in secondary_gpu_fb. ++ */ ++ renderer_gpu_data->secondary.copy_mode = ++ META_SHARED_FRAMEBUFFER_COPY_MODE_PRIMARY; ++ G_GNUC_FALLTHROUGH; ++ case META_SHARED_FRAMEBUFFER_COPY_MODE_PRIMARY: ++ return g_object_ref (secondary_gpu_fb); ++ case META_SHARED_FRAMEBUFFER_COPY_MODE_SECONDARY_GPU: ++ return copy_shared_framebuffer_gpu (onscreen, ++ secondary_gpu_state, ++ renderer_gpu_data, ++ egl_context_changed, ++ primary_gpu_fb); + } ++ ++ g_assert_not_reached (); ++ return NULL; + } + + static void +@@ -1255,10 +1305,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); @@ -1186,10 +1507,29 @@ index 1a31f04a16..9836663d0c 100644 + } + + meta_onscreen_native_clear_posted_fb (onscreen); ++} ++ ++static void ++assign_next_frame (MetaOnscreenNative *onscreen_native, ++ ClutterFrame *frame) ++{ ++ CoglOnscreen *onscreen = COGL_ONSCREEN (onscreen_native); ++ ++ if (onscreen_native->next_frame != NULL) ++ { ++ g_warn_if_fail (onscreen_native->stalled_frame == NULL); ++ drop_stalled_swap (onscreen); ++ g_warn_if_fail (onscreen_native->stalled_frame == NULL); ++ g_clear_pointer (&onscreen_native->stalled_frame, clutter_frame_unref); ++ onscreen_native->stalled_frame = ++ g_steal_pointer (&onscreen_native->next_frame); ++ } ++ ++ onscreen_native->next_frame = clutter_frame_ref (frame); } static const MetaKmsResultListenerVtable swap_buffer_result_listener_vtable = { -@@ -1279,32 +1334,37 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, +@@ -1279,32 +1355,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; @@ -1202,7 +1542,7 @@ index 1a31f04a16..9836663d0c 100644 MetaGpuKms *render_gpu = onscreen_native->render_gpu; MetaDeviceFile *render_device_file; ClutterFrame *frame = user_data; -- MetaFrameNative *frame_native = meta_frame_native_from_frame (frame); + MetaFrameNative *frame_native = meta_frame_native_from_frame (frame); - MetaKmsUpdate *kms_update; CoglOnscreenClass *parent_class; gboolean create_timestamp_query = TRUE; @@ -1215,7 +1555,7 @@ index 1a31f04a16..9836663d0c 100644 g_autoptr (MetaDrmBuffer) secondary_gpu_fb = NULL; - MetaKmsCrtc *kms_crtc; - MetaKmsDevice *kms_device; -+ size_t rectangles_size; ++ g_autoptr (MetaDrmBuffer) buffer = NULL; COGL_TRACE_BEGIN_SCOPED (MetaRendererNativeSwapBuffers, "Meta::OnscreenNative::swap_buffers_with_damage()"); @@ -1223,7 +1563,7 @@ index 1a31f04a16..9836663d0c 100644 + if (meta_is_topic_enabled (META_DEBUG_KMS)) + { + unsigned int frames_pending = -+ cogl_onscreen_count_pending_frames (onscreen); ++ cogl_onscreen_get_pending_frame_count (onscreen); + + meta_topic (META_DEBUG_KMS, + "Swap buffers: %u frames pending (%s-buffering)", @@ -1236,50 +1576,53 @@ index 1a31f04a16..9836663d0c 100644 secondary_gpu_fb = update_secondary_gpu_state_pre_swap_buffers (onscreen, rectangles, -@@ -1379,7 +1439,17 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, +@@ -1371,21 +1453,17 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, + #endif + } + +- update_secondary_gpu_state_post_swap_buffers (onscreen, +- &egl_context_changed, +- primary_gpu_fb, +- &secondary_gpu_fb); ++ buffer = acquire_front_buffer (onscreen, ++ &egl_context_changed, ++ primary_gpu_fb, ++ secondary_gpu_fb); + switch (renderer_gpu_data->mode) { case META_RENDERER_NATIVE_MODE_GBM: - g_warn_if_fail (onscreen_native->gbm.next_fb == NULL); -+ if (onscreen_native->gbm.next_fb != NULL) -+ { -+ g_warn_if_fail (onscreen_native->gbm.stalled_fb == NULL); -+ drop_stalled_swap (onscreen); -+ g_assert (onscreen_native->gbm.stalled_fb == NULL); -+ onscreen_native->gbm.stalled_fb = -+ g_steal_pointer (&onscreen_native->gbm.next_fb); -+ onscreen_native->gbm.stalled_scanout = -+ g_steal_pointer (&onscreen_native->gbm.next_scanout); -+ } -+ - if (onscreen_native->secondary_gpu_state) - g_set_object (&onscreen_native->gbm.next_fb, secondary_gpu_fb); - else -@@ -1404,6 +1474,9 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, +- if (onscreen_native->secondary_gpu_state) +- g_set_object (&onscreen_native->gbm.next_fb, secondary_gpu_fb); +- else +- g_set_object (&onscreen_native->gbm.next_fb, primary_gpu_fb); ++ meta_frame_native_set_buffer (frame_native, buffer); + +- if (!meta_drm_buffer_ensure_fb_id (onscreen_native->gbm.next_fb, &error)) ++ if (!meta_drm_buffer_ensure_fb_id (buffer, &error)) + { + 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, #endif } ++ assign_next_frame (onscreen_native, frame); ++ + clutter_frame_set_result (frame, + CLUTTER_FRAME_RESULT_PENDING_PRESENTED); + /* * 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 +1486,78 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, +@@ -1413,12 +1496,73 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, if (egl_context_changed) _cogl_winsys_egl_ensure_current (cogl_display); - kms_crtc = meta_crtc_kms_get_kms_crtc (META_CRTC_KMS (onscreen_native->crtc)); - kms_device = meta_kms_crtc_get_device (kms_crtc); -+ rectangles_size = n_rectangles * 4 * sizeof (int); -+ onscreen_native->next_post.rectangles = -+ g_realloc (onscreen_native->next_post.rectangles, rectangles_size); -+ memcpy (onscreen_native->next_post.rectangles, rectangles, rectangles_size); -+ onscreen_native->next_post.n_rectangles = n_rectangles; -+ -+ g_clear_pointer (&onscreen_native->next_post.frame, clutter_frame_unref); -+ onscreen_native->next_post.frame = clutter_frame_ref (frame); -+ ++ meta_frame_native_set_damage (frame_native, rectangles, n_rectangles); + onscreen_native->swaps_pending++; + try_post_latest_swap (onscreen); +} @@ -1309,7 +1652,7 @@ index 1a31f04a16..9836663d0c 100644 + g_autoptr (ClutterFrame) frame = NULL; + MetaFrameNative *frame_native; + -+ if (onscreen_native->next_post.frame == NULL || ++ if (onscreen_native->next_frame == NULL || + onscreen_native->view == NULL || + meta_kms_is_shutting_down (kms)) + return; @@ -1318,16 +1661,19 @@ index 1a31f04a16..9836663d0c 100644 if (power_save_mode == META_POWER_SAVE_ON) { + unsigned int frames_pending = -+ cogl_onscreen_count_pending_frames (onscreen); ++ cogl_onscreen_get_pending_frame_count (onscreen); + unsigned int posts_pending; ++ int n_rectangles; ++ int *rectangles; + + g_assert (frames_pending >= onscreen_native->swaps_pending); + posts_pending = frames_pending - onscreen_native->swaps_pending; + if (posts_pending > 0) + return; /* wait for the next frame notification and then try again */ + -+ frame = g_steal_pointer (&onscreen_native->next_post.frame); ++ frame = clutter_frame_ref (onscreen_native->next_frame); + frame_native = meta_frame_native_from_frame (frame); ++ n_rectangles = meta_frame_native_get_damage (frame_native, &rectangles); + + if (onscreen_native->swaps_pending == 0) + { @@ -1346,16 +1692,7 @@ index 1a31f04a16..9836663d0c 100644 kms_update = meta_frame_native_ensure_kms_update (frame_native, kms_device); meta_kms_update_add_result_listener (kms_update, -@@ -1433,15 +1572,13 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, - onscreen_native->crtc, - kms_update, - META_KMS_ASSIGN_PLANE_FLAG_NONE, -- rectangles, -- n_rectangles); -+ onscreen_native->next_post.rectangles, -+ onscreen_native->next_post.n_rectangles); - } - else +@@ -1440,13 +1584,11 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, { meta_renderer_native_queue_power_save_page_flip (renderer_native, onscreen); @@ -1364,7 +1701,13 @@ index 1a31f04a16..9836663d0c 100644 return; } -@@ -1461,8 +1598,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, + COGL_TRACE_BEGIN_SCOPED (MetaRendererNativePostKmsUpdate, +- "Meta::OnscreenNative::swap_buffers_with_damage#post_pending_update()"); ++ "Meta::OnscreenNative::try_post_latest_swap#post_pending_update()"); + + switch (renderer_gpu_data->mode) + { +@@ -1461,8 +1603,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); @@ -1373,7 +1716,7 @@ index 1a31f04a16..9836663d0c 100644 return; } else if (meta_renderer_native_has_pending_mode_set (renderer_native)) -@@ -1476,8 +1611,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, +@@ -1476,8 +1616,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); @@ -1382,7 +1725,7 @@ index 1a31f04a16..9836663d0c 100644 return; } break; -@@ -1493,8 +1626,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, +@@ -1493,8 +1631,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, kms_update); meta_renderer_native_post_mode_set_updates (renderer_native); @@ -1391,7 +1734,7 @@ index 1a31f04a16..9836663d0c 100644 return; } break; -@@ -1509,7 +1640,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, +@@ -1509,7 +1645,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); @@ -1399,16 +1742,25 @@ index 1a31f04a16..9836663d0c 100644 } gboolean -@@ -1580,7 +1710,7 @@ scanout_result_feedback (const MetaKmsFeedback *kms_feedback, +@@ -1577,11 +1712,15 @@ scanout_result_feedback (const MetaKmsFeedback *kms_feedback, + G_IO_ERROR_PERMISSION_DENIED)) + { + ClutterStageView *view = CLUTTER_STAGE_VIEW (onscreen_native->view); ++ ClutterFrame *posted_frame = onscreen_native->posted_frame; ++ MetaFrameNative *posted_frame_native = ++ meta_frame_native_from_frame (posted_frame); ++ CoglScanout *scanout = ++ meta_frame_native_get_scanout (posted_frame_native); g_warning ("Direct scanout page flip failed: %s", error->message); - cogl_scanout_notify_failed (onscreen_native->gbm.next_scanout, -+ cogl_scanout_notify_failed (onscreen_native->gbm.posted_scanout, - onscreen); +- onscreen); ++ cogl_scanout_notify_failed (scanout, onscreen); clutter_stage_view_add_redraw_clip (view, NULL); clutter_stage_view_schedule_update_now (view); -@@ -1590,7 +1720,7 @@ scanout_result_feedback (const MetaKmsFeedback *kms_feedback, + } +@@ -1590,7 +1729,7 @@ scanout_result_feedback (const MetaKmsFeedback *kms_feedback, frame_info->flags |= COGL_FRAME_INFO_FLAG_SYMBOLIC; meta_onscreen_native_notify_frame_complete (onscreen); @@ -1417,14 +1769,14 @@ index 1a31f04a16..9836663d0c 100644 } static const MetaKmsResultListenerVtable scanout_result_listener_vtable = { -@@ -1642,6 +1772,18 @@ meta_onscreen_native_direct_scanout (CoglOnscreen *onscreen, +@@ -1642,16 +1781,28 @@ meta_onscreen_native_direct_scanout (CoglOnscreen *onscreen, return FALSE; } + /* Our direct scanout frame counts as 1, so more than that means we would + * be jumping the queue (and post would fail). + */ -+ if (cogl_onscreen_count_pending_frames (onscreen) > 1) ++ if (cogl_onscreen_get_pending_frame_count (onscreen) > 1) + { + g_set_error_literal (error, + COGL_SCANOUT_ERROR, @@ -1436,7 +1788,22 @@ index 1a31f04a16..9836663d0c 100644 renderer_gpu_data = meta_renderer_native_get_gpu_data (renderer_native, render_gpu); -@@ -1757,11 +1899,7 @@ meta_onscreen_native_before_redraw (CoglOnscreen *onscreen, + g_warn_if_fail (renderer_gpu_data->mode == META_RENDERER_NATIVE_MODE_GBM); +- g_warn_if_fail (!onscreen_native->gbm.next_fb); +- g_warn_if_fail (!onscreen_native->gbm.next_scanout); + +- g_set_object (&onscreen_native->gbm.next_scanout, scanout); +- g_set_object (&onscreen_native->gbm.next_fb, +- META_DRM_BUFFER (cogl_scanout_get_buffer (scanout))); ++ assign_next_frame (onscreen_native, frame); ++ ++ meta_frame_native_set_scanout (frame_native, scanout); ++ meta_frame_native_set_buffer (frame_native, ++ META_DRM_BUFFER (cogl_scanout_get_buffer (scanout))); + + frame_info->cpu_time_before_buffer_swap_us = g_get_monotonic_time (); + +@@ -1757,11 +1908,7 @@ meta_onscreen_native_before_redraw (CoglOnscreen *onscreen, ClutterFrame *frame) { MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen); @@ -1448,11 +1815,68 @@ index 1a31f04a16..9836663d0c 100644 maybe_update_frame_sync (onscreen_native, frame); } -@@ -1877,22 +2015,79 @@ meta_onscreen_native_finish_frame (CoglOnscreen *onscreen, +@@ -1776,7 +1923,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 +1933,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 +1949,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 +1965,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 +1981,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 +2032,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; -+ unsigned int frames_pending = cogl_onscreen_count_pending_frames (onscreen); ++ unsigned int frames_pending = cogl_onscreen_get_pending_frame_count (onscreen); + unsigned int swaps_pending = onscreen_native->swaps_pending; + unsigned int posts_pending = frames_pending - swaps_pending; @@ -1479,10 +1903,10 @@ index 1a31f04a16..9836663d0c 100644 + if (posts_pending && !swaps_pending) + { + g_return_if_fail (meta_frame_native_has_kms_update (frame_native)); -+ g_warn_if_fail (onscreen_native->next_post.frame == NULL); ++ g_warn_if_fail (onscreen_native->next_frame == NULL); + -+ g_clear_pointer (&onscreen_native->next_post.frame, clutter_frame_unref); -+ onscreen_native->next_post.frame = clutter_frame_ref (frame); ++ g_clear_pointer (&onscreen_native->next_frame, clutter_frame_unref); ++ onscreen_native->next_frame = clutter_frame_ref (frame); + clutter_frame_set_result (frame, CLUTTER_FRAME_RESULT_PENDING_PRESENTED); + return; + } @@ -1495,10 +1919,10 @@ index 1a31f04a16..9836663d0c 100644 + MetaKmsUpdate *older_kms_update; + + g_return_if_fail (kms_update); -+ g_return_if_fail (onscreen_native->next_post.frame != NULL); ++ g_return_if_fail (onscreen_native->next_frame != NULL); + + older_frame_native = -+ meta_frame_native_from_frame (onscreen_native->next_post.frame); ++ meta_frame_native_from_frame (onscreen_native->next_frame); + older_kms_update = + meta_frame_native_ensure_kms_update (older_frame_native, kms_device); + meta_kms_update_merge_from (older_kms_update, kms_update); @@ -1536,7 +1960,7 @@ index 1a31f04a16..9836663d0c 100644 meta_kms_update_add_result_listener (kms_update, &finish_frame_result_listener_vtable, NULL, -@@ -1915,7 +2110,19 @@ meta_onscreen_native_finish_frame (CoglOnscreen *onscreen, +@@ -1915,7 +2127,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); @@ -1550,37 +1974,150 @@ index 1a31f04a16..9836663d0c 100644 + + onscreen_native->swaps_pending = 0; + -+ g_clear_object (&onscreen_native->gbm.stalled_fb); -+ g_clear_object (&onscreen_native->gbm.stalled_scanout); -+ g_clear_object (&onscreen_native->gbm.next_fb); -+ g_clear_object (&onscreen_native->gbm.next_scanout); ++ g_clear_pointer (&onscreen_native->stalled_frame, clutter_frame_unref); ++ g_clear_pointer (&onscreen_native->next_frame, clutter_frame_unref); } static gboolean -@@ -2830,8 +3037,11 @@ meta_onscreen_native_dispose (GObject *object) - { - case META_RENDERER_NATIVE_MODE_GBM: - g_clear_object (&onscreen_native->gbm.next_fb); -+ g_clear_object (&onscreen_native->gbm.posted_fb); -+ g_clear_object (&onscreen_native->gbm.current_fb); - g_clear_object (&onscreen_native->gbm.next_scanout); -- free_current_bo (onscreen); -+ g_clear_object (&onscreen_native->gbm.posted_scanout); -+ g_clear_object (&onscreen_native->gbm.current_scanout); - break; - case META_RENDERER_NATIVE_MODE_SURFACELESS: - g_assert_not_reached (); -@@ -2865,6 +3075,10 @@ meta_onscreen_native_dispose (GObject *object) +@@ -2677,15 +2899,15 @@ meta_onscreen_native_invalidate (MetaOnscreenNative *onscreen_native) + meta_output_get_info (onscreen_native->output); - g_clear_object (&onscreen_native->output); - g_clear_object (&onscreen_native->crtc); -+ -+ g_clear_pointer (&onscreen_native->next_post.rectangles, g_free); -+ g_clear_pointer (&onscreen_native->next_post.frame, clutter_frame_unref); -+ onscreen_native->next_post.n_rectangles = 0; + 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 +2916,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 +2927,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 +2937,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 +2947,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 +2982,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 +2991,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 +3001,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 +3011,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 +3024,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 +3045,17 @@ meta_onscreen_native_dispose (GObject *object) + + meta_onscreen_native_detach (onscreen_native); + ++ g_clear_pointer (&onscreen_native->next_frame, clutter_frame_unref); ++ g_clear_pointer (&onscreen_native->stalled_frame, clutter_frame_unref); ++ g_clear_pointer (&onscreen_native->posted_frame, clutter_frame_unref); ++ g_clear_pointer (&onscreen_native->presented_frame, clutter_frame_unref); ++ + renderer_gpu_data = + meta_renderer_native_get_gpu_data (renderer_native, + onscreen_native->render_gpu); + switch (renderer_gpu_data->mode) + { + case META_RENDERER_NATIVE_MODE_GBM: +- g_clear_object (&onscreen_native->gbm.next_fb); +- g_clear_object (&onscreen_native->gbm.next_scanout); +- free_current_bo (onscreen); + break; + case META_RENDERER_NATIVE_MODE_SURFACELESS: + g_assert_not_reached (); diff --git a/src/backends/native/meta-onscreen-native.h b/src/backends/native/meta-onscreen-native.h index 0e1193325a..e30357d19d 100644 --- a/src/backends/native/meta-onscreen-native.h diff --git a/mr3373.patch b/mr3373.patch index 2767317..2e9b7fe 100644 --- a/mr3373.patch +++ b/mr3373.patch @@ -1,20 +1,25 @@ +From d99a0017e66bdd0e1a278e6b08126f5b04cac096 Mon Sep 17 00:00:00 2001 From: Daniel van Vugt Date: Tue, 7 Nov 2023 16:30:01 +0200 -Subject: kms/crtc: Increase default deadline evasion to 1000 microseconds +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 -Forwarded: yes +Commit: 83de83513cbe6904e744ed4b495d835128f27434 + +Signed-off-by: Mingi Sung --- 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 b17e846..d6a8228 100644 +index a0872089a0..8fcb2d9495 100644 --- a/src/backends/native/meta-kms-crtc.c +++ b/src/backends/native/meta-kms-crtc.c @@ -28,7 +28,7 @@ @@ -25,4 +30,7 @@ index b17e846..d6a8228 100644 +#define DEADLINE_EVASION_US 1000 #define DEADLINE_EVASION_WITH_KMS_TOPIC_US 1000 - typedef struct _MetaKmsCrtcPropTable + #define MINIMUM_REFRESH_RATE 30.f +-- +2.46.0 + diff --git a/mr3567.patch b/mr3567.patch index 723e8fa..7dd7bd7 100644 --- a/mr3567.patch +++ b/mr3567.patch @@ -1,4 +1,4 @@ -From e59a419987c8ff7207f0cadd4f59aae9cb0e8f71 Mon Sep 17 00:00:00 2001 +From 1a482cbbea109406e48962669a89465f3f8bb98d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Tue, 12 Dec 2023 22:41:20 +0100 Subject: [PATCH 1/5] x11-display: Expose UI scaling factor via D-Bus @@ -18,7 +18,7 @@ Signed-off-by: Mingi Sung create mode 100644 data/dbus-interfaces/org.gnome.Mutter.X11.xml diff --git a/data/dbus-interfaces/org.gnome.Mutter.DisplayConfig.xml b/data/dbus-interfaces/org.gnome.Mutter.DisplayConfig.xml -index b05337d74..7294c57a8 100644 +index b05337d74f..7294c57a84 100644 --- a/data/dbus-interfaces/org.gnome.Mutter.DisplayConfig.xml +++ b/data/dbus-interfaces/org.gnome.Mutter.DisplayConfig.xml @@ -426,10 +426,6 @@ @@ -34,7 +34,7 @@ index b05337d74..7294c57a8 100644 diff --git a/data/dbus-interfaces/org.gnome.Mutter.X11.xml b/data/dbus-interfaces/org.gnome.Mutter.X11.xml new file mode 100644 -index 000000000..3d3c8a42f +index 0000000000..3d3c8a42f8 --- /dev/null +++ b/data/dbus-interfaces/org.gnome.Mutter.X11.xml @@ -0,0 +1,8 @@ @@ -47,7 +47,7 @@ index 000000000..3d3c8a42f + + diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c -index 77743bc72..7f98c2d98 100644 +index 77743bc722..7f98c2d983 100644 --- a/src/backends/meta-monitor-manager.c +++ b/src/backends/meta-monitor-manager.c @@ -2051,14 +2051,12 @@ meta_monitor_manager_handle_get_current_state (MetaDBusDisplayConfig *skeleton, @@ -78,7 +78,7 @@ index 77743bc72..7f98c2d98 100644 &max_screen_width, &max_screen_height)) diff --git a/src/meson.build b/src/meson.build -index 05df3bfd2..e658f98ca 100644 +index 05df3bfd28..e658f98caa 100644 --- a/src/meson.build +++ b/src/meson.build @@ -949,6 +949,11 @@ dbus_interfaces = [ @@ -94,7 +94,7 @@ index 05df3bfd2..e658f98ca 100644 if have_profiler diff --git a/src/x11/meta-x11-display.c b/src/x11/meta-x11-display.c -index 3cbf82844..fe152d20b 100644 +index 65eb217aaf..8768e14dac 100644 --- a/src/x11/meta-x11-display.c +++ b/src/x11/meta-x11-display.c @@ -70,7 +70,7 @@ @@ -168,7 +168,7 @@ index 3cbf82844..fe152d20b 100644 g_clear_pointer (&x11_display->alarm_filters, g_ptr_array_unref); g_clear_list (&x11_display->event_funcs, -@@ -1196,6 +1237,23 @@ meta_x11_display_init_frames_client (MetaX11Display *x11_display) +@@ -1220,6 +1261,23 @@ meta_x11_display_init_frames_client (MetaX11Display *x11_display) on_frames_client_died, x11_display); } @@ -192,7 +192,7 @@ index 3cbf82844..fe152d20b 100644 /** * meta_x11_display_new: * -@@ -1290,6 +1348,8 @@ meta_x11_display_new (MetaDisplay *display, +@@ -1314,6 +1372,8 @@ meta_x11_display_new (MetaDisplay *display, x11_display = g_object_new (META_TYPE_X11_DISPLAY, NULL); x11_display->display = display; @@ -201,7 +201,7 @@ index 3cbf82844..fe152d20b 100644 /* here we use XDisplayName which is what the user * probably put in, vs. DisplayString(display) which is * canonicalized by XOpenDisplay() -@@ -1951,6 +2011,8 @@ on_monitors_changed_internal (MetaMonitorManager *monitor_manager, +@@ -1975,6 +2035,8 @@ on_monitors_changed_internal (MetaMonitorManager *monitor_manager, } x11_display->has_xinerama_indices = FALSE; @@ -211,10 +211,10 @@ index 3cbf82844..fe152d20b 100644 static Bool -- -2.45.2 +2.46.0 -From 42ece5f5f528fb44f63772826fe928f88327a7dc Mon Sep 17 00:00:00 2001 +From dd50b8639bcab08fceb5d3af206e2c41aa6f2f02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= Date: Tue, 20 Feb 2024 23:51:48 +0100 Subject: [PATCH 2/5] Add an experimental feature for letting Xwayland clients @@ -232,7 +232,7 @@ Signed-off-by: Mingi Sung 3 files changed, 10 insertions(+) diff --git a/data/org.gnome.mutter.gschema.xml.in b/data/org.gnome.mutter.gschema.xml.in -index 92c97b12e..6751a8d7a 100644 +index 92c97b12e3..6751a8d7a9 100644 --- a/data/org.gnome.mutter.gschema.xml.in +++ b/data/org.gnome.mutter.gschema.xml.in @@ -5,6 +5,7 @@ @@ -257,7 +257,7 @@ index 92c97b12e..6751a8d7a 100644 diff --git a/src/backends/meta-settings-private.h b/src/backends/meta-settings-private.h -index afbba054a..2081a81b1 100644 +index afbba054af..2081a81b1a 100644 --- a/src/backends/meta-settings-private.h +++ b/src/backends/meta-settings-private.h @@ -32,6 +32,7 @@ typedef enum _MetaExperimentalFeature @@ -269,7 +269,7 @@ index afbba054a..2081a81b1 100644 typedef enum _MetaXwaylandExtension diff --git a/src/backends/meta-settings.c b/src/backends/meta-settings.c -index 3703b23b0..1ae59d636 100644 +index 3703b23b07..1ae59d6360 100644 --- a/src/backends/meta-settings.c +++ b/src/backends/meta-settings.c @@ -296,6 +296,8 @@ experimental_features_handler (GVariant *features_variant, @@ -282,10 +282,10 @@ index 3703b23b0..1ae59d636 100644 if (feature) g_message ("Enabling experimental feature '%s'", feature_str); -- -2.45.2 +2.46.0 -From e518927c779f8498f50fe2087efcd3ee88d75c12 Mon Sep 17 00:00:00 2001 +From 398a04f2558877e4876ea1551907719031b5adc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Tue, 12 Dec 2023 22:42:46 +0100 Subject: [PATCH 3/5] context: Put Wayland compositor getter in the context @@ -299,7 +299,7 @@ Signed-off-by: Mingi Sung 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/meta/meta-context.h b/src/meta/meta-context.h -index ef36bd2c3..2adb9b07e 100644 +index ef36bd2c30..2adb9b07e0 100644 --- a/src/meta/meta-context.h +++ b/src/meta/meta-context.h @@ -101,3 +101,8 @@ gboolean meta_context_raise_rlimit_nofile (MetaContext *context, @@ -312,7 +312,7 @@ index ef36bd2c3..2adb9b07e 100644 +MetaWaylandCompositor * meta_context_get_wayland_compositor (MetaContext *context); +#endif diff --git a/src/meta/meta-wayland-compositor.h b/src/meta/meta-wayland-compositor.h -index 7f4a50705..3df92fda5 100644 +index 7f4a507057..3df92fda57 100644 --- a/src/meta/meta-wayland-compositor.h +++ b/src/meta/meta-wayland-compositor.h @@ -31,9 +31,6 @@ G_DECLARE_FINAL_TYPE (MetaWaylandCompositor, @@ -326,7 +326,7 @@ index 7f4a50705..3df92fda5 100644 struct wl_display *meta_wayland_compositor_get_wayland_display (MetaWaylandCompositor *compositor); diff --git a/src/meta/types.h b/src/meta/types.h -index cbe2a9a3d..8fba4a839 100644 +index cbe2a9a3d7..8fba4a839e 100644 --- a/src/meta/types.h +++ b/src/meta/types.h @@ -38,3 +38,7 @@ typedef struct _MetaSettings MetaSettings; @@ -338,10 +338,10 @@ index cbe2a9a3d..8fba4a839 100644 +typedef struct _MetaWaylandCompositor MetaWaylandCompositor; +#endif -- -2.45.2 +2.46.0 -From 8f5fe12656db5a0488cbeb73298520b7d859b7fc Mon Sep 17 00:00:00 2001 +From 3b799a9250aa0d1df0ab8f611a730c140dfc9017 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Tue, 12 Dec 2023 22:52:44 +0100 Subject: [PATCH 4/5] Add experimental mode to use native scaling of Xwayland @@ -387,7 +387,7 @@ Signed-off-by: Mingi Sung 18 files changed, 896 insertions(+), 166 deletions(-) diff --git a/src/backends/meta-monitor-manager-private.h b/src/backends/meta-monitor-manager-private.h -index 0760a341a..6ed3fc2c3 100644 +index 0760a341a8..6ed3fc2c3f 100644 --- a/src/backends/meta-monitor-manager-private.h +++ b/src/backends/meta-monitor-manager-private.h @@ -436,3 +436,5 @@ gboolean meta_monitor_manager_apply_monitors_config (MetaMonitorManager * @@ -397,7 +397,7 @@ index 0760a341a..6ed3fc2c3 100644 + +MetaLogicalMonitorLayoutMode meta_monitor_manager_get_layout_mode (MetaMonitorManager *manager); diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c -index 7f98c2d98..45033d966 100644 +index 7f98c2d983..45033d966e 100644 --- a/src/backends/meta-monitor-manager.c +++ b/src/backends/meta-monitor-manager.c @@ -4116,3 +4116,9 @@ meta_monitor_manager_get_virtual_monitors (MetaMonitorManager *manager) @@ -411,7 +411,7 @@ index 7f98c2d98..45033d966 100644 + return manager->layout_mode; +} diff --git a/src/compositor/meta-window-actor-x11.c b/src/compositor/meta-window-actor-x11.c -index 19827af33..7df10e6c1 100644 +index 19827af331..7df10e6c15 100644 --- a/src/compositor/meta-window-actor-x11.c +++ b/src/compositor/meta-window-actor-x11.c @@ -688,11 +688,23 @@ meta_window_actor_x11_process_damage (MetaWindowActorX11 *actor_x11, @@ -444,7 +444,7 @@ index 19827af33..7df10e6c1 100644 meta_window_actor_notify_damaged (META_WINDOW_ACTOR (actor_x11)); } diff --git a/src/core/frame.c b/src/core/frame.c -index 7a09f89f1..57daf00ee 100644 +index 7a09f89f14..57daf00ee5 100644 --- a/src/core/frame.c +++ b/src/core/frame.c @@ -77,6 +77,7 @@ meta_window_x11_set_frame_xwindow (MetaWindow *window, @@ -643,7 +643,7 @@ index 7a09f89f1..57daf00ee 100644 event.xconfigure.above = None; event.xconfigure.override_redirect = False; diff --git a/src/wayland/meta-wayland-cursor-surface.c b/src/wayland/meta-wayland-cursor-surface.c -index 87a8895c8..5a16ce7d8 100644 +index 87a8895c88..5a16ce7d87 100644 --- a/src/wayland/meta-wayland-cursor-surface.c +++ b/src/wayland/meta-wayland-cursor-surface.c @@ -92,37 +92,29 @@ cursor_sprite_prepare_at (MetaCursorSprite *cursor_sprite, @@ -707,7 +707,7 @@ index 87a8895c8..5a16ce7d8 100644 meta_wayland_surface_update_outputs (surface); diff --git a/src/wayland/meta-wayland-outputs.c b/src/wayland/meta-wayland-outputs.c -index 89ae86445..f957bc339 100644 +index 89ae864450..f957bc339d 100644 --- a/src/wayland/meta-wayland-outputs.c +++ b/src/wayland/meta-wayland-outputs.c @@ -31,6 +31,10 @@ @@ -802,7 +802,7 @@ index 89ae86445..f957bc339 100644 compositor->outputs = diff --git a/src/wayland/meta-wayland-pointer.c b/src/wayland/meta-wayland-pointer.c -index cf6008064..b8c49849a 100644 +index cf6008064a..b8c49849ad 100644 --- a/src/wayland/meta-wayland-pointer.c +++ b/src/wayland/meta-wayland-pointer.c @@ -1247,6 +1247,20 @@ pointer_set_cursor (struct wl_client *client, @@ -827,7 +827,7 @@ index cf6008064..b8c49849a 100644 hot_x, hot_y); diff --git a/src/wayland/meta-wayland-private.h b/src/wayland/meta-wayland-private.h -index e8d442c03..834753ffd 100644 +index e8d442c039..834753ffdd 100644 --- a/src/wayland/meta-wayland-private.h +++ b/src/wayland/meta-wayland-private.h @@ -77,6 +77,8 @@ struct _MetaXWaylandManager @@ -840,7 +840,7 @@ index e8d442c03..834753ffd 100644 struct _MetaWaylandCompositor diff --git a/src/wayland/meta-wayland-surface.c b/src/wayland/meta-wayland-surface.c -index d8b36ff92..4ad95cd9d 100644 +index d8b36ff92b..4ad95cd9d5 100644 --- a/src/wayland/meta-wayland-surface.c +++ b/src/wayland/meta-wayland-surface.c @@ -782,8 +782,19 @@ meta_wayland_surface_apply_state (MetaWaylandSurface *surface, @@ -895,7 +895,7 @@ index d8b36ff92..4ad95cd9d 100644 void diff --git a/src/wayland/meta-window-xwayland.c b/src/wayland/meta-window-xwayland.c -index 1299a351c..5fb006962 100644 +index 1299a351ca..5fb0069626 100644 --- a/src/wayland/meta-window-xwayland.c +++ b/src/wayland/meta-window-xwayland.c @@ -27,8 +27,9 @@ @@ -992,7 +992,7 @@ index 1299a351c..5fb006962 100644 gobject_class->get_property = meta_window_xwayland_get_property; gobject_class->set_property = meta_window_xwayland_set_property; diff --git a/src/wayland/meta-xwayland-private.h b/src/wayland/meta-xwayland-private.h -index 7a9cb73fd..9e06f0315 100644 +index 7a9cb73fdf..9e06f03155 100644 --- a/src/wayland/meta-xwayland-private.h +++ b/src/wayland/meta-xwayland-private.h @@ -20,6 +20,7 @@ @@ -1004,7 +1004,7 @@ index 7a9cb73fd..9e06f0315 100644 gboolean meta_xwayland_init (MetaXWaylandManager *manager, diff --git a/src/wayland/meta-xwayland-surface.c b/src/wayland/meta-xwayland-surface.c -index 8fa1c72a9..c6daf9b26 100644 +index 8fa1c72a96..c6daf9b267 100644 --- a/src/wayland/meta-xwayland-surface.c +++ b/src/wayland/meta-xwayland-surface.c @@ -163,13 +163,19 @@ meta_xwayland_surface_get_relative_coordinates (MetaWaylandSurfaceRole *surface_ @@ -1030,7 +1030,7 @@ index 8fa1c72a9..c6daf9b26 100644 static MetaWaylandSurface * diff --git a/src/wayland/meta-xwayland.c b/src/wayland/meta-xwayland.c -index ea9c27d74..828e6f64e 100644 +index 7f2915cfeb..f6f9d01ff4 100644 --- a/src/wayland/meta-xwayland.c +++ b/src/wayland/meta-xwayland.c @@ -1051,6 +1051,29 @@ meta_xwayland_shutdown (MetaWaylandCompositor *compositor) @@ -1084,7 +1084,7 @@ index ea9c27d74..828e6f64e 100644 return TRUE; } -@@ -1312,3 +1342,29 @@ meta_xwayland_set_should_enable_ei_portal (MetaXWaylandManager *manager, +@@ -1313,3 +1343,29 @@ meta_xwayland_set_should_enable_ei_portal (MetaXWaylandManager *manager, { manager->should_enable_ei_portal = should_enable_ei_portal; } @@ -1115,7 +1115,7 @@ index ea9c27d74..828e6f64e 100644 + return 1; +} diff --git a/src/wayland/meta-xwayland.h b/src/wayland/meta-xwayland.h -index daf9d1abb..ae7a06977 100644 +index daf9d1abb0..ae7a06977e 100644 --- a/src/wayland/meta-xwayland.h +++ b/src/wayland/meta-xwayland.h @@ -48,3 +48,5 @@ META_EXPORT_TEST @@ -1125,7 +1125,7 @@ index daf9d1abb..ae7a06977 100644 + +int meta_xwayland_get_effective_scale (MetaXWaylandManager *manager); diff --git a/src/x11/meta-x11-display.c b/src/x11/meta-x11-display.c -index fe152d20b..602879aac 100644 +index 8768e14dac..024374e7ef 100644 --- a/src/x11/meta-x11-display.c +++ b/src/x11/meta-x11-display.c @@ -130,6 +130,42 @@ backend_from_x11_display (MetaX11Display *x11_display) @@ -1207,7 +1207,7 @@ index fe152d20b..602879aac 100644 meta_dbus_x11_set_ui_scaling_factor (priv->dbus_api, ui_scaling_factor); } -@@ -613,6 +671,9 @@ set_desktop_geometry_hint (MetaX11Display *x11_display) +@@ -637,6 +695,9 @@ set_desktop_geometry_hint (MetaX11Display *x11_display) return; meta_display_get_size (x11_display->display, &monitor_width, &monitor_height); @@ -1217,7 +1217,7 @@ index fe152d20b..602879aac 100644 data[0] = monitor_width; data[1] = monitor_height; -@@ -1022,14 +1083,22 @@ set_workspace_work_area_hint (MetaWorkspace *workspace, +@@ -1046,14 +1107,22 @@ set_workspace_work_area_hint (MetaWorkspace *workspace, for (l = logical_monitors; l; l = l->next) { @@ -1246,7 +1246,7 @@ index fe152d20b..602879aac 100644 tmp += 4; } -@@ -1058,7 +1127,6 @@ set_work_area_hint (MetaDisplay *display, +@@ -1082,7 +1151,6 @@ set_work_area_hint (MetaDisplay *display, int num_workspaces; GList *l; unsigned long *data, *tmp; @@ -1254,7 +1254,7 @@ index fe152d20b..602879aac 100644 num_workspaces = meta_workspace_manager_get_n_workspaces (workspace_manager); data = g_new (unsigned long, num_workspaces * 4); -@@ -1067,14 +1135,22 @@ set_work_area_hint (MetaDisplay *display, +@@ -1091,14 +1159,22 @@ set_work_area_hint (MetaDisplay *display, for (l = workspace_manager->workspaces; l; l = l->next) { MetaWorkspace *workspace = l->data; @@ -1282,7 +1282,7 @@ index fe152d20b..602879aac 100644 tmp += 4; } -@@ -1254,6 +1330,41 @@ initialize_dbus_interface (MetaX11Display *x11_display) +@@ -1278,6 +1354,41 @@ initialize_dbus_interface (MetaX11Display *x11_display) update_ui_scaling_factor (x11_display); } @@ -1324,7 +1324,7 @@ index fe152d20b..602879aac 100644 /** * meta_x11_display_new: * -@@ -1272,6 +1383,7 @@ meta_x11_display_new (MetaDisplay *display, +@@ -1296,6 +1407,7 @@ meta_x11_display_new (MetaDisplay *display, MetaBackend *backend = meta_context_get_backend (context); MetaMonitorManager *monitor_manager = meta_backend_get_monitor_manager (backend); @@ -1332,7 +1332,7 @@ index fe152d20b..602879aac 100644 g_autoptr (MetaX11Display) x11_display = NULL; Display *xdisplay; Screen *xscreen; -@@ -1442,7 +1554,7 @@ meta_x11_display_new (MetaDisplay *display, +@@ -1466,7 +1578,7 @@ meta_x11_display_new (MetaDisplay *display, "monitors-changed-internal", G_CALLBACK (on_monitors_changed_internal), x11_display, @@ -1341,7 +1341,7 @@ index fe152d20b..602879aac 100644 init_leader_window (x11_display, ×tamp); x11_display->timestamp = timestamp; -@@ -1535,6 +1647,11 @@ meta_x11_display_new (MetaDisplay *display, +@@ -1559,6 +1671,11 @@ meta_x11_display_new (MetaDisplay *display, meta_prefs_add_listener (prefs_changed_callback, x11_display); @@ -1353,7 +1353,7 @@ index fe152d20b..602879aac 100644 set_work_area_hint (display, x11_display); g_signal_connect_object (display, "workareas-changed", -@@ -1748,16 +1865,12 @@ meta_x11_display_reload_cursor (MetaX11Display *x11_display) +@@ -1772,16 +1889,12 @@ meta_x11_display_reload_cursor (MetaX11Display *x11_display) } static void @@ -1375,7 +1375,7 @@ index fe152d20b..602879aac 100644 } static void -@@ -1809,8 +1922,37 @@ static void +@@ -1833,8 +1946,37 @@ static void update_cursor_theme (MetaX11Display *x11_display) { MetaBackend *backend = backend_from_x11_display (x11_display); @@ -1414,7 +1414,7 @@ index fe152d20b..602879aac 100644 schedule_reload_x11_cursor (x11_display); if (META_IS_BACKEND_X11 (backend)) -@@ -1818,7 +1960,7 @@ update_cursor_theme (MetaX11Display *x11_display) +@@ -1842,7 +1984,7 @@ update_cursor_theme (MetaX11Display *x11_display) MetaBackendX11 *backend_x11 = META_BACKEND_X11 (backend); Display *xdisplay = meta_backend_x11_get_xdisplay (backend_x11); @@ -1424,7 +1424,7 @@ index fe152d20b..602879aac 100644 } } diff --git a/src/x11/window-props.c b/src/x11/window-props.c -index c18b3eab5..494fbe843 100644 +index c18b3eab59..494fbe8431 100644 --- a/src/x11/window-props.c +++ b/src/x11/window-props.c @@ -305,10 +305,15 @@ reload_icon_geometry (MetaWindow *window, @@ -1566,7 +1566,7 @@ index c18b3eab5..494fbe843 100644 /* Put back saved ConfigureRequest. */ window->size_hints.x = x; diff --git a/src/x11/window-x11.c b/src/x11/window-x11.c -index 443f40f28..ccbd75d1a 100644 +index 443f40f284..ccbd75d1a9 100644 --- a/src/x11/window-x11.c +++ b/src/x11/window-x11.c @@ -110,6 +110,113 @@ meta_window_x11_get_private (MetaWindowX11 *window_x11) @@ -2038,7 +2038,7 @@ index 443f40f28..ccbd75d1a 100644 priv->client_rect = window->rect; window->buffer_rect = window->rect; diff --git a/src/x11/window-x11.h b/src/x11/window-x11.h -index 205eaaa63..fa3fbea6a 100644 +index 205eaaa632..fa3fbea6a8 100644 --- a/src/x11/window-x11.h +++ b/src/x11/window-x11.h @@ -45,6 +45,24 @@ struct _MetaWindowX11Class @@ -2091,10 +2091,10 @@ index 205eaaa63..fa3fbea6a 100644 + int *stage_width, + int *stage_heigth); -- -2.45.2 +2.46.0 -From 26bac17fc06d840006c86935b6e9486ccf033082 Mon Sep 17 00:00:00 2001 +From 6f35aed57a4a98ef878e483958e930840a6667ae Mon Sep 17 00:00:00 2001 From: HydroH Date: Tue, 21 May 2024 19:15:36 +0800 Subject: [PATCH 5/5] Correctly set bounding region for undecorated windows @@ -2105,7 +2105,7 @@ Signed-off-by: Mingi Sung 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/x11/window-x11.c b/src/x11/window-x11.c -index ccbd75d1a..5f37c634a 100644 +index ccbd75d1a9..5f37c634ac 100644 --- a/src/x11/window-x11.c +++ b/src/x11/window-x11.c @@ -2573,8 +2573,13 @@ meta_window_x11_update_input_region (MetaWindow *window) @@ -2125,5 +2125,5 @@ index ccbd75d1a..5f37c634a 100644 if (META_X11_DISPLAY_HAS_SHAPE (x11_display)) -- -2.45.2 +2.46.0 diff --git a/mr3751.patch b/mr3751.patch index 65c09db..30aacbf 100644 --- a/mr3751.patch +++ b/mr3751.patch @@ -1,4 +1,4 @@ -From 033b1b83a8484247519bc98eee70add380d1e3fc Mon Sep 17 00:00:00 2001 +From 0bcbfa0ae68bac604b6922c236a2dc42e535e994 Mon Sep 17 00:00:00 2001 From: Alynx Zhou Date: Wed, 15 May 2024 00:07:41 +0800 Subject: [PATCH] wayland/text-input-v1: Implement basic text-input-v1 support @@ -10,6 +10,9 @@ Japanese or Korean. Closes . +Origin: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3751 +Commit: 2a94e19b00434fe4d7ab858a6cdcff6364f6e408 + Signed-off-by: Mingi Sung --- clutter/clutter/clutter-enums.h | 3 + @@ -27,7 +30,7 @@ Signed-off-by: Mingi Sung create mode 100644 src/wayland/meta-wayland-text-input-v1.h diff --git a/clutter/clutter/clutter-enums.h b/clutter/clutter/clutter-enums.h -index 45956bf57..8198e7351 100644 +index 45956bf57b..8198e73516 100644 --- a/clutter/clutter/clutter-enums.h +++ b/clutter/clutter/clutter-enums.h @@ -1183,6 +1183,9 @@ typedef enum @@ -41,7 +44,7 @@ index 45956bf57..8198e7351 100644 typedef enum diff --git a/src/core/events.c b/src/core/events.c -index 1f36d2feb..a1874d673 100644 +index 1f36d2feb6..a1874d6737 100644 --- a/src/core/events.c +++ b/src/core/events.c @@ -238,6 +238,7 @@ meta_display_handle_event (MetaDisplay *display, @@ -77,7 +80,7 @@ index 1f36d2feb..a1874d673 100644 if (wayland_compositor) diff --git a/src/meson.build b/src/meson.build -index 05df3bfd2..fad08706a 100644 +index 05df3bfd28..fad08706a6 100644 --- a/src/meson.build +++ b/src/meson.build @@ -688,6 +688,8 @@ if have_wayland @@ -98,7 +101,7 @@ index 05df3bfd2..fad08706a 100644 ['xdg-activation', 'staging', 'v1', ], ['xdg-foreign', 'unstable', 'v1', ], diff --git a/src/wayland/meta-wayland-seat.c b/src/wayland/meta-wayland-seat.c -index 2301e0068..d0f888084 100644 +index 2301e00685..d0f8880840 100644 --- a/src/wayland/meta-wayland-seat.c +++ b/src/wayland/meta-wayland-seat.c @@ -229,6 +229,7 @@ default_focus (MetaWaylandEventHandler *handler, @@ -149,7 +152,7 @@ index 2301e0068..d0f888084 100644 break; diff --git a/src/wayland/meta-wayland-seat.h b/src/wayland/meta-wayland-seat.h -index 83fd7de1e..37704cf5a 100644 +index 83fd7de1ed..37704cf5a1 100644 --- a/src/wayland/meta-wayland-seat.h +++ b/src/wayland/meta-wayland-seat.h @@ -30,6 +30,7 @@ @@ -170,7 +173,7 @@ index 83fd7de1e..37704cf5a 100644 MetaWaylandEventHandler *default_handler; diff --git a/src/wayland/meta-wayland-text-input-v1.c b/src/wayland/meta-wayland-text-input-v1.c new file mode 100644 -index 000000000..1826a4ff4 +index 0000000000..1826a4ff43 --- /dev/null +++ b/src/wayland/meta-wayland-text-input-v1.c @@ -0,0 +1,859 @@ @@ -1035,7 +1038,7 @@ index 000000000..1826a4ff4 +} diff --git a/src/wayland/meta-wayland-text-input-v1.h b/src/wayland/meta-wayland-text-input-v1.h new file mode 100644 -index 000000000..79b1c0a54 +index 0000000000..79b1c0a541 --- /dev/null +++ b/src/wayland/meta-wayland-text-input-v1.h @@ -0,0 +1,38 @@ @@ -1078,7 +1081,7 @@ index 000000000..79b1c0a54 +gboolean meta_wayland_text_input_v1_handle_event (MetaWaylandTextInputV1 *text_input, + const ClutterEvent *event); diff --git a/src/wayland/meta-wayland-versions.h b/src/wayland/meta-wayland-versions.h -index 900f30d78..a77b81461 100644 +index 900f30d788..a77b81461b 100644 --- a/src/wayland/meta-wayland-versions.h +++ b/src/wayland/meta-wayland-versions.h @@ -49,6 +49,7 @@ @@ -1090,7 +1093,7 @@ index 900f30d78..a77b81461 100644 #define META_ZWP_PRIMARY_SELECTION_V1_VERSION 1 #define META_WP_PRESENTATION_VERSION 1 diff --git a/src/wayland/meta-wayland.c b/src/wayland/meta-wayland.c -index 501b69a91..0114823c1 100644 +index 501b69a91c..0114823c14 100644 --- a/src/wayland/meta-wayland.c +++ b/src/wayland/meta-wayland.c @@ -865,6 +865,7 @@ meta_wayland_compositor_new (MetaContext *context) @@ -1115,7 +1118,7 @@ index 501b69a91..0114823c1 100644 meta_wayland_compositor_update_focus (MetaWaylandCompositor *compositor, MetaWindow *window) diff --git a/src/wayland/meta-wayland.h b/src/wayland/meta-wayland.h -index 0a0476eba..c23e82cdc 100644 +index 0a0476eba0..c23e82cdca 100644 --- a/src/wayland/meta-wayland.h +++ b/src/wayland/meta-wayland.h @@ -26,6 +26,7 @@ @@ -1135,5 +1138,5 @@ index 0a0476eba..c23e82cdc 100644 #ifdef HAVE_XWAYLAND void meta_wayland_compositor_notify_surface_id (MetaWaylandCompositor *compositor, -- -2.45.2 +2.46.0 diff --git a/mr3912.patch b/mr3912.patch index 88a270f..69f8e8a 100644 --- a/mr3912.patch +++ b/mr3912.patch @@ -1,4 +1,4 @@ -From cd9e973930c5a93c7dc752a9b041a4ab649165ee Mon Sep 17 00:00:00 2001 +From 9cc50ce03e29614740a1e524866f113dbf7fe27c Mon Sep 17 00:00:00 2001 From: Daniel van Vugt Date: Mon, 29 Jul 2024 17:44:53 +0800 Subject: [PATCH] backends/native: Avoid duplicating or losing KMS property @@ -15,24 +15,63 @@ 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 --- - src/backends/native/meta-onscreen-native.c | 10 ++++------ - 1 file changed, 4 insertions(+), 6 deletions(-) + 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..43a7d186a4 100644 +index 1a31f04a16..60b7d877a5 100644 --- a/src/backends/native/meta-onscreen-native.c +++ b/src/backends/native/meta-onscreen-native.c -@@ -225,7 +225,6 @@ notify_view_crtc_presented (MetaRendererView *view, - CoglFramebuffer *framebuffer = - clutter_stage_view_get_onscreen (stage_view); - CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer); -- MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen); - CoglFrameInfo *frame_info; - MetaCrtc *crtc; +@@ -84,6 +84,13 @@ typedef struct _MetaOnscreenNativeSecondaryGpuState + MetaSharedFramebufferImportStatus import_status; + } MetaOnscreenNativeSecondaryGpuState; -@@ -233,11 +232,6 @@ notify_view_crtc_presented (MetaRendererView *view, ++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); @@ -40,42 +79,217 @@ index 1a31f04a16..43a7d186a4 100644 - 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; -@@ -1786,6 +1780,7 @@ meta_onscreen_native_prepare_frame (CoglOnscreen *onscreen, + /* +@@ -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->is_gamma_lut_invalid = FALSE; ++ onscreen_native->property.gamma_lut.invalidated = FALSE; ++ onscreen_native->property.gamma_lut.updates_pending++; } - if (onscreen_native->is_privacy_screen_invalid) -@@ -1800,6 +1795,7 @@ meta_onscreen_native_prepare_frame (CoglOnscreen *onscreen, +- 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->is_privacy_screen_invalid = FALSE; ++ onscreen_native->property.privacy_screen.invalidated = FALSE; ++ onscreen_native->property.privacy_screen.updates_pending++; } - if (onscreen_native->is_color_space_invalid) -@@ -1814,6 +1810,7 @@ meta_onscreen_native_prepare_frame (CoglOnscreen *onscreen, +- 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->is_color_space_invalid = FALSE; ++ onscreen_native->property.color_space.invalidated = FALSE; ++ onscreen_native->property.color_space.updates_pending++; } - if (onscreen_native->is_hdr_metadata_invalid) -@@ -1828,6 +1825,7 @@ meta_onscreen_native_prepare_frame (CoglOnscreen *onscreen, +- 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->is_hdr_metadata_invalid = FALSE; ++ 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.45.2 +2.46.0