From 7017fa95b86fe4383d64a8a83ded0a7dcc53eaa2 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Fri, 10 Jan 2020 16:00:21 +0100 Subject: [PATCH] output: add adaptive_sync_enabled property --- include/wlr/types/wlr_output.h | 19 +++++++++++++++++++ types/wlr_output.c | 16 ++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/include/wlr/types/wlr_output.h b/include/wlr/types/wlr_output.h index 0ee6ded6..436bcac3 100644 --- a/include/wlr/types/wlr_output.h +++ b/include/wlr/types/wlr_output.h @@ -46,6 +46,12 @@ struct wlr_output_cursor { } events; }; +enum wlr_output_adaptive_sync_status { + WLR_OUTPUT_ADAPTIVE_SYNC_DISABLED, + WLR_OUTPUT_ADAPTIVE_SYNC_ENABLED, + WLR_OUTPUT_ADAPTIVE_SYNC_UNKNOWN, // requested, but maybe disabled +}; + enum wlr_output_state_field { WLR_OUTPUT_STATE_BUFFER = 1 << 0, WLR_OUTPUT_STATE_DAMAGE = 1 << 1, @@ -53,6 +59,7 @@ enum wlr_output_state_field { WLR_OUTPUT_STATE_ENABLED = 1 << 3, WLR_OUTPUT_STATE_SCALE = 1 << 4, WLR_OUTPUT_STATE_TRANSFORM = 1 << 5, + WLR_OUTPUT_STATE_ADAPTIVE_SYNC_ENABLED = 1 << 6, }; enum wlr_output_state_buffer_type { @@ -74,6 +81,7 @@ struct wlr_output_state { bool enabled; float scale; enum wl_output_transform transform; + bool adaptive_sync_enabled; // only valid if WLR_OUTPUT_STATE_BUFFER enum wlr_output_state_buffer_type buffer_type; @@ -126,6 +134,7 @@ struct wlr_output { float scale; enum wl_output_subpixel subpixel; enum wl_output_transform transform; + enum wlr_output_adaptive_sync_status adaptive_sync_status; bool needs_frame; // damage for cursors and fullscreen surface, in output-local coordinates @@ -246,6 +255,16 @@ void wlr_output_set_custom_mode(struct wlr_output *output, int32_t width, */ void wlr_output_set_transform(struct wlr_output *output, enum wl_output_transform transform); +/** + * Enables or disables adaptive sync (ie. variable refresh rate) on this + * output. This is just a hint, the backend is free to ignore this setting. + * + * When enabled, compositors can submit frames a little bit later than the + * deadline without dropping a frame. + * + * Adaptive sync is double-buffered state, see `wlr_output_commit`. + */ +void wlr_output_enable_adaptive_sync(struct wlr_output *output, bool enabled); /** * Sets a scale for the output. * diff --git a/types/wlr_output.c b/types/wlr_output.c index 51b1fcae..57814111 100644 --- a/types/wlr_output.c +++ b/types/wlr_output.c @@ -240,6 +240,18 @@ void wlr_output_set_scale(struct wlr_output *output, float scale) { output->pending.scale = scale; } +void wlr_output_enable_adaptive_sync(struct wlr_output *output, bool enabled) { + bool currently_enabled = + output->adaptive_sync_status != WLR_OUTPUT_ADAPTIVE_SYNC_DISABLED; + if (currently_enabled == enabled) { + output->pending.committed &= ~WLR_OUTPUT_STATE_ADAPTIVE_SYNC_ENABLED; + return; + } + + output->pending.committed |= WLR_OUTPUT_STATE_ADAPTIVE_SYNC_ENABLED; + output->pending.adaptive_sync_enabled = enabled; +} + void wlr_output_set_subpixel(struct wlr_output *output, enum wl_output_subpixel subpixel) { if (output->subpixel == subpixel) { @@ -487,6 +499,10 @@ bool wlr_output_commit(struct wlr_output *output) { wlr_log(WLR_ERROR, "Tried to modeset a disabled output"); goto error; } + if (!enabled && output->pending.committed & WLR_OUTPUT_STATE_ADAPTIVE_SYNC_ENABLED) { + wlr_log(WLR_ERROR, "Tried to enable adaptive sync on a disabled output"); + goto error; + } struct timespec now; clock_gettime(CLOCK_MONOTONIC, &now);