From e6e57da34f4920b9384905d4390c14672f985241 Mon Sep 17 00:00:00 2001 From: llyyr Date: Sat, 6 Dec 2025 21:49:01 +0530 Subject: [PATCH] presentation-time: implement support for presentation-time v3 See: https://gitlab.freedesktop.org/wayland/wayland-protocols/-/merge_requests/459 --- backend/drm/drm.c | 6 ++++++ include/wlr/types/wlr_output.h | 4 ++++ types/wlr_presentation_time.c | 6 +++++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/backend/drm/drm.c b/backend/drm/drm.c index 86b52c684..df750a16c 100644 --- a/backend/drm/drm.c +++ b/backend/drm/drm.c @@ -2037,6 +2037,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 4485b3694..de0a42aa2 100644 --- a/include/wlr/types/wlr_output.h +++ b/include/wlr/types/wlr_output.h @@ -303,6 +303,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; }