monitor: Add API to list supported color modes

Available modes are 'default', which is always added, and BT.2100,
which is added if the BT.2020 color space, and the PQ transfer function,
is supported by the output.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4192>
This commit is contained in:
Jonas Ådahl
2024-12-12 12:47:21 +01:00
committed by Marge Bot
parent fc6d79eda9
commit f1e497acfa
3 changed files with 41 additions and 0 deletions

View File

@ -70,6 +70,8 @@ typedef struct _MetaMonitorPrivate
char *display_name; char *display_name;
gboolean is_for_lease; gboolean is_for_lease;
GList *color_modes;
} MetaMonitorPrivate; } MetaMonitorPrivate;
G_DEFINE_TYPE_WITH_PRIVATE (MetaMonitor, meta_monitor, G_TYPE_OBJECT) G_DEFINE_TYPE_WITH_PRIVATE (MetaMonitor, meta_monitor, G_TYPE_OBJECT)
@ -203,6 +205,27 @@ meta_monitor_generate_spec (MetaMonitor *monitor)
priv->spec = monitor_spec; priv->spec = monitor_spec;
} }
static void
meta_monitor_init_supported_color_modes (MetaMonitor *monitor)
{
MetaMonitorPrivate *priv = meta_monitor_get_instance_private (monitor);
const MetaOutputInfo *output_info =
meta_monitor_get_main_output_info (monitor);
priv->color_modes =
g_list_append (NULL, GINT_TO_POINTER (META_COLOR_MODE_DEFAULT));
if ((output_info->supported_color_spaces &
(1 << META_OUTPUT_COLORSPACE_BT2020)) &&
(output_info->supported_hdr_eotfs &
(1 << META_OUTPUT_HDR_METADATA_EOTF_PQ)))
{
priv->color_modes =
g_list_append (priv->color_modes,
GINT_TO_POINTER (META_COLOR_MODE_BT2100));
}
}
static const double known_diagonals[] = { static const double known_diagonals[] = {
12.1, 12.1,
13.3, 13.3,
@ -588,6 +611,7 @@ meta_monitor_finalize (GObject *object)
MetaMonitor *monitor = META_MONITOR (object); MetaMonitor *monitor = META_MONITOR (object);
MetaMonitorPrivate *priv = meta_monitor_get_instance_private (monitor); MetaMonitorPrivate *priv = meta_monitor_get_instance_private (monitor);
g_list_free (priv->color_modes);
g_hash_table_destroy (priv->mode_ids); g_hash_table_destroy (priv->mode_ids);
g_list_free_full (priv->modes, (GDestroyNotify) meta_monitor_mode_free); g_list_free_full (priv->modes, (GDestroyNotify) meta_monitor_mode_free);
meta_monitor_spec_free (priv->spec); meta_monitor_spec_free (priv->spec);
@ -837,6 +861,7 @@ meta_monitor_normal_new (MetaMonitorManager *monitor_manager,
meta_output_set_monitor (output, monitor); meta_output_set_monitor (output, monitor);
meta_monitor_generate_spec (monitor); meta_monitor_generate_spec (monitor);
meta_monitor_init_supported_color_modes (monitor);
meta_monitor_normal_generate_modes (monitor_normal); meta_monitor_normal_generate_modes (monitor_normal);
@ -2363,6 +2388,14 @@ meta_monitor_set_hdr_metadata (MetaMonitor *monitor,
return TRUE; return TRUE;
} }
GList *
meta_monitor_get_supported_color_modes (MetaMonitor *monitor)
{
MetaMonitorPrivate *priv = meta_monitor_get_instance_private (monitor);
return priv->color_modes;
}
gboolean gboolean
meta_parse_monitor_mode (const char *string, meta_parse_monitor_mode (const char *string,
int *out_width, int *out_width,

View File

@ -355,4 +355,6 @@ void meta_monitor_set_for_lease (MetaMonitor *monitor,
META_EXPORT_TEST META_EXPORT_TEST
gboolean meta_monitor_is_for_lease (MetaMonitor *monitor); gboolean meta_monitor_is_for_lease (MetaMonitor *monitor);
GList * meta_monitor_get_supported_color_modes (MetaMonitor *monitor);
G_DEFINE_AUTOPTR_CLEANUP_FUNC (MetaMonitorSpec, meta_monitor_spec_free) G_DEFINE_AUTOPTR_CLEANUP_FUNC (MetaMonitorSpec, meta_monitor_spec_free)

View File

@ -40,6 +40,12 @@ typedef enum
META_OUTPUT_HDR_METADATA_EOTF_HLG, META_OUTPUT_HDR_METADATA_EOTF_HLG,
} MetaOutputHdrMetadataEOTF; } MetaOutputHdrMetadataEOTF;
typedef enum _MetaColorMode
{
META_COLOR_MODE_DEFAULT = 0,
META_COLOR_MODE_BT2100 = 1,
} MetaColorMode;
typedef enum _MetaOutputRGBRange typedef enum _MetaOutputRGBRange
{ {
META_OUTPUT_RGB_RANGE_UNKNOWN = 0, META_OUTPUT_RGB_RANGE_UNKNOWN = 0,