From b083ad67dfa4e4f75042c17110ec6f45db7642e4 Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Mon, 29 Jan 2024 20:58:39 +0100 Subject: [PATCH] kms/impl-device/simple: Handle NULL gamma LUTs for passthrough The kernel doesn't let us set gamma to passthrough with the legacy API so we have to trick a bit and create an identity LUT, and also when we read the KMS state, detect when an identity LUT is active. Part-of: --- src/backends/native/meta-kms-crtc.c | 3 +++ src/backends/native/meta-kms-impl-device-simple.c | 10 +++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/backends/native/meta-kms-crtc.c b/src/backends/native/meta-kms-crtc.c index d89b12598..865cfbcde 100644 --- a/src/backends/native/meta-kms-crtc.c +++ b/src/backends/native/meta-kms-crtc.c @@ -180,6 +180,9 @@ read_crtc_legacy_gamma (MetaKmsCrtc *crtc, crtc_state->gamma.value->red, crtc_state->gamma.value->green, crtc_state->gamma.value->blue); + + if (meta_gamma_lut_is_identity (crtc_state->gamma.value)) + g_clear_pointer (&crtc_state->gamma.value, meta_gamma_lut_free); } static void diff --git a/src/backends/native/meta-kms-impl-device-simple.c b/src/backends/native/meta-kms-impl-device-simple.c index a00ae37e0..febcac01b 100644 --- a/src/backends/native/meta-kms-impl-device-simple.c +++ b/src/backends/native/meta-kms-impl-device-simple.c @@ -534,13 +534,21 @@ process_crtc_color_updates (MetaKmsImplDevice *impl_device, } else { + const MetaKmsCrtcState *crtc_state = + meta_kms_crtc_get_current_state (crtc); + g_autoptr (MetaGammaLut) identity_lut = + meta_gamma_lut_new_identity (crtc_state->gamma.size); + meta_topic (META_DEBUG_KMS, "[simple] Setting CRTC (%u, %s) gamma to bypass", meta_kms_crtc_get_id (crtc), meta_kms_impl_device_get_path (impl_device)); ret = drmModeCrtcSetGamma (fd, meta_kms_crtc_get_id (crtc), - 0, NULL, NULL, NULL); + identity_lut->size, + identity_lut->red, + identity_lut->green, + identity_lut->blue); } if (ret != 0)