aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/wlr/types/wlr_output.h19
-rw-r--r--types/wlr_output.c16
2 files changed, 35 insertions, 0 deletions
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
@@ -247,6 +256,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.
*
* Scale is double-buffered state, see `wlr_output_commit`.
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);