output: Add a function to check if VRR is enabled for the output

An output with enabled VRR requires that the mode is a VRR mode which
also means that VRR is supported.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3646>
This commit is contained in:
Sebastian Wick 2024-03-08 17:48:44 +01:00 committed by Marge Bot
parent 91e3180985
commit 51811ec7b3
3 changed files with 29 additions and 26 deletions

View File

@ -589,6 +589,28 @@ meta_output_peek_rgb_range (MetaOutput *output)
return priv->rgb_range; return priv->rgb_range;
} }
gboolean
meta_output_is_vrr_enabled (MetaOutput *output)
{
MetaOutputPrivate *priv = meta_output_get_instance_private (output);
MetaCrtc *crtc = priv->crtc;
const MetaCrtcConfig *crtc_config;
const MetaCrtcModeInfo *crtc_mode_info;
if (!crtc)
return FALSE;
crtc_config = meta_crtc_get_config (crtc);
g_assert (crtc_config != NULL);
g_assert (crtc_config->mode != NULL);
crtc_mode_info = meta_crtc_mode_get_info (crtc_config->mode);
g_assert (crtc_mode_info != NULL);
return crtc_mode_info->refresh_rate_mode ==
META_CRTC_REFRESH_RATE_MODE_VARIABLE;
}
static void static void
meta_output_init (MetaOutput *output) meta_output_init (MetaOutput *output)
{ {

View File

@ -271,6 +271,8 @@ MetaOutputHdrMetadata * meta_output_peek_hdr_metadata (MetaOutput *output);
META_EXPORT_TEST META_EXPORT_TEST
MetaOutputRGBRange meta_output_peek_rgb_range (MetaOutput *output); MetaOutputRGBRange meta_output_peek_rgb_range (MetaOutput *output);
gboolean meta_output_is_vrr_enabled (MetaOutput *output);
void meta_output_add_possible_clone (MetaOutput *output, void meta_output_add_possible_clone (MetaOutput *output,
MetaOutput *possible_clone); MetaOutput *possible_clone);

View File

@ -1740,40 +1740,19 @@ update_frame_sync_mode (MetaOnscreenNative *onscreen_native,
onscreen_native->frame_sync_mode = sync_mode; onscreen_native->frame_sync_mode = sync_mode;
} }
static MetaFrameSyncMode
get_applicable_sync_mode (MetaOnscreenNative *onscreen_native)
{
const MetaCrtcConfig *crtc_config;
const MetaCrtcModeInfo *crtc_mode_info;
crtc_config = meta_crtc_get_config (onscreen_native->crtc);
g_assert (crtc_config != NULL);
g_assert (crtc_config->mode != NULL);
crtc_mode_info = meta_crtc_mode_get_info (crtc_config->mode);
g_assert (crtc_mode_info != NULL);
if (crtc_mode_info->refresh_rate_mode ==
META_CRTC_REFRESH_RATE_MODE_FIXED)
return META_FRAME_SYNC_MODE_DISABLED;
return onscreen_native->requested_frame_sync_mode;
}
static void static void
maybe_update_frame_sync_mode (MetaOnscreenNative *onscreen_native, maybe_update_frame_sync_mode (MetaOnscreenNative *onscreen_native,
ClutterFrame *frame) ClutterFrame *frame)
{ {
MetaFrameSyncMode applicable_sync_mode; MetaFrameSyncMode sync_mode = onscreen_native->requested_frame_sync_mode;
applicable_sync_mode = get_applicable_sync_mode (onscreen_native); if (!meta_output_is_vrr_enabled (onscreen_native->output))
sync_mode = META_FRAME_SYNC_MODE_DISABLED;
if (G_LIKELY (applicable_sync_mode == onscreen_native->frame_sync_mode)) if (G_LIKELY (sync_mode == onscreen_native->frame_sync_mode))
return; return;
update_frame_sync_mode (onscreen_native, update_frame_sync_mode (onscreen_native, frame, sync_mode);
frame,
applicable_sync_mode);
} }
void void