1
0
Fork 0

1:46.5-1: Sync to gnome-46 & Remove !3960 as being merged

Signed-off-by: Mingi Sung <sungmg@saltyming.net>
This commit is contained in:
Mingi Sung 2024-09-15 14:07:15 +09:00
parent d32c1dd8cb
commit 9ed55768df
Signed by: sungmg
GPG key ID: 41BAFD6FFD8036C5
4 changed files with 71 additions and 406 deletions

View file

@ -1,7 +1,7 @@
pkgbase = mutter-performance pkgbase = mutter-performance
pkgdesc = A window manager for GNOME | Attempts to improve performances with non-upstreamed merge-requests and frequent stable branch resync pkgdesc = A window manager for GNOME | Attempts to improve performances with non-upstreamed merge-requests and frequent stable branch resync
pkgver = 46.4+r18+g081b918ba pkgver = 46.5
pkgrel = 3 pkgrel = 1
epoch = 1 epoch = 1
url = https://gitlab.gnome.org/GNOME/mutter url = https://gitlab.gnome.org/GNOME/mutter
arch = x86_64 arch = x86_64
@ -73,21 +73,18 @@ pkgbase = mutter-performance
depends = systemd-libs depends = systemd-libs
depends = wayland depends = wayland
depends = xorg-xwayland depends = xorg-xwayland
source = git+https://gitlab.gnome.org/GNOME/mutter.git#commit=081b918bac2eae6a19066ea30ab18d5dbd5b8ea7 source = git+https://gitlab.gnome.org/GNOME/mutter.git#commit=f585134c114797aae27f1a82013c665a5c1b94ed
source = mr1441.patch source = mr1441.patch
source = mr3567.patch source = mr3567.patch
source = mr3751.patch source = mr3751.patch
source = mr3960.patch sha256sums = caf3b0c514334e4684d294ba65a64e22c94bf3458118ea2a3f02de761e0b71f2
sha256sums = 81978164d9f2715438fbc623c77ea7529332cac5c4c519e4781daa5bf1a315eb sha256sums = 1fe74042bc5d4369680036918eae10fb3d788983d7b57043a75b291b7f1050c8
sha256sums = 043d6f4abce085b5ecc3debf0d334cc9fe826d256a421a4cbbe6aee8cffce255
sha256sums = 2e474a574edad8dc047a53a920fc7cbe005cac0102907eef80a252fc556d0517 sha256sums = 2e474a574edad8dc047a53a920fc7cbe005cac0102907eef80a252fc556d0517
sha256sums = 4c15b0e6d0001c8c3feedf05a9140f7f17d52eb36ff7b8039e0281c1373ccdfe sha256sums = 4c15b0e6d0001c8c3feedf05a9140f7f17d52eb36ff7b8039e0281c1373ccdfe
sha256sums = 361af6ed4ff6039c3b24dca8cd737468b7a441ea9855f8033c8348ce1aab0f0c b2sums = 3c7990afd584836dd092e30813194ac24608416051a9b06c51d2f9577206360cb0f8bafceccc42ce1809d47e7a1676326fe8b87fa231c6abe2d9dddba10b6581
b2sums = aaed24cb5bac5f62096d44bfdf0e6acfff3944137a06f5cbd7fd1f18d03ebb816d02ab170c9128eafb023a339de3e7ea79480654687ec449d29f9e45d66218e3 b2sums = cd0ae704aefdee7052f18fa75b156027da93243e1abd32692fe7d264b1e63bb41b63c7ea7ca76b74650e4dcdc76c456c83e5d37972196864bbe185aa2819f876
b2sums = 3231bdae36ae05892d2106199dc75a0dd8dc59b45bc77a51090ad35bec9e21420aeb86578e97fb64565b265beb7406a406362a06a091ef066965c7c9ea2fe50e
b2sums = 65302b1fa24a7aba26915269fb694c7a64b134ee2062ec7e649036a3a41efb2f2f4110cff6194808af34985855ade641c5fb01f0b97536cd3c912892ea3a0d4c b2sums = 65302b1fa24a7aba26915269fb694c7a64b134ee2062ec7e649036a3a41efb2f2f4110cff6194808af34985855ade641c5fb01f0b97536cd3c912892ea3a0d4c
b2sums = f9f2284d7236d6072a818de3784a339c2d934490da8870876f49d4effd59ce807593ce8b8a3c5e06586fd5fd7e81fb31fedca84115acf1e71cfe23d4a5e727b3 b2sums = f9f2284d7236d6072a818de3784a339c2d934490da8870876f49d4effd59ce807593ce8b8a3c5e06586fd5fd7e81fb31fedca84115acf1e71cfe23d4a5e727b3
b2sums = 9517c7c84b20ff28ccb3cfd1168eb3ca294934df6088c7938b1ff659933043d2687031b2da1eac7eaf0a8cec21284147cb925aa08584563488fce1bcef361184
pkgname = mutter-performance pkgname = mutter-performance
groups = gnome groups = gnome

View file

