wayland: Fix refresh interval reporting in presentation-time version 1

Version 1 of the presentation protocol requires that 0 be sent for the
refresh rate for variable refresh rate. Fix this by checking the mode
during the presentation event.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4227>
This commit is contained in:
Dudemanguy 2025-02-06 08:21:16 -06:00 committed by Marge Bot
parent f459472cfe
commit 271c712146
3 changed files with 20 additions and 1 deletions

View File

@ -92,6 +92,12 @@ meta_wayland_output_get_monitor (MetaWaylandOutput *wayland_output)
return wayland_output->monitor;
}
MetaMonitorMode *
meta_wayland_output_get_monitor_mode (MetaWaylandOutput *wayland_output)
{
return wayland_output->mode;
}
static void
output_resource_destroy (struct wl_resource *res)
{

View File

@ -33,6 +33,8 @@ const GList * meta_wayland_output_get_resources (MetaWaylandOutput *wayland_outp
MetaMonitor * meta_wayland_output_get_monitor (MetaWaylandOutput *wayland_output);
MetaMonitorMode * meta_wayland_output_get_monitor_mode (MetaWaylandOutput *wayland_output);
void meta_wayland_outputs_finalize (MetaWaylandCompositor *compositor);
void meta_wayland_outputs_init (MetaWaylandCompositor *compositor);

View File

@ -323,6 +323,8 @@ meta_wayland_presentation_feedback_present (MetaWaylandPresentationFeedback *fee
uint32_t seq_hi, seq_lo;
uint32_t flags;
const GList *l;
MetaMonitorMode *mode;
gboolean is_vrr;
if (output == NULL)
{
@ -337,6 +339,15 @@ meta_wayland_presentation_feedback_present (MetaWaylandPresentationFeedback *fee
tv_sec_lo = time_s;
tv_nsec = (uint32_t) us2ns (time_us - s2us (time_s));
mode = meta_wayland_output_get_monitor_mode (output);
is_vrr = meta_monitor_mode_get_refresh_rate_mode (mode) ==
META_CRTC_REFRESH_RATE_MODE_VARIABLE;
/* The refresh rate interval is required to be 0 for vrr. */
if (is_vrr)
refresh_interval_ns = 0;
else
refresh_interval_ns = (uint32_t) (0.5 + s2ns (1) / frame_info->refresh_rate);
maybe_update_presentation_sequence (surface, frame_info, output);