diff --git a/backend/drm/drm.c b/backend/drm/drm.c index d2f75f71f..281b26b37 100644 --- a/backend/drm/drm.c +++ b/backend/drm/drm.c @@ -2067,6 +2067,12 @@ static void handle_page_flip(int fd, unsigned seq, present_flags |= WLR_OUTPUT_PRESENT_ZERO_COPY; } + if (conn->output.adaptive_sync_status == WLR_OUTPUT_ADAPTIVE_SYNC_ENABLED) { + present_flags |= WLR_OUTPUT_PRESENT_VARIABLE_RATE; + } else { + present_flags |= WLR_OUTPUT_PRESENT_FIXED_RATE; + } + struct wlr_output_event_present present_event = { /* The DRM backend guarantees that the presentation event will be for * the last submitted frame. */ diff --git a/include/wlr/types/wlr_output.h b/include/wlr/types/wlr_output.h index c8e44b0e6..16d6dc8a7 100644 --- a/include/wlr/types/wlr_output.h +++ b/include/wlr/types/wlr_output.h @@ -310,6 +310,10 @@ enum wlr_output_present_flag { WLR_OUTPUT_PRESENT_HW_COMPLETION = 0x4, // The presentation of this update was done zero-copy. WLR_OUTPUT_PRESENT_ZERO_COPY = 0x8, + // The display hardware is operating at a fixed refresh rate. + WLR_OUTPUT_PRESENT_FIXED_RATE = 0x10, + // The display hardware is operating at a variable refresh rate. + WLR_OUTPUT_PRESENT_VARIABLE_RATE = 0x20, }; struct wlr_output_event_present { diff --git a/types/wlr_presentation_time.c b/types/wlr_presentation_time.c index c4366f0fe..853f5ed7a 100644 --- a/types/wlr_presentation_time.c +++ b/types/wlr_presentation_time.c @@ -7,7 +7,7 @@ #include #include "presentation-time-protocol.h" -#define PRESENTATION_VERSION 2 +#define PRESENTATION_VERSION 3 struct wlr_presentation_surface_state { struct wlr_presentation_feedback *feedback; @@ -293,6 +293,10 @@ static void feedback_handle_output_present(struct wl_listener *listener, event.output->adaptive_sync_status == WLR_OUTPUT_ADAPTIVE_SYNC_ENABLED) { event.refresh = 0; } + if (wl_resource_get_version(resource) < 3) { + event.flags &= ~WLR_OUTPUT_PRESENT_VARIABLE_RATE; + event.flags &= ~WLR_OUTPUT_PRESENT_FIXED_RATE; + } if (!feedback->zero_copy) { event.flags &= ~WP_PRESENTATION_FEEDBACK_KIND_ZERO_COPY; }