@ -11,8 +11,8 @@
### PACKAGE OPTIONS ### PACKAGE OPTIONS
## MERGE REQUESTS SELECTION ## MERGE REQUESTS SELECTION
# Merge Requests List: ('579' '1441' '3567' '3751' '3960') # Merge Requests List: ('579' '1441' '3567' '3751')
_merge_requests_to_use=('1441' '3751' '3960') _merge_requests_to_use=('1441' '3751')
### IMPORTANT: Do no edit below this line unless you know what you're doing! ### IMPORTANT: Do no edit below this line unless you know what you're doing!
@ -20,8 +20,8 @@ _merge_requests_to_use=('1441' '3751' '3960')
_pkgname=mutter _pkgname=mutter
pkgname=mutter-performance pkgname=mutter-performance
epoch=1 epoch=1
pkgver=46.4+r18+g081b918ba pkgver=46.5
pkgrel=3 pkgrel=1
pkgdesc="A window manager for GNOME | Attempts to improve performances with non-upstreamed merge-requests and frequent stable branch resync" 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" url="https://gitlab.gnome.org/GNOME/mutter"
arch=(x86_64 aarch64) arch=(x86_64 aarch64)
@ -100,22 +100,19 @@ makedepends=(
if [ -n "$_enable_check" ]; then if [ -n "$_enable_check" ]; then
checkdepends=(gnome-session xorg-server-xvfb pipewire-session-manager python-dbusmock zenity) checkdepends=(gnome-session xorg-server-xvfb pipewire-session-manager python-dbusmock zenity)
fi fi
_commit=081b918bac2eae6a19066ea30ab18d5dbd5b8ea7 # tags/46.4^18 _commit=f585134c114797aae27f1a82013c665a5c1b94ed # tags/46.5^0
source=("git+$url.git#commit=$_commit" source=("git+$url.git#commit=$_commit"
'mr1441.patch' 'mr1441.patch'
'mr3567.patch' 'mr3567.patch'
'mr3751.patch' 'mr3751.patch')
'mr3960.patch') sha256sums=('caf3b0c514334e4684d294ba65a64e22c94bf3458118ea2a3f02de761e0b71f2'
sha256sums=('81978164d9f2715438fbc623c77ea7529332cac5c4c519e4781daa5bf1a315eb' '1fe74042bc5d4369680036918eae10fb3d788983d7b57043a75b291b7f1050c8'
'043d6f4abce085b5ecc3debf0d334cc9fe826d256a421a4cbbe6aee8cffce255'
'2e474a574edad8dc047a53a920fc7cbe005cac0102907eef80a252fc556d0517' '2e474a574edad8dc047a53a920fc7cbe005cac0102907eef80a252fc556d0517'
'4c15b0e6d0001c8c3feedf05a9140f7f17d52eb36ff7b8039e0281c1373ccdfe' '4c15b0e6d0001c8c3feedf05a9140f7f17d52eb36ff7b8039e0281c1373ccdfe')
'361af6ed4ff6039c3b24dca8cd737468b7a441ea9855f8033c8348ce1aab0f0c') b2sums=('3c7990afd584836dd092e30813194ac24608416051a9b06c51d2f9577206360cb0f8bafceccc42ce1809d47e7a1676326fe8b87fa231c6abe2d9dddba10b6581'
b2sums=('aaed24cb5bac5f62096d44bfdf0e6acfff3944137a06f5cbd7fd1f18d03ebb816d02ab170c9128eafb023a339de3e7ea79480654687ec449d29f9e45d66218e3' 'cd0ae704aefdee7052f18fa75b156027da93243e1abd32692fe7d264b1e63bb41b63c7ea7ca76b74650e4dcdc76c456c83e5d37972196864bbe185aa2819f876'
'3231bdae36ae05892d2106199dc75a0dd8dc59b45bc77a51090ad35bec9e21420aeb86578e97fb64565b265beb7406a406362a06a091ef066965c7c9ea2fe50e'
'65302b1fa24a7aba26915269fb694c7a64b134ee2062ec7e649036a3a41efb2f2f4110cff6194808af34985855ade641c5fb01f0b97536cd3c912892ea3a0d4c' '65302b1fa24a7aba26915269fb694c7a64b134ee2062ec7e649036a3a41efb2f2f4110cff6194808af34985855ade641c5fb01f0b97536cd3c912892ea3a0d4c'
'f9f2284d7236d6072a818de3784a339c2d934490da8870876f49d4effd59ce807593ce8b8a3c5e06586fd5fd7e81fb31fedca84115acf1e71cfe23d4a5e727b3' 'f9f2284d7236d6072a818de3784a339c2d934490da8870876f49d4effd59ce807593ce8b8a3c5e06586fd5fd7e81fb31fedca84115acf1e71cfe23d4a5e727b3')
'9517c7c84b20ff28ccb3cfd1168eb3ca294934df6088c7938b1ff659933043d2687031b2da1eac7eaf0a8cec21284147cb925aa08584563488fce1bcef361184')
for mr in "${_merge_requests_to_use[@]}"; do for mr in "${_merge_requests_to_use[@]}"; do
if [ '3567' = "$mr" ]; then if [ '3567' = "$mr" ]; then
@ -222,13 +219,6 @@ prepare() {
# (mostly Chromium/Electron based apps with Ozone Wayland.) # (mostly Chromium/Electron based apps with Ozone Wayland.)
pick_mr '3751' 'mr3751.patch' 'patch' pick_mr '3751' 'mr3751.patch' 'patch'
# Title: kms: Inhibit real time scheduling until initial mode set
# Author: Jonas Ådahl <jadahl@gmail.com>
# URL: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3960
# Type: 3
# Status: 4
pick_mr '3960' 'mr3960.patch' 'patch'
# Title: Draft: Dynamic triple/double buffering (v4) # Title: Draft: Dynamic triple/double buffering (v4)
# Author: Daniel van Vugt <daniel.van.vugt@canonical.com> # Author: Daniel van Vugt <daniel.van.vugt@canonical.com>
# URL: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1441 # URL: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1441

View file

@ -1,6 +1,6 @@
From 37bf13fe3de848b8d16e535bac92f3f4edd41751 Mon Sep 17 00:00:00 2001 From e1d79da6a8267f2e1598feb8d0e0889d138c77ca Mon Sep 17 00:00:00 2001
From: Mingi Sung <sungmg@saltyming.net> From: Mingi Sung <sungmg@saltyming.net>
Date: Sat, 14 Sep 2024 11:59:23 +0900 Date: Sun, 15 Sep 2024 14:00:51 +0900
Subject: [PATCH] Merge branch 'sungmg-triple-buffering-v4-46' into gnome-46 Subject: [PATCH] Merge branch 'sungmg-triple-buffering-v4-46' into gnome-46
Use triple buffering if and when the previous frame is running late. Use triple buffering if and when the previous frame is running late.
@ -1439,7 +1439,7 @@ index 7812ec0421..488d24ac5d 100644
int signaled_sync_file; int signaled_sync_file;
diff --git a/src/backends/native/meta-kms-impl-device.c b/src/backends/native/meta-kms-impl-device.c diff --git a/src/backends/native/meta-kms-impl-device.c b/src/backends/native/meta-kms-impl-device.c
index 6758982a6a..2a87dc0898 100644 index e48cffc4f1..a0de4158ac 100644
--- a/src/backends/native/meta-kms-impl-device.c --- a/src/backends/native/meta-kms-impl-device.c
+++ b/src/backends/native/meta-kms-impl-device.c +++ b/src/backends/native/meta-kms-impl-device.c
@@ -39,6 +39,7 @@ @@ -39,6 +39,7 @@
@ -1468,7 +1468,7 @@ index 6758982a6a..2a87dc0898 100644
} CrtcFrame; } CrtcFrame;
typedef enum _MetaDeadlineTimerState typedef enum _MetaDeadlineTimerState
@@ -1165,6 +1174,7 @@ arm_crtc_frame_deadline_timer (CrtcFrame *crtc_frame, @@ -1167,6 +1176,7 @@ arm_crtc_frame_deadline_timer (CrtcFrame *crtc_frame,
timerfd_settime (crtc_frame->deadline.timer_fd, timerfd_settime (crtc_frame->deadline.timer_fd,
TFD_TIMER_ABSTIME, &its, NULL); TFD_TIMER_ABSTIME, &its, NULL);
@ -1476,7 +1476,7 @@ index 6758982a6a..2a87dc0898 100644
crtc_frame->deadline.expected_presentation_time_us = next_presentation_us; crtc_frame->deadline.expected_presentation_time_us = next_presentation_us;
crtc_frame->deadline.has_expected_presentation_time = next_presentation_us != 0; crtc_frame->deadline.has_expected_presentation_time = next_presentation_us != 0;
crtc_frame->deadline.armed = TRUE; crtc_frame->deadline.armed = TRUE;
@@ -1197,7 +1207,7 @@ crtc_page_flip_feedback_flipped (MetaKmsCrtc *crtc, @@ -1199,7 +1209,7 @@ crtc_page_flip_feedback_flipped (MetaKmsCrtc *crtc,
CrtcFrame *crtc_frame = user_data; CrtcFrame *crtc_frame = user_data;
if (crtc_frame->deadline.is_deadline_page_flip && if (crtc_frame->deadline.is_deadline_page_flip &&
@ -1485,7 +1485,7 @@ index 6758982a6a..2a87dc0898 100644
{ {
struct timeval page_flip_timeval; struct timeval page_flip_timeval;
int64_t presentation_time_us; int64_t presentation_time_us;
@@ -1210,7 +1220,7 @@ crtc_page_flip_feedback_flipped (MetaKmsCrtc *crtc, @@ -1212,7 +1222,7 @@ crtc_page_flip_feedback_flipped (MetaKmsCrtc *crtc,
if (crtc_frame->deadline.has_expected_presentation_time) if (crtc_frame->deadline.has_expected_presentation_time)
{ {
@ -1494,7 +1494,7 @@ index 6758982a6a..2a87dc0898 100644
"Deadline page flip presentation time: %" G_GINT64_FORMAT " us, " "Deadline page flip presentation time: %" G_GINT64_FORMAT " us, "
"expected %" G_GINT64_FORMAT " us " "expected %" G_GINT64_FORMAT " us "
"(diff: %" G_GINT64_FORMAT ")", "(diff: %" G_GINT64_FORMAT ")",
@@ -1221,7 +1231,7 @@ crtc_page_flip_feedback_flipped (MetaKmsCrtc *crtc, @@ -1223,7 +1233,7 @@ crtc_page_flip_feedback_flipped (MetaKmsCrtc *crtc,
} }
else else
{ {
@ -1503,7 +1503,7 @@ index 6758982a6a..2a87dc0898 100644
"Deadline page flip presentation time: %" G_GINT64_FORMAT " us", "Deadline page flip presentation time: %" G_GINT64_FORMAT " us",
presentation_time_us); presentation_time_us);
} }
@@ -1390,11 +1400,16 @@ crtc_frame_deadline_dispatch (MetaThreadImpl *thread_impl, @@ -1392,11 +1402,16 @@ crtc_frame_deadline_dispatch (MetaThreadImpl *thread_impl,
GError **error) GError **error)
{ {
CrtcFrame *crtc_frame = user_data; CrtcFrame *crtc_frame = user_data;
@ -1521,7 +1521,7 @@ index 6758982a6a..2a87dc0898 100644
ret = read (crtc_frame->deadline.timer_fd, ret = read (crtc_frame->deadline.timer_fd,
&timer_value, &timer_value,
@@ -1416,6 +1431,36 @@ crtc_frame_deadline_dispatch (MetaThreadImpl *thread_impl, @@ -1418,6 +1433,36 @@ crtc_frame_deadline_dispatch (MetaThreadImpl *thread_impl,
crtc_frame->crtc, crtc_frame->crtc,
g_steal_pointer (&crtc_frame->pending_update), g_steal_pointer (&crtc_frame->pending_update),
META_KMS_UPDATE_FLAG_NONE); META_KMS_UPDATE_FLAG_NONE);
@ -1558,7 +1558,7 @@ index 6758982a6a..2a87dc0898 100644
if (meta_kms_feedback_did_pass (feedback)) if (meta_kms_feedback_did_pass (feedback))
crtc_frame->deadline.is_deadline_page_flip = TRUE; crtc_frame->deadline.is_deadline_page_flip = TRUE;
disarm_crtc_frame_deadline_timer (crtc_frame); disarm_crtc_frame_deadline_timer (crtc_frame);
@@ -1429,6 +1474,8 @@ crtc_frame_free (CrtcFrame *crtc_frame) @@ -1431,6 +1476,8 @@ crtc_frame_free (CrtcFrame *crtc_frame)
g_clear_fd (&crtc_frame->deadline.timer_fd, NULL); g_clear_fd (&crtc_frame->deadline.timer_fd, NULL);
g_clear_pointer (&crtc_frame->deadline.source, g_source_destroy); g_clear_pointer (&crtc_frame->deadline.source, g_source_destroy);
g_clear_pointer (&crtc_frame->pending_update, meta_kms_update_free); g_clear_pointer (&crtc_frame->pending_update, meta_kms_update_free);
@ -1567,7 +1567,7 @@ index 6758982a6a..2a87dc0898 100644
g_free (crtc_frame); g_free (crtc_frame);
} }
@@ -1530,6 +1577,79 @@ queue_update (MetaKmsImplDevice *impl_device, @@ -1539,6 +1586,79 @@ queue_update (MetaKmsImplDevice *impl_device,
} }
} }
@ -1647,7 +1647,7 @@ index 6758982a6a..2a87dc0898 100644
void void
meta_kms_impl_device_handle_update (MetaKmsImplDevice *impl_device, meta_kms_impl_device_handle_update (MetaKmsImplDevice *impl_device,
MetaKmsUpdate *update, MetaKmsUpdate *update,
@@ -1537,10 +1657,15 @@ meta_kms_impl_device_handle_update (MetaKmsImplDevice *impl_device, @@ -1546,10 +1666,15 @@ meta_kms_impl_device_handle_update (MetaKmsImplDevice *impl_device,
{ {
MetaKmsImplDevicePrivate *priv = MetaKmsImplDevicePrivate *priv =
meta_kms_impl_device_get_instance_private (impl_device); meta_kms_impl_device_get_instance_private (impl_device);
@ -1663,7 +1663,7 @@ index 6758982a6a..2a87dc0898 100644
meta_assert_in_kms_impl (meta_kms_impl_get_kms (priv->impl)); meta_assert_in_kms_impl (meta_kms_impl_get_kms (priv->impl));
@@ -1561,38 +1686,58 @@ meta_kms_impl_device_handle_update (MetaKmsImplDevice *impl_device, @@ -1570,38 +1695,58 @@ meta_kms_impl_device_handle_update (MetaKmsImplDevice *impl_device,
if (!ensure_device_file (impl_device, &error)) if (!ensure_device_file (impl_device, &error))
goto err; goto err;
@ -1742,7 +1742,7 @@ index 6758982a6a..2a87dc0898 100644
err: err:
diff --git a/src/backends/native/meta-kms-update.c b/src/backends/native/meta-kms-update.c diff --git a/src/backends/native/meta-kms-update.c b/src/backends/native/meta-kms-update.c
index b8c4137f9b..53a34b8c22 100644 index fc605bec18..a5da81f0c5 100644
--- a/src/backends/native/meta-kms-update.c --- a/src/backends/native/meta-kms-update.c
+++ b/src/backends/native/meta-kms-update.c +++ b/src/backends/native/meta-kms-update.c
@@ -20,6 +20,8 @@ @@ -20,6 +20,8 @@
@ -1840,7 +1840,7 @@ index 1951c80f60..ebb50cbaa8 100644
const int *rectangles, const int *rectangles,
int n_rectangles); int n_rectangles);
diff --git a/src/backends/native/meta-kms.c b/src/backends/native/meta-kms.c diff --git a/src/backends/native/meta-kms.c b/src/backends/native/meta-kms.c
index d41fcefb5a..37747b473f 100644 index d989337a10..4253a2adc8 100644
--- a/src/backends/native/meta-kms.c --- a/src/backends/native/meta-kms.c
+++ b/src/backends/native/meta-kms.c +++ b/src/backends/native/meta-kms.c
@@ -63,6 +63,8 @@ struct _MetaKms @@ -63,6 +63,8 @@ struct _MetaKms
@ -1874,7 +1874,7 @@ index d41fcefb5a..37747b473f 100644
meta_thread_flush_callbacks (META_THREAD (kms)); meta_thread_flush_callbacks (META_THREAD (kms));
diff --git a/src/backends/native/meta-kms.h b/src/backends/native/meta-kms.h diff --git a/src/backends/native/meta-kms.h b/src/backends/native/meta-kms.h
index 7434014063..f6b19520be 100644 index 057c7a2348..0d6986529c 100644
--- a/src/backends/native/meta-kms.h --- a/src/backends/native/meta-kms.h
+++ b/src/backends/native/meta-kms.h +++ b/src/backends/native/meta-kms.h
@@ -60,6 +60,8 @@ MetaKmsDevice * meta_kms_create_device (MetaKms *kms, @@ -60,6 +60,8 @@ MetaKmsDevice * meta_kms_create_device (MetaKms *kms,
@ -1887,7 +1887,7 @@ index 7434014063..f6b19520be 100644
MetaKmsFlags flags, MetaKmsFlags flags,
GError **error); GError **error);
diff --git a/src/backends/native/meta-onscreen-native.c b/src/backends/native/meta-onscreen-native.c diff --git a/src/backends/native/meta-onscreen-native.c b/src/backends/native/meta-onscreen-native.c
index 9b739faf39..941647e12a 100644 index 34709dccf1..c9162d31b8 100644
--- a/src/backends/native/meta-onscreen-native.c --- a/src/backends/native/meta-onscreen-native.c
+++ b/src/backends/native/meta-onscreen-native.c +++ b/src/backends/native/meta-onscreen-native.c
@@ -29,6 +29,7 @@ @@ -29,6 +29,7 @@
@ -2124,7 +2124,7 @@ index 9b739faf39..941647e12a 100644
} }
else else
{ {
@@ -600,6 +622,10 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen, @@ -601,6 +623,10 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
#endif #endif
} }
@ -2135,7 +2135,7 @@ index 9b739faf39..941647e12a 100644
meta_kms_update_add_page_flip_listener (kms_update, meta_kms_update_add_page_flip_listener (kms_update,
kms_crtc, kms_crtc,
&page_flip_listener_vtable, &page_flip_listener_vtable,
@@ -848,29 +874,63 @@ import_shared_framebuffer (CoglOnscreen *onscreen, @@ -849,29 +875,63 @@ import_shared_framebuffer (CoglOnscreen *onscreen,
} }
static MetaDrmBuffer * static MetaDrmBuffer *
@ -2208,7 +2208,7 @@ index 9b739faf39..941647e12a 100644
render_device = renderer_gpu_data->render_device; render_device = renderer_gpu_data->render_device;
egl_display = meta_render_device_get_egl_display (render_device); egl_display = meta_render_device_get_egl_display (render_device);
@@ -880,15 +940,45 @@ copy_shared_framebuffer_gpu (CoglOnscreen *onscreen, @@ -881,15 +941,45 @@ copy_shared_framebuffer_gpu (CoglOnscreen *onscreen,
secondary_gpu_state->egl_surface, secondary_gpu_state->egl_surface,
secondary_gpu_state->egl_surface, secondary_gpu_state->egl_surface,
renderer_gpu_data->secondary.egl_context, renderer_gpu_data->secondary.egl_context,
@ -2226,11 +2226,11 @@ index 9b739faf39..941647e12a 100644
+ if (primary_gpu_sync_fence != EGL_NO_NATIVE_FENCE_FD_ANDROID) + if (primary_gpu_sync_fence != EGL_NO_NATIVE_FENCE_FD_ANDROID)
+ { + {
+ EGLAttrib attribs[3]; + EGLAttrib attribs[3];
+
+ attribs[0] = EGL_SYNC_NATIVE_FENCE_FD_ANDROID; + attribs[0] = EGL_SYNC_NATIVE_FENCE_FD_ANDROID;
+ attribs[1] = primary_gpu_sync_fence; + attribs[1] = primary_gpu_sync_fence;
+ attribs[2] = EGL_NONE; + attribs[2] = EGL_NONE;
+
+ if (!meta_egl_create_sync (egl, + if (!meta_egl_create_sync (egl,
+ egl_display, + egl_display,
+ EGL_SYNC_NATIVE_FENCE_ANDROID, + EGL_SYNC_NATIVE_FENCE_ANDROID,
@ -2259,7 +2259,7 @@ index 9b739faf39..941647e12a 100644
buffer_gbm = META_DRM_BUFFER_GBM (primary_gpu_fb); buffer_gbm = META_DRM_BUFFER_GBM (primary_gpu_fb);
bo = meta_drm_buffer_gbm_get_bo (buffer_gbm); bo = meta_drm_buffer_gbm_get_bo (buffer_gbm);
@@ -898,21 +988,19 @@ copy_shared_framebuffer_gpu (CoglOnscreen *onscreen, @@ -899,21 +989,19 @@ copy_shared_framebuffer_gpu (CoglOnscreen *onscreen,
renderer_gpu_data->secondary.egl_context, renderer_gpu_data->secondary.egl_context,
secondary_gpu_state->egl_surface, secondary_gpu_state->egl_surface,
bo, bo,
@ -2287,7 +2287,7 @@ index 9b739faf39..941647e12a 100644
} }
use_modifiers = meta_renderer_native_use_modifiers (renderer_native); use_modifiers = meta_renderer_native_use_modifiers (renderer_native);
@@ -926,13 +1014,11 @@ copy_shared_framebuffer_gpu (CoglOnscreen *onscreen, @@ -927,13 +1015,11 @@ copy_shared_framebuffer_gpu (CoglOnscreen *onscreen,
meta_drm_buffer_gbm_new_lock_front (device_file, meta_drm_buffer_gbm_new_lock_front (device_file,
secondary_gpu_state->gbm.surface, secondary_gpu_state->gbm.surface,
flags, flags,
@ -2304,7 +2304,7 @@ index 9b739faf39..941647e12a 100644
} }
g_object_set_qdata_full (G_OBJECT (buffer_gbm), g_object_set_qdata_full (G_OBJECT (buffer_gbm),
@@ -940,19 +1026,41 @@ copy_shared_framebuffer_gpu (CoglOnscreen *onscreen, @@ -941,19 +1027,41 @@ copy_shared_framebuffer_gpu (CoglOnscreen *onscreen,
g_object_ref (primary_gpu_fb), g_object_ref (primary_gpu_fb),
g_object_unref); g_object_unref);
@ -2351,7 +2351,7 @@ index 9b739faf39..941647e12a 100644
} }
static MetaDrmBuffer * static MetaDrmBuffer *
@@ -1192,56 +1300,54 @@ update_secondary_gpu_state_pre_swap_buffers (CoglOnscreen *onscreen, @@ -1193,56 +1301,54 @@ update_secondary_gpu_state_pre_swap_buffers (CoglOnscreen *onscreen,
return copy; return copy;
} }
@ -2444,7 +2444,7 @@ index 9b739faf39..941647e12a 100644
} }
static void static void
@@ -1284,10 +1390,36 @@ swap_buffer_result_feedback (const MetaKmsFeedback *kms_feedback, @@ -1285,10 +1391,36 @@ swap_buffer_result_feedback (const MetaKmsFeedback *kms_feedback,
g_warning ("Page flip failed: %s", error->message); g_warning ("Page flip failed: %s", error->message);
frame_info = cogl_onscreen_peek_head_frame_info (onscreen); frame_info = cogl_onscreen_peek_head_frame_info (onscreen);
@ -2484,7 +2484,7 @@ index 9b739faf39..941647e12a 100644
} }
static const MetaKmsResultListenerVtable swap_buffer_result_listener_vtable = { static const MetaKmsResultListenerVtable swap_buffer_result_listener_vtable = {
@@ -1303,37 +1435,41 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, @@ -1304,37 +1436,41 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
{ {
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *cogl_context = cogl_framebuffer_get_context (framebuffer); CoglContext *cogl_context = cogl_framebuffer_get_context (framebuffer);
@ -2536,7 +2536,7 @@ index 9b739faf39..941647e12a 100644
secondary_gpu_fb = secondary_gpu_fb =
update_secondary_gpu_state_pre_swap_buffers (onscreen, update_secondary_gpu_state_pre_swap_buffers (onscreen,
rectangles, rectangles,
@@ -1383,46 +1519,28 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, @@ -1384,46 +1520,28 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
g_warning ("Failed to lock front buffer on %s: %s", g_warning ("Failed to lock front buffer on %s: %s",
meta_device_file_get_path (render_device_file), meta_device_file_get_path (render_device_file),
error->message); error->message);
@ -2557,11 +2557,6 @@ index 9b739faf39..941647e12a 100644
- break; - break;
-#endif -#endif
- } - }
-
- update_secondary_gpu_state_post_swap_buffers (onscreen,
- &egl_context_changed,
- primary_gpu_fb,
- &secondary_gpu_fb);
+ buffer = acquire_front_buffer (onscreen, + buffer = acquire_front_buffer (onscreen,
+ primary_gpu_fb, + primary_gpu_fb,
+ secondary_gpu_fb, + secondary_gpu_fb,
@ -2572,6 +2567,12 @@ index 9b739faf39..941647e12a 100644
+ goto swap_failed; + goto swap_failed;
+ } + }
- update_secondary_gpu_state_post_swap_buffers (onscreen,
- &egl_context_changed,
- primary_gpu_fb,
- &secondary_gpu_fb);
+ meta_frame_native_set_buffer (frame_native, buffer);
- switch (renderer_gpu_data->mode) - switch (renderer_gpu_data->mode)
- { - {
- case META_RENDERER_NATIVE_MODE_GBM: - case META_RENDERER_NATIVE_MODE_GBM:
@ -2580,8 +2581,7 @@ index 9b739faf39..941647e12a 100644
- g_set_object (&onscreen_native->gbm.next_fb, secondary_gpu_fb); - g_set_object (&onscreen_native->gbm.next_fb, secondary_gpu_fb);
- else - else
- g_set_object (&onscreen_native->gbm.next_fb, primary_gpu_fb); - 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 (onscreen_native->gbm.next_fb, &error))
+ if (!meta_drm_buffer_ensure_fb_id (buffer, &error)) + if (!meta_drm_buffer_ensure_fb_id (buffer, &error))
{ {
@ -2596,7 +2596,7 @@ index 9b739faf39..941647e12a 100644
} }
break; break;
case META_RENDERER_NATIVE_MODE_SURFACELESS: case META_RENDERER_NATIVE_MODE_SURFACELESS:
@@ -1433,21 +1551,86 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, @@ -1434,21 +1552,86 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
#endif #endif
} }
@ -2693,7 +2693,7 @@ index 9b739faf39..941647e12a 100644
kms_update = meta_frame_native_ensure_kms_update (frame_native, kms_update = meta_frame_native_ensure_kms_update (frame_native,
kms_device); kms_device);
meta_kms_update_add_result_listener (kms_update, meta_kms_update_add_result_listener (kms_update,
@@ -1469,13 +1652,11 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, @@ -1470,13 +1653,11 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
{ {
meta_renderer_native_queue_power_save_page_flip (renderer_native, meta_renderer_native_queue_power_save_page_flip (renderer_native,
onscreen); onscreen);
@ -2709,7 +2709,7 @@ index 9b739faf39..941647e12a 100644
switch (renderer_gpu_data->mode) switch (renderer_gpu_data->mode)
{ {
@@ -1490,8 +1671,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, @@ -1491,8 +1672,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
kms_update = meta_frame_native_steal_kms_update (frame_native); kms_update = meta_frame_native_steal_kms_update (frame_native);
meta_renderer_native_queue_mode_set_update (renderer_native, meta_renderer_native_queue_mode_set_update (renderer_native,
kms_update); kms_update);
@ -2718,7 +2718,7 @@ index 9b739faf39..941647e12a 100644
return; return;
} }
else if (meta_renderer_native_has_pending_mode_set (renderer_native)) else if (meta_renderer_native_has_pending_mode_set (renderer_native))
@@ -1505,8 +1684,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, @@ -1506,8 +1685,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
meta_frame_native_steal_kms_update (frame_native); meta_frame_native_steal_kms_update (frame_native);
meta_renderer_native_post_mode_set_updates (renderer_native); meta_renderer_native_post_mode_set_updates (renderer_native);
@ -2727,7 +2727,7 @@ index 9b739faf39..941647e12a 100644
return; return;
} }
break; break;
@@ -1522,8 +1699,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, @@ -1523,8 +1700,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
kms_update); kms_update);
meta_renderer_native_post_mode_set_updates (renderer_native); meta_renderer_native_post_mode_set_updates (renderer_native);
@ -2736,7 +2736,7 @@ index 9b739faf39..941647e12a 100644
return; return;
} }
break; break;
@@ -1536,9 +1711,10 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, @@ -1537,9 +1712,10 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
meta_kms_device_get_path (kms_device)); meta_kms_device_get_path (kms_device));
kms_update = meta_frame_native_steal_kms_update (frame_native); kms_update = meta_frame_native_steal_kms_update (frame_native);
@ -2748,7 +2748,7 @@ index 9b739faf39..941647e12a 100644
} }
gboolean gboolean
@@ -1571,7 +1747,7 @@ meta_onscreen_native_is_buffer_scanout_compatible (CoglOnscreen *onscreen, @@ -1572,7 +1748,7 @@ meta_onscreen_native_is_buffer_scanout_compatible (CoglOnscreen *onscreen,
assign_primary_plane (crtc_kms, assign_primary_plane (crtc_kms,
buffer, buffer,
test_update, test_update,
@ -2757,7 +2757,7 @@ index 9b739faf39..941647e12a 100644
&src_rect, &src_rect,
&dst_rect); &dst_rect);
@@ -1606,11 +1782,15 @@ scanout_result_feedback (const MetaKmsFeedback *kms_feedback, @@ -1607,11 +1783,15 @@ scanout_result_feedback (const MetaKmsFeedback *kms_feedback,
G_IO_ERROR_PERMISSION_DENIED)) G_IO_ERROR_PERMISSION_DENIED))
{ {
ClutterStageView *view = CLUTTER_STAGE_VIEW (onscreen_native->view); ClutterStageView *view = CLUTTER_STAGE_VIEW (onscreen_native->view);
@ -2775,7 +2775,7 @@ index 9b739faf39..941647e12a 100644
clutter_stage_view_add_redraw_clip (view, NULL); clutter_stage_view_add_redraw_clip (view, NULL);
clutter_stage_view_schedule_update_now (view); clutter_stage_view_schedule_update_now (view);
} }
@@ -1619,7 +1799,7 @@ scanout_result_feedback (const MetaKmsFeedback *kms_feedback, @@ -1620,7 +1800,7 @@ scanout_result_feedback (const MetaKmsFeedback *kms_feedback,
frame_info->flags |= COGL_FRAME_INFO_FLAG_SYMBOLIC; frame_info->flags |= COGL_FRAME_INFO_FLAG_SYMBOLIC;
meta_onscreen_native_notify_frame_complete (onscreen); meta_onscreen_native_notify_frame_complete (onscreen);
@ -2784,7 +2784,7 @@ index 9b739faf39..941647e12a 100644
} }
static const MetaKmsResultListenerVtable scanout_result_listener_vtable = { static const MetaKmsResultListenerVtable scanout_result_listener_vtable = {
@@ -1671,16 +1851,28 @@ meta_onscreen_native_direct_scanout (CoglOnscreen *onscreen, @@ -1672,16 +1852,28 @@ meta_onscreen_native_direct_scanout (CoglOnscreen *onscreen,
return FALSE; return FALSE;
} }
@ -2818,7 +2818,7 @@ index 9b739faf39..941647e12a 100644
frame_info->cpu_time_before_buffer_swap_us = g_get_monotonic_time (); frame_info->cpu_time_before_buffer_swap_us = g_get_monotonic_time ();
@@ -1701,7 +1893,7 @@ meta_onscreen_native_direct_scanout (CoglOnscreen *onscreen, @@ -1702,7 +1894,7 @@ meta_onscreen_native_direct_scanout (CoglOnscreen *onscreen,
onscreen_native->view, onscreen_native->view,
onscreen_native->crtc, onscreen_native->crtc,
kms_update, kms_update,
@ -2827,7 +2827,7 @@ index 9b739faf39..941647e12a 100644
NULL, NULL,
0); 0);
@@ -1786,11 +1978,15 @@ meta_onscreen_native_before_redraw (CoglOnscreen *onscreen, @@ -1787,11 +1979,15 @@ meta_onscreen_native_before_redraw (CoglOnscreen *onscreen,
ClutterFrame *frame) ClutterFrame *frame)
{ {
MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen); MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen);
@ -2847,7 +2847,7 @@ index 9b739faf39..941647e12a 100644
maybe_update_frame_sync (onscreen_native, frame); maybe_update_frame_sync (onscreen_native, frame);
} }
@@ -1919,22 +2115,79 @@ meta_onscreen_native_finish_frame (CoglOnscreen *onscreen, @@ -1920,22 +2116,79 @@ meta_onscreen_native_finish_frame (CoglOnscreen *onscreen,
MetaKmsDevice *kms_device = meta_kms_crtc_get_device (kms_crtc); MetaKmsDevice *kms_device = meta_kms_crtc_get_device (kms_crtc);
MetaFrameNative *frame_native = meta_frame_native_from_frame (frame); MetaFrameNative *frame_native = meta_frame_native_from_frame (frame);
MetaKmsUpdate *kms_update; MetaKmsUpdate *kms_update;
@ -2935,7 +2935,7 @@ index 9b739faf39..941647e12a 100644
meta_kms_update_add_result_listener (kms_update, meta_kms_update_add_result_listener (kms_update,
&finish_frame_result_listener_vtable, &finish_frame_result_listener_vtable,
NULL, NULL,
@@ -1957,7 +2210,17 @@ meta_onscreen_native_finish_frame (CoglOnscreen *onscreen, @@ -1958,7 +2211,17 @@ meta_onscreen_native_finish_frame (CoglOnscreen *onscreen,
meta_kms_update_set_flushing (kms_update, kms_crtc); meta_kms_update_set_flushing (kms_update, kms_crtc);
meta_kms_device_post_update (kms_device, kms_update, meta_kms_device_post_update (kms_device, kms_update,
META_KMS_UPDATE_FLAG_NONE); META_KMS_UPDATE_FLAG_NONE);
@ -2954,7 +2954,7 @@ index 9b739faf39..941647e12a 100644
} }
static gboolean static gboolean
@@ -2865,15 +3128,17 @@ meta_onscreen_native_dispose (GObject *object) @@ -2863,15 +3126,17 @@ meta_onscreen_native_dispose (GObject *object)
meta_onscreen_native_detach (onscreen_native); meta_onscreen_native_detach (onscreen_native);
@ -2989,7 +2989,7 @@ index 0e1193325a..e30357d19d 100644
MetaRendererView *view); MetaRendererView *view);
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
index aa76d018ca..3c22b4e86a 100644 index 2fcf6dfd56..03b41dfcad 100644
--- a/src/backends/native/meta-renderer-native.c --- a/src/backends/native/meta-renderer-native.c
+++ b/src/backends/native/meta-renderer-native.c +++ b/src/backends/native/meta-renderer-native.c
@@ -731,12 +731,18 @@ static gboolean @@ -731,12 +731,18 @@ static gboolean

View file

@ -1,322 +0,0 @@
From 36a1a74f7a6ea674e3911e89935256f1c6c5a149 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Tue, 20 Aug 2024 11:07:29 +0200
Subject: [PATCH] kms: Inhibit real time scheduling until initial mode set
We're already inhibiting real time scheduling when reading new KMS state
after hot plugs, as well as when during mode sets, due to the kernel not
being able to reliably handle these within the 250 ms limit. However, we
didn't do this during initial probing, which meant that occasionally
we'd run into these kind of issues during startup.
Handle this by always inhibiting real time scheduling up front, and
don't uninhibit until all initially discovered device have finished
processing their initial mode set.
Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3628
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3960>
Signed-off-by: Mingi Sung <sungmg@saltyming.net>
---
src/backends/native/meta-backend-native.c | 3 ++
src/backends/native/meta-kms-impl-device.c | 32 ++++++++++++++++++++++
src/backends/native/meta-kms-impl.c | 20 ++++++++++++++
src/backends/native/meta-kms-impl.h | 2 ++
src/backends/native/meta-kms.c | 17 ++++++++++++
src/backends/native/meta-kms.h | 2 ++
src/backends/native/meta-thread-impl.c | 9 ++++++
src/backends/native/meta-thread-impl.h | 4 +++
src/backends/native/meta-thread.c | 26 ++++++++++++------
9 files changed, 106 insertions(+), 9 deletions(-)
diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c
index 131a687e21..e3ed02894a 100644
--- a/src/backends/native/meta-backend-native.c
+++ b/src/backends/native/meta-backend-native.c
@@ -609,6 +609,7 @@ init_gpus (MetaBackendNative *native,
{
MetaBackend *backend = META_BACKEND (native);
MetaUdev *udev = meta_backend_native_get_udev (native);
+ MetaKms *kms = meta_backend_native_get_kms (native);
g_autoptr (GError) local_error = NULL;
MetaUdevDeviceType device_type = 0;
GList *devices;
@@ -669,6 +670,8 @@ init_gpus (MetaBackendNative *native,
g_list_free_full (devices, g_object_unref);
+ meta_kms_notify_probed (kms);
+
if (!meta_backend_is_headless (backend) &&
g_list_length (meta_backend_get_gpus (backend)) == 0)
{
diff --git a/src/backends/native/meta-kms-impl-device.c b/src/backends/native/meta-kms-impl-device.c
index 6758982a6a..f73aecac7a 100644
--- a/src/backends/native/meta-kms-impl-device.c
+++ b/src/backends/native/meta-kms-impl-device.c
@@ -108,6 +108,8 @@ typedef struct _MetaKmsImplDevicePrivate
GHashTable *crtc_frames;
+ gboolean realtime_inhibited_pending_mode_set;
+
MetaDeadlineTimerState deadline_timer_state;
gboolean sync_file_retrieved;
@@ -1734,6 +1736,12 @@ process_mode_set_update (MetaKmsImplDevice *impl_device,
feedback = do_process (impl_device, NULL, update, flags);
meta_thread_uninhibit_realtime_in_impl (thread);
+ if (priv->realtime_inhibited_pending_mode_set)
+ {
+ priv->realtime_inhibited_pending_mode_set = FALSE;
+ meta_thread_uninhibit_realtime_in_impl (thread);
+ }
+
return feedback;
}
@@ -1924,6 +1932,15 @@ meta_kms_impl_device_finalize (GObject *object)
MetaKmsImplDevicePrivate *priv =
meta_kms_impl_device_get_instance_private (impl_device);
+ if (priv->realtime_inhibited_pending_mode_set)
+ {
+ MetaThreadImpl *thread_impl = META_THREAD_IMPL (priv->impl);
+ MetaThread *thread = meta_thread_impl_get_thread (thread_impl);
+
+ priv->realtime_inhibited_pending_mode_set = FALSE;
+ meta_thread_uninhibit_realtime_in_impl (thread);
+ }
+
meta_kms_impl_remove_impl_device (priv->impl, impl_device);
g_list_free_full (priv->planes, g_object_unref);
@@ -1973,6 +1990,16 @@ meta_kms_impl_device_init_mode_setting (MetaKmsImplDevice *impl_device,
update_connectors (impl_device, drm_resources, 0);
+ if (!priv->crtcs)
+ {
+ MetaThreadImpl *thread_impl = META_THREAD_IMPL (priv->impl);
+ MetaThread *thread = meta_thread_impl_get_thread (thread_impl);
+
+ g_warn_if_fail (priv->realtime_inhibited_pending_mode_set);
+ meta_thread_uninhibit_realtime_in_impl (thread);
+ priv->realtime_inhibited_pending_mode_set = FALSE;
+ }
+
drmModeFreeResources (drm_resources);
return TRUE;
@@ -2050,6 +2077,8 @@ meta_kms_impl_device_initable_init (GInitable *initable,
MetaKmsImplDevice *impl_device = META_KMS_IMPL_DEVICE (initable);
MetaKmsImplDevicePrivate *priv =
meta_kms_impl_device_get_instance_private (impl_device);
+ MetaThreadImpl *thread_impl = META_THREAD_IMPL (priv->impl);
+ MetaThread *thread = meta_thread_impl_get_thread (thread_impl);
int fd;
if (!ensure_device_file (impl_device, error))
@@ -2075,6 +2104,9 @@ meta_kms_impl_device_initable_init (GInitable *initable,
priv->sync_file = -1;
+ meta_thread_inhibit_realtime_in_impl (thread);
+ priv->realtime_inhibited_pending_mode_set = TRUE;
+
return TRUE;
}
diff --git a/src/backends/native/meta-kms-impl.c b/src/backends/native/meta-kms-impl.c
index 99019ca85f..e34af98202 100644
--- a/src/backends/native/meta-kms-impl.c
+++ b/src/backends/native/meta-kms-impl.c
@@ -172,12 +172,32 @@ meta_kms_impl_finalize (GObject *object)
G_OBJECT_CLASS (meta_kms_impl_parent_class)->finalize (object);
}
+static void
+meta_kms_impl_setup (MetaThreadImpl *thread_impl)
+{
+ MetaThread *thread = meta_thread_impl_get_thread (thread_impl);
+
+ meta_thread_inhibit_realtime_in_impl (thread);
+}
+
+void
+meta_kms_impl_notify_probed (MetaKmsImpl *impl)
+{
+ MetaThreadImpl *thread_impl = META_THREAD_IMPL (impl);
+ MetaThread *thread = meta_thread_impl_get_thread (thread_impl);
+
+ meta_thread_uninhibit_realtime_in_impl (thread);
+}
+
static void
meta_kms_impl_class_init (MetaKmsImplClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ MetaThreadImplClass *thread_impl_class = META_THREAD_IMPL_CLASS (klass);
object_class->finalize = meta_kms_impl_finalize;
+
+ thread_impl_class->setup = meta_kms_impl_setup;
}
MetaKmsUpdateFilter *
diff --git a/src/backends/native/meta-kms-impl.h b/src/backends/native/meta-kms-impl.h
index f8379fab28..582bebf5e6 100644
--- a/src/backends/native/meta-kms-impl.h
+++ b/src/backends/native/meta-kms-impl.h
@@ -53,6 +53,8 @@ void meta_kms_impl_notify_modes_set (MetaKmsImpl *impl);
MetaKmsImpl * meta_kms_impl_new (MetaKms *kms);
+void meta_kms_impl_notify_probed (MetaKmsImpl *impl);
+
MetaKmsUpdateFilter * meta_kms_impl_add_update_filter (MetaKmsImpl *impl,
MetaKmsUpdateFilterFunc func,
gpointer user_data);
diff --git a/src/backends/native/meta-kms.c b/src/backends/native/meta-kms.c
index d41fcefb5a..d989337a10 100644
--- a/src/backends/native/meta-kms.c
+++ b/src/backends/native/meta-kms.c
@@ -413,6 +413,23 @@ meta_kms_new (MetaBackend *backend,
return kms;
}
+static gpointer
+notify_probed_in_impl (MetaThreadImpl *thread_impl,
+ gpointer user_data,
+ GError **error)
+{
+ meta_kms_impl_notify_probed (META_KMS_IMPL (thread_impl));
+ return NULL;
+}
+
+void
+meta_kms_notify_probed (MetaKms *kms)
+{
+ meta_thread_post_impl_task (META_THREAD (kms),
+ notify_probed_in_impl,
+ NULL, NULL, NULL, NULL);
+}
+
static void
meta_kms_finalize (GObject *object)
{
diff --git a/src/backends/native/meta-kms.h b/src/backends/native/meta-kms.h
index 7434014063..057c7a2348 100644
--- a/src/backends/native/meta-kms.h
+++ b/src/backends/native/meta-kms.h
@@ -64,6 +64,8 @@ MetaKms * meta_kms_new (MetaBackend *backend,
MetaKmsFlags flags,
GError **error);
+void meta_kms_notify_probed (MetaKms *kms);
+
META_EXPORT_TEST
void meta_kms_inhibit_kernel_thread (MetaKms *kms);
diff --git a/src/backends/native/meta-thread-impl.c b/src/backends/native/meta-thread-impl.c
index 28ef349f7c..d02d49203f 100644
--- a/src/backends/native/meta-thread-impl.c
+++ b/src/backends/native/meta-thread-impl.c
@@ -568,6 +568,15 @@ meta_thread_impl_dispatch (MetaThreadImpl *thread_impl)
return 1;
}
+void
+meta_thread_impl_setup (MetaThreadImpl *thread_impl)
+{
+ MetaThreadImplClass *klass = META_THREAD_IMPL_GET_CLASS (thread_impl);
+
+ if (klass->setup)
+ klass->setup (thread_impl);
+}
+
void
meta_thread_impl_run (MetaThreadImpl *thread_impl,
MetaThreadImplRunFlags flags)
diff --git a/src/backends/native/meta-thread-impl.h b/src/backends/native/meta-thread-impl.h
index 2083b3bf16..1837c465cb 100644
--- a/src/backends/native/meta-thread-impl.h
+++ b/src/backends/native/meta-thread-impl.h
@@ -38,6 +38,8 @@ G_DECLARE_DERIVABLE_TYPE (MetaThreadImpl, meta_thread_impl,
struct _MetaThreadImplClass
{
GObjectClass parent_class;
+
+ void (* setup) (MetaThreadImpl *thread_impl);
};
typedef enum _MetaThreadTaskFeedbackType
@@ -70,6 +72,8 @@ void meta_thread_impl_queue_task (MetaThreadImpl *thread_impl,
void meta_thread_impl_terminate (MetaThreadImpl *thread_impl);
+void meta_thread_impl_setup (MetaThreadImpl *thread_impl);
+
void meta_thread_impl_run (MetaThreadImpl *thread_impl,
MetaThreadImplRunFlags flags);
diff --git a/src/backends/native/meta-thread.c b/src/backends/native/meta-thread.c
index 08bd9b8fe2..5dcdb05eba 100644
--- a/src/backends/native/meta-thread.c
+++ b/src/backends/native/meta-thread.c
@@ -333,22 +333,28 @@ request_normal_scheduling (MetaThread *thread,
}
static gboolean
-should_use_realtime_scheduling_in_impl (MetaThread *thread)
+can_use_realtime_scheduling_in_impl (MetaThread *thread)
{
MetaThreadPrivate *priv = meta_thread_get_instance_private (thread);
- gboolean should_use_realtime_scheduling = FALSE;
switch (priv->thread_type)
{
case META_THREAD_TYPE_USER:
- break;
+ return FALSE;
case META_THREAD_TYPE_KERNEL:
- if (priv->wants_realtime && priv->kernel.realtime_inhibit_count == 0)
- should_use_realtime_scheduling = TRUE;
- break;
+ return priv->wants_realtime;
}
- return should_use_realtime_scheduling;
+ g_assert_not_reached ();
+}
+
+static gboolean
+should_use_realtime_scheduling_in_impl (MetaThread *thread)
+{
+ MetaThreadPrivate *priv = meta_thread_get_instance_private (thread);
+
+ return (can_use_realtime_scheduling_in_impl (thread) &&
+ priv->kernel.realtime_inhibit_count == 0);
}
static void
@@ -417,11 +423,13 @@ thread_impl_func (gpointer user_data)
priv->kernel.realtime_inhibit_count = 0;
priv->kernel.is_realtime = FALSE;
+ meta_thread_impl_setup (impl);
+
sync_realtime_scheduling_in_impl (thread);
- if (priv->kernel.is_realtime)
+ if (can_use_realtime_scheduling_in_impl (thread))
{
- g_message ("Made thread '%s' realtime scheduled", priv->name);
+ g_message ("Thread '%s' will be using real time scheduling", priv->name);
run_flags |= META_THREAD_IMPL_RUN_FLAG_REALTIME;
}
--
2.46.0