1
0
Fork 0
mutter-performance-pkgbuild/mr3912.patch
Mingi Sung a0ae40539e
Sync to gnome-46 & Refresh patches
Signed-off-by: Mingi Sung <sungmg@saltyming.net>
2024-08-05 12:39:17 +09:00

295 lines
12 KiB
Diff

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