summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Wick <sebastian.wick@redhat.com>2023-03-02 19:49:36 +0100
committerMarge Bot <marge-bot@gnome.org>2023-03-04 09:30:41 +0000
commitaf714edafba49c26f37cba31e70049b0a61054ee (patch)
treebfac940a253fbc89f781e83acad3103146c41848
parent7ecdfaa78d24761276156e63bac9970dd50bc065 (diff)
downloadmutter-af714edafba49c26f37cba31e70049b0a61054ee.tar.gz
output: Check the EDID for HDR Static Metadata support
The existence of the KMS property just means that we can send an InfoFrame but we also have to make sure the sink actually supports the metadata type 1 and the selected transfer function. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2879>
-rw-r--r--src/backends/meta-monitor.c2
-rw-r--r--src/backends/meta-output.c32
-rw-r--r--src/backends/meta-output.h3
-rw-r--r--src/backends/native/meta-onscreen-native.c6
4 files changed, 38 insertions, 5 deletions
diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c
index c1315e84e..112ed97f6 100644
--- a/src/backends/meta-monitor.c
+++ b/src/backends/meta-monitor.c
@@ -2285,7 +2285,7 @@ meta_monitor_set_hdr_metadata (MetaMonitor *monitor,
{
MetaOutput *output = l->data;
- if (!meta_output_is_hdr_metadata_supported (output))
+ if (!meta_output_is_hdr_metadata_supported (output, metadata->eotf))
{
g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
"HDR metadata is not supported by this monitor");
diff --git a/src/backends/meta-output.c b/src/backends/meta-output.c
index 0db3242d9..b81608a0f 100644
--- a/src/backends/meta-output.c
+++ b/src/backends/meta-output.c
@@ -561,9 +561,39 @@ meta_output_peek_color_space (MetaOutput *output)
}
gboolean
-meta_output_is_hdr_metadata_supported (MetaOutput *output)
+meta_output_is_hdr_metadata_supported (MetaOutput *output,
+ MetaOutputHdrMetadataEOTF eotf)
{
MetaOutputClass *output_class = META_OUTPUT_GET_CLASS (output);
+ const MetaOutputInfo *output_info = meta_output_get_info (output);
+ MetaEdidTransferFunction tf = 0;
+
+ g_assert (output_info != NULL);
+ if (!output_info->edid_info)
+ return FALSE;
+
+ if ((output_info->edid_info->hdr_static_metadata.sm &
+ META_EDID_STATIC_METADATA_TYPE1) == 0)
+ return FALSE;
+
+ switch (eotf)
+ {
+ case META_OUTPUT_HDR_METADATA_EOTF_TRADITIONAL_GAMMA_SDR:
+ tf = META_EDID_TF_TRADITIONAL_GAMMA_SDR;
+ break;
+ case META_OUTPUT_HDR_METADATA_EOTF_TRADITIONAL_GAMMA_HDR:
+ tf = META_EDID_TF_TRADITIONAL_GAMMA_HDR;
+ break;
+ case META_OUTPUT_HDR_METADATA_EOTF_PQ:
+ tf = META_EDID_TF_PQ;
+ break;
+ case META_OUTPUT_HDR_METADATA_EOTF_HLG:
+ tf = META_EDID_TF_HLG;
+ break;
+ }
+
+ if ((output_info->edid_info->hdr_static_metadata.tf & tf) == 0)
+ return FALSE;
if (!output_class->is_hdr_metadata_supported)
return FALSE;
diff --git a/src/backends/meta-output.h b/src/backends/meta-output.h
index e4f20475b..ba86e2c27 100644
--- a/src/backends/meta-output.h
+++ b/src/backends/meta-output.h
@@ -254,7 +254,8 @@ void meta_output_set_color_space (MetaOutput *output,
MetaOutputColorspace meta_output_peek_color_space (MetaOutput *output);
-gboolean meta_output_is_hdr_metadata_supported (MetaOutput *output);
+gboolean meta_output_is_hdr_metadata_supported (MetaOutput *output,
+ MetaOutputHdrMetadataEOTF eotf);
void meta_output_set_hdr_metadata (MetaOutput *output,
MetaOutputHdrMetadata *metadata);
diff --git a/src/backends/native/meta-onscreen-native.c b/src/backends/native/meta-onscreen-native.c
index 3311b64b1..3fc020024 100644
--- a/src/backends/native/meta-onscreen-native.c
+++ b/src/backends/native/meta-onscreen-native.c
@@ -2241,7 +2241,8 @@ meta_onscreen_native_invalidate (MetaOnscreenNative *onscreen_native)
if (meta_output_is_color_space_supported (onscreen_native->output,
META_OUTPUT_COLORSPACE_DEFAULT))
onscreen_native->is_color_space_invalid = TRUE;
- if (meta_output_is_hdr_metadata_supported (onscreen_native->output))
+ if (meta_output_is_hdr_metadata_supported (onscreen_native->output,
+ META_OUTPUT_HDR_METADATA_EOTF_TRADITIONAL_GAMMA_SDR))
onscreen_native->is_hdr_metadata_invalid = TRUE;
}
@@ -2342,7 +2343,8 @@ meta_onscreen_native_new (MetaRendererNative *renderer_native,
onscreen_native);
}
- if (meta_output_is_hdr_metadata_supported (output))
+ if (meta_output_is_hdr_metadata_supported (output,
+ META_OUTPUT_HDR_METADATA_EOTF_TRADITIONAL_GAMMA_SDR))
{
onscreen_native->is_hdr_metadata_invalid = TRUE;
onscreen_native->hdr_metadata_changed_handler_id =