From 8b20a75df925a461f27819709e882484d61f73a1 Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Tue, 25 Mar 2025 11:40:50 +0100 Subject: [PATCH] kms/device: Add SUPPORTS_COLOR_MODES flag and use it to guard HDR/color Technically the impl device simple now also supports HDR, but there are too many things that can go wrong, such as the colorspace prop getting set, but not the HDR transfer function. For now, we will say that the simple device impl does not have usable HDR support. This gets picked up by the MetaOutputKms and propagtes the state to everywhere. Part-of: --- src/backends/native/meta-kms-device.c | 3 +++ src/backends/native/meta-kms-impl-device-atomic.c | 3 +++ src/backends/native/meta-kms-impl-device.c | 2 +- src/backends/native/meta-kms-impl-device.h | 3 ++- src/backends/native/meta-kms-types.h | 1 + src/backends/native/meta-output-kms.c | 8 ++++++-- 6 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/backends/native/meta-kms-device.c b/src/backends/native/meta-kms-device.c index a04ad1e08..4dec048d0 100644 --- a/src/backends/native/meta-kms-device.c +++ b/src/backends/native/meta-kms-device.c @@ -785,6 +785,9 @@ meta_kms_device_new (MetaKms *kms, if (device->caps.addfb2_modifiers) device->flags |= META_KMS_DEVICE_FLAG_HAS_ADDFB2; + if (device->caps.supports_color_modes) + device->flags |= META_KMS_DEVICE_FLAG_SUPPORTS_COLOR_MODES; + return device; } diff --git a/src/backends/native/meta-kms-impl-device-atomic.c b/src/backends/native/meta-kms-impl-device-atomic.c index 678811adb..7860cc2c6 100644 --- a/src/backends/native/meta-kms-impl-device-atomic.c +++ b/src/backends/native/meta-kms-impl-device-atomic.c @@ -1423,6 +1423,9 @@ meta_kms_impl_device_atomic_initable_init (GInitable *initable, GError **error) { MetaKmsImplDevice *impl_device = META_KMS_IMPL_DEVICE (initable); + MetaKmsDeviceCaps *caps = meta_kms_impl_device_get_caps (impl_device); + + caps->supports_color_modes = TRUE; if (!initable_parent_iface->init (initable, cancellable, error)) return FALSE; diff --git a/src/backends/native/meta-kms-impl-device.c b/src/backends/native/meta-kms-impl-device.c index 25cb1cbd5..6f29303b8 100644 --- a/src/backends/native/meta-kms-impl-device.c +++ b/src/backends/native/meta-kms-impl-device.c @@ -231,7 +231,7 @@ meta_kms_impl_device_has_cursor_plane_for (MetaKmsImplDevice *impl_device, return FALSE; } -const MetaKmsDeviceCaps * +MetaKmsDeviceCaps * meta_kms_impl_device_get_caps (MetaKmsImplDevice *impl_device) { MetaKmsImplDevicePrivate *priv = diff --git a/src/backends/native/meta-kms-impl-device.h b/src/backends/native/meta-kms-impl-device.h index 0bbbefa75..22396dba6 100644 --- a/src/backends/native/meta-kms-impl-device.h +++ b/src/backends/native/meta-kms-impl-device.h @@ -38,6 +38,7 @@ typedef struct _MetaKmsDeviceCaps gboolean prefers_shadow_buffer; gboolean uses_monotonic_clock; gboolean addfb2_modifiers; + gboolean supports_color_modes; } MetaKmsDeviceCaps; @@ -122,7 +123,7 @@ GList * meta_kms_impl_device_peek_planes (MetaKmsImplDevice *impl_device); gboolean meta_kms_impl_device_has_cursor_plane_for (MetaKmsImplDevice *impl_device, MetaKmsCrtc *crtc); -const MetaKmsDeviceCaps * meta_kms_impl_device_get_caps (MetaKmsImplDevice *impl_device); +MetaKmsDeviceCaps * meta_kms_impl_device_get_caps (MetaKmsImplDevice *impl_device); GList * meta_kms_impl_device_copy_fallback_modes (MetaKmsImplDevice *impl_device); diff --git a/src/backends/native/meta-kms-types.h b/src/backends/native/meta-kms-types.h index f20464dcf..63530cf9d 100644 --- a/src/backends/native/meta-kms-types.h +++ b/src/backends/native/meta-kms-types.h @@ -64,6 +64,7 @@ typedef enum _MetaKmsDeviceFlag META_KMS_DEVICE_FLAG_FORCE_LEGACY = 1 << 6, META_KMS_DEVICE_FLAG_DISABLE_CLIENT_MODIFIERS = 1 << 7, META_KMS_DEVICE_FLAG_DISABLE_VRR = 1 << 8, + META_KMS_DEVICE_FLAG_SUPPORTS_COLOR_MODES = 1 << 9, } MetaKmsDeviceFlag; typedef enum _MetaKmsResourceChanges diff --git a/src/backends/native/meta-output-kms.c b/src/backends/native/meta-output-kms.c index e522947d1..52d4b7988 100644 --- a/src/backends/native/meta-output-kms.c +++ b/src/backends/native/meta-output-kms.c @@ -367,6 +367,8 @@ meta_output_kms_new (MetaGpuKms *gpu_kms, GError **error) { MetaGpu *gpu = META_GPU (gpu_kms); + MetaKmsDevice *device = meta_kms_connector_get_device (kms_connector); + MetaKmsDeviceFlag device_flags = meta_kms_device_get_flags (device); uint32_t connector_id; uint32_t gpu_id; g_autoptr (MetaOutputInfo) output_info = NULL; @@ -453,7 +455,8 @@ meta_output_kms_new (MetaGpuKms *gpu_kms, output_info->tile_info = connector_state->tile_info; - if (output_info->edid_info) + if ((device_flags & META_KMS_DEVICE_FLAG_SUPPORTS_COLOR_MODES) && + output_info->edid_info) { struct di_supported_signal_colorimetry *edid_colorimetry = &output_info->edid_info->colorimetry; @@ -467,7 +470,8 @@ meta_output_kms_new (MetaGpuKms *gpu_kms, output_info->supported_color_spaces |= (1 << META_OUTPUT_COLORSPACE_BT2020); } - if (connector_state->hdr.supported && + if ((device_flags & META_KMS_DEVICE_FLAG_SUPPORTS_COLOR_MODES) && + connector_state->hdr.supported && output_info->edid_info && output_info->edid_info->hdr_static_metadata.type1) {