From af8ef6cf02dd421cc4efda56e8974d7929c7fad4 Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Tue, 16 Jan 2024 16:37:49 +0100 Subject: [PATCH] native/crtc-kms: Unset config of CRTCs which are not part of a modeset This allows us to keep track when primary and cursor plane assignments on a CRTC are unassigned. With this commit, all planes which are assigned are actually in use and can't be assigned to anything else. We'll make use of that fact when we search for a leasable primary plane. Part-of: --- src/backends/meta-crtc.c | 4 ++++ src/backends/meta-crtc.h | 2 ++ src/backends/native/meta-crtc-kms.c | 21 +++++++++++++++++---- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/backends/meta-crtc.c b/src/backends/meta-crtc.c index bca008ea9..71b9bcbe9 100644 --- a/src/backends/meta-crtc.c +++ b/src/backends/meta-crtc.c @@ -130,6 +130,10 @@ void meta_crtc_unset_config (MetaCrtc *crtc) { MetaCrtcPrivate *priv = meta_crtc_get_instance_private (crtc); + MetaCrtcClass *klass = META_CRTC_GET_CLASS (crtc); + + if (klass->unset_config) + klass->unset_config (crtc); g_clear_pointer (&priv->config, g_free); } diff --git a/src/backends/meta-crtc.h b/src/backends/meta-crtc.h index 68ff58ea8..3c6abfe35 100644 --- a/src/backends/meta-crtc.h +++ b/src/backends/meta-crtc.h @@ -56,6 +56,8 @@ struct _MetaCrtcClass const MetaCrtcConfig *config, gpointer backend_private); + void (* unset_config) (MetaCrtc *crtc); + gboolean (* is_leased) (MetaCrtc *crtc); }; diff --git a/src/backends/native/meta-crtc-kms.c b/src/backends/native/meta-crtc-kms.c index 1b426d76d..2d2deab1b 100644 --- a/src/backends/native/meta-crtc-kms.c +++ b/src/backends/native/meta-crtc-kms.c @@ -206,6 +206,15 @@ meta_crtc_kms_set_gamma_lut (MetaCrtc *crtc, clutter_stage_schedule_update (CLUTTER_STAGE (stage)); } +static gboolean +meta_crtc_kms_is_leased (MetaCrtc *crtc) +{ + MetaCrtcKms *crtc_kms = META_CRTC_KMS (crtc); + MetaKmsCrtc *kms_crtc = meta_crtc_kms_get_kms_crtc (crtc_kms); + + return meta_kms_crtc_is_leased (kms_crtc); +} + typedef struct _CrtcKmsAssignment { MetaKmsPlane *primary_plane; @@ -326,13 +335,16 @@ meta_crtc_kms_set_config (MetaCrtc *crtc, crtc_kms->assigned_cursor_plane = kms_assignment->cursor_plane; } -static gboolean -meta_crtc_kms_is_leased (MetaCrtc *crtc) +static void +meta_crtc_kms_unset_config (MetaCrtc *crtc) { MetaCrtcKms *crtc_kms = META_CRTC_KMS (crtc); - MetaKmsCrtc *kms_crtc = meta_crtc_kms_get_kms_crtc (crtc_kms); - return meta_kms_crtc_is_leased (kms_crtc); + if (meta_crtc_kms_is_leased (crtc)) + return; + + crtc_kms->assigned_primary_plane = NULL; + crtc_kms->assigned_cursor_plane = NULL; } static gboolean @@ -485,6 +497,7 @@ meta_crtc_kms_class_init (MetaCrtcKmsClass *klass) crtc_class->set_gamma_lut = meta_crtc_kms_set_gamma_lut; crtc_class->assign_extra = meta_crtc_kms_assign_extra; crtc_class->set_config = meta_crtc_kms_set_config; + crtc_class->unset_config = meta_crtc_kms_unset_config; crtc_class->is_leased = meta_crtc_kms_is_leased; crtc_native_class->is_transform_handled = meta_crtc_kms_is_transform_handled;