From 2e69eafa06c5cc56f74276d1880f12be84ce93ac Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Thu, 2 Mar 2023 01:47:00 +0100 Subject: [PATCH] backends/native: Add color space and HDR metadata KMS properties The Colorspace property informs the display about the colorimetry of the content. Only variants supported by the sink are exposed in the property. The strings representing the color spaces are undocumented but can be found in the `hdmi_colorspaces` list in `drivers/gpu/drm/drm_connector.c` in the Linux kernel (v 6.2). The HDR_OUTPUT_METADATA property is a blob with the InfoFrame content. We have to query support for the different values in the struct from the EDID/DisplayID ourselfs. Part-of: --- .../native/meta-kms-connector-private.h | 24 ++++++ src/backends/native/meta-kms-connector.c | 82 ++++++++++++++++++- 2 files changed, 105 insertions(+), 1 deletion(-) diff --git a/src/backends/native/meta-kms-connector-private.h b/src/backends/native/meta-kms-connector-private.h index a36568daf..562c90845 100644 --- a/src/backends/native/meta-kms-connector-private.h +++ b/src/backends/native/meta-kms-connector-private.h @@ -40,6 +40,8 @@ typedef enum _MetaKmsConnectorProp META_KMS_CONNECTOR_PROP_PANEL_ORIENTATION, META_KMS_CONNECTOR_PROP_NON_DESKTOP, META_KMS_CONNECTOR_PROP_MAX_BPC, + META_KMS_CONNECTOR_PROP_COLORSPACE, + META_KMS_CONNECTOR_PROP_HDR_OUTPUT_METADATA, META_KMS_CONNECTOR_N_PROPS } MetaKmsConnectorProp; @@ -92,6 +94,28 @@ typedef enum _MetaKmsConnectorPanelOrientation META_KMS_CONNECTOR_PANEL_ORIENTATION_UNKNOWN, } MetaKmsConnectorPanelOrientation; +typedef enum _MetaKmsConnectorColorspace +{ + META_KMS_CONNECTOR_COLORSPACE_DEFAULT = 0, + META_KMS_CONNECTOR_COLORSPACE_RGB_WIDE_GAMUT_FIXED_POINT, + META_KMS_CONNECTOR_COLORSPACE_RGB_WIDE_GAMUT_FLOATING_POINT, + META_KMS_CONNECTOR_COLORSPACE_RGB_OPRGB, + META_KMS_CONNECTOR_COLORSPACE_RGB_DCI_P3_RGB_D65, + META_KMS_CONNECTOR_COLORSPACE_BT2020_RGB, + META_KMS_CONNECTOR_COLORSPACE_BT601_YCC, + META_KMS_CONNECTOR_COLORSPACE_BT709_YCC, + META_KMS_CONNECTOR_COLORSPACE_XVYCC_601, + META_KMS_CONNECTOR_COLORSPACE_XVYCC_709, + META_KMS_CONNECTOR_COLORSPACE_SYCC_601, + META_KMS_CONNECTOR_COLORSPACE_OPYCC_601, + META_KMS_CONNECTOR_COLORSPACE_BT2020_CYCC, + META_KMS_CONNECTOR_COLORSPACE_BT2020_YCC, + META_KMS_CONNECTOR_COLORSPACE_SMPTE_170M_YCC, + META_KMS_CONNECTOR_COLORSPACE_DCI_P3_RGB_THEATER, + META_KMS_CONNECTOR_COLORSPACE_N_PROPS, + META_KMS_CONNECTOR_COLORSPACE_UNKNOWN, +} MetaKmsConnectorColorspace; + uint32_t meta_kms_connector_get_prop_id (MetaKmsConnector *connector, MetaKmsConnectorProp prop); diff --git a/src/backends/native/meta-kms-connector.c b/src/backends/native/meta-kms-connector.c index ea5348c2a..0d5742e30 100644 --- a/src/backends/native/meta-kms-connector.c +++ b/src/backends/native/meta-kms-connector.c @@ -40,6 +40,7 @@ typedef struct _MetaKmsConnectorPropTable MetaKmsEnum privacy_screen_hw_enum[META_KMS_CONNECTOR_PRIVACY_SCREEN_N_PROPS]; MetaKmsEnum scaling_mode_enum[META_KMS_CONNECTOR_SCALING_MODE_N_PROPS]; MetaKmsEnum panel_orientation_enum[META_KMS_CONNECTOR_PANEL_ORIENTATION_N_PROPS]; + MetaKmsEnum colorspace_enum[META_KMS_CONNECTOR_COLORSPACE_N_PROPS]; } MetaKmsConnectorPropTable; struct _MetaKmsConnector @@ -967,6 +968,19 @@ init_properties (MetaKmsConnector *connector, .name = "max bpc", .type = DRM_MODE_PROP_RANGE, }, + [META_KMS_CONNECTOR_PROP_COLORSPACE] = + { + .name = "Colorspace", + .type = DRM_MODE_PROP_ENUM, + .enum_values = prop_table->colorspace_enum, + .num_enum_values = META_KMS_CONNECTOR_COLORSPACE_N_PROPS, + .default_value = META_KMS_CONNECTOR_COLORSPACE_UNKNOWN, + }, + [META_KMS_CONNECTOR_PROP_HDR_OUTPUT_METADATA] = + { + .name = "HDR_OUTPUT_METADATA", + .type = DRM_MODE_PROP_BLOB, + }, }, .dpms_enum = { [META_KMS_CONNECTOR_DPMS_ON] = @@ -1071,7 +1085,73 @@ init_properties (MetaKmsConnector *connector, { .name = "Right Side Up", }, - } + }, + .colorspace_enum = { + [META_KMS_CONNECTOR_COLORSPACE_DEFAULT] = + { + .name = "Default", + }, + [META_KMS_CONNECTOR_COLORSPACE_RGB_WIDE_GAMUT_FIXED_POINT] = + { + .name = "RGB_Wide_Gamut_Fixed_Point", + }, + [META_KMS_CONNECTOR_COLORSPACE_RGB_WIDE_GAMUT_FLOATING_POINT] = + { + .name = "RGB_Wide_Gamut_Floating_Point", + }, + [META_KMS_CONNECTOR_COLORSPACE_RGB_OPRGB] = + { + .name = "opRGB", + }, + [META_KMS_CONNECTOR_COLORSPACE_RGB_DCI_P3_RGB_D65] = + { + .name = "DCI-P3_RGB_D65", + }, + [META_KMS_CONNECTOR_COLORSPACE_BT2020_RGB] = + { + .name = "BT2020_RGB", + }, + [META_KMS_CONNECTOR_COLORSPACE_BT601_YCC] = + { + .name = "BT601_YCC", + }, + [META_KMS_CONNECTOR_COLORSPACE_BT709_YCC] = + { + .name = "BT709_YCC", + }, + [META_KMS_CONNECTOR_COLORSPACE_XVYCC_601] = + { + .name = "XVYCC_601", + }, + [META_KMS_CONNECTOR_COLORSPACE_XVYCC_709] = + { + .name = "XVYCC_709", + }, + [META_KMS_CONNECTOR_COLORSPACE_SYCC_601] = + { + .name = "SYCC_601", + }, + [META_KMS_CONNECTOR_COLORSPACE_OPYCC_601] = + { + .name = "opYCC_601", + }, + [META_KMS_CONNECTOR_COLORSPACE_BT2020_CYCC] = + { + .name = "BT2020_CYCC", + }, + [META_KMS_CONNECTOR_COLORSPACE_BT2020_YCC] = + { + .name = "BT2020_YCC", + }, + [META_KMS_CONNECTOR_COLORSPACE_SMPTE_170M_YCC] = + { + .name = "SMPTE_170M_YCC", + }, + [META_KMS_CONNECTOR_COLORSPACE_DCI_P3_RGB_THEATER] = + { + .name = "DCI-P3_RGB_Theater", + }, + }, }; }