diff options
-rw-r--r-- | include/sway/commands.h | 1 | ||||
-rw-r--r-- | include/sway/config.h | 1 | ||||
-rw-r--r-- | sway/commands/output.c | 1 | ||||
-rw-r--r-- | sway/commands/output/adaptive_sync.c | 22 | ||||
-rw-r--r-- | sway/config/output.c | 8 | ||||
-rw-r--r-- | sway/meson.build | 1 | ||||
-rw-r--r-- | sway/sway-output.5.scd | 9 |
7 files changed, 43 insertions, 0 deletions
diff --git a/include/sway/commands.h b/include/sway/commands.h index f992b441..bbbdfc80 100644 --- a/include/sway/commands.h +++ b/include/sway/commands.h | |||
@@ -266,6 +266,7 @@ sway_cmd input_cmd_xkb_rules; | |||
266 | sway_cmd input_cmd_xkb_switch_layout; | 266 | sway_cmd input_cmd_xkb_switch_layout; |
267 | sway_cmd input_cmd_xkb_variant; | 267 | sway_cmd input_cmd_xkb_variant; |
268 | 268 | ||
269 | sway_cmd output_cmd_adaptive_sync; | ||
269 | sway_cmd output_cmd_background; | 270 | sway_cmd output_cmd_background; |
270 | sway_cmd output_cmd_disable; | 271 | sway_cmd output_cmd_disable; |
271 | sway_cmd output_cmd_dpms; | 272 | sway_cmd output_cmd_dpms; |
diff --git a/include/sway/config.h b/include/sway/config.h index aef6694d..0a2661dd 100644 --- a/include/sway/config.h +++ b/include/sway/config.h | |||
@@ -238,6 +238,7 @@ struct output_config { | |||
238 | int32_t transform; | 238 | int32_t transform; |
239 | enum wl_output_subpixel subpixel; | 239 | enum wl_output_subpixel subpixel; |
240 | int max_render_time; // In milliseconds | 240 | int max_render_time; // In milliseconds |
241 | int adaptive_sync; | ||
241 | 242 | ||
242 | char *background; | 243 | char *background; |
243 | char *background_option; | 244 | char *background_option; |
diff --git a/sway/commands/output.c b/sway/commands/output.c index 013f17b2..5186a2ba 100644 --- a/sway/commands/output.c +++ b/sway/commands/output.c | |||
@@ -7,6 +7,7 @@ | |||
7 | 7 | ||
8 | // must be in order for the bsearch | 8 | // must be in order for the bsearch |
9 | static struct cmd_handler output_handlers[] = { | 9 | static struct cmd_handler output_handlers[] = { |
10 | { "adaptive_sync", output_cmd_adaptive_sync }, | ||
10 | { "background", output_cmd_background }, | 11 | { "background", output_cmd_background }, |
11 | { "bg", output_cmd_background }, | 12 | { "bg", output_cmd_background }, |
12 | { "disable", output_cmd_disable }, | 13 | { "disable", output_cmd_disable }, |
diff --git a/sway/commands/output/adaptive_sync.c b/sway/commands/output/adaptive_sync.c new file mode 100644 index 00000000..7382e2ee --- /dev/null +++ b/sway/commands/output/adaptive_sync.c | |||
@@ -0,0 +1,22 @@ | |||
1 | #include "sway/commands.h" | ||
2 | #include "sway/config.h" | ||
3 | #include "util.h" | ||
4 | |||
5 | struct cmd_results *output_cmd_adaptive_sync(int argc, char **argv) { | ||
6 | if (!config->handler_context.output_config) { | ||
7 | return cmd_results_new(CMD_FAILURE, "Missing output config"); | ||
8 | } | ||
9 | if (argc == 0) { | ||
10 | return cmd_results_new(CMD_INVALID, "Missing adaptive_sync argument"); | ||
11 | } | ||
12 | |||
13 | if (parse_boolean(argv[0], true)) { | ||
14 | config->handler_context.output_config->adaptive_sync = 1; | ||
15 | } else { | ||
16 | config->handler_context.output_config->adaptive_sync = 0; | ||
17 | } | ||
18 | |||
19 | config->handler_context.leftovers.argc = argc - 1; | ||
20 | config->handler_context.leftovers.argv = argv + 1; | ||
21 | return NULL; | ||
22 | } | ||
diff --git a/sway/config/output.c b/sway/config/output.c index 40f86b6e..cbcf713b 100644 --- a/sway/config/output.c +++ b/sway/config/output.c | |||
@@ -64,6 +64,7 @@ struct output_config *new_output_config(const char *name) { | |||
64 | oc->transform = -1; | 64 | oc->transform = -1; |
65 | oc->subpixel = WL_OUTPUT_SUBPIXEL_UNKNOWN; | 65 | oc->subpixel = WL_OUTPUT_SUBPIXEL_UNKNOWN; |
66 | oc->max_render_time = -1; | 66 | oc->max_render_time = -1; |
67 | oc->adaptive_sync = -1; | ||
67 | return oc; | 68 | return oc; |
68 | } | 69 | } |
69 | 70 | ||
@@ -104,6 +105,9 @@ void merge_output_config(struct output_config *dst, struct output_config *src) { | |||
104 | if (src->max_render_time != -1) { | 105 | if (src->max_render_time != -1) { |
105 | dst->max_render_time = src->max_render_time; | 106 | dst->max_render_time = src->max_render_time; |
106 | } | 107 | } |
108 | if (src->adaptive_sync != -1) { | ||
109 | dst->adaptive_sync = src->adaptive_sync; | ||
110 | } | ||
107 | if (src->background) { | 111 | if (src->background) { |
108 | free(dst->background); | 112 | free(dst->background); |
109 | dst->background = strdup(src->background); | 113 | dst->background = strdup(src->background); |
@@ -390,6 +394,10 @@ bool apply_output_config(struct output_config *oc, struct sway_output *output) { | |||
390 | wlr_output_set_scale(wlr_output, scale); | 394 | wlr_output_set_scale(wlr_output, scale); |
391 | } | 395 | } |
392 | 396 | ||
397 | if (oc && oc->adaptive_sync != -1) { | ||
398 | wlr_output_enable_adaptive_sync(wlr_output, oc->adaptive_sync == 1); | ||
399 | } | ||
400 | |||
393 | sway_log(SWAY_DEBUG, "Committing output %s", wlr_output->name); | 401 | sway_log(SWAY_DEBUG, "Committing output %s", wlr_output->name); |
394 | if (!wlr_output_commit(wlr_output)) { | 402 | if (!wlr_output_commit(wlr_output)) { |
395 | // Failed to modeset, maybe the output is missing a CRTC. Leave the | 403 | // Failed to modeset, maybe the output is missing a CRTC. Leave the |
diff --git a/sway/meson.build b/sway/meson.build index 20fe02fb..6fdc4a7d 100644 --- a/sway/meson.build +++ b/sway/meson.build | |||
@@ -175,6 +175,7 @@ sway_sources = files( | |||
175 | 'commands/input/xkb_switch_layout.c', | 175 | 'commands/input/xkb_switch_layout.c', |
176 | 'commands/input/xkb_variant.c', | 176 | 'commands/input/xkb_variant.c', |
177 | 177 | ||
178 | 'commands/output/adaptive_sync.c', | ||
178 | 'commands/output/background.c', | 179 | 'commands/output/background.c', |
179 | 'commands/output/disable.c', | 180 | 'commands/output/disable.c', |
180 | 'commands/output/dpms.c', | 181 | 'commands/output/dpms.c', |
diff --git a/sway/sway-output.5.scd b/sway/sway-output.5.scd index 0f9fe208..b71e5744 100644 --- a/sway/sway-output.5.scd +++ b/sway/sway-output.5.scd | |||
@@ -148,6 +148,15 @@ must be separated by one space. For example: | |||
148 | optimal max_render_time value may vary based on the parent compositor | 148 | optimal max_render_time value may vary based on the parent compositor |
149 | rendering timings. | 149 | rendering timings. |
150 | 150 | ||
151 | *output* <name> adaptive_sync on|off | ||
152 | Enables or disables adaptive synchronization (often referred to as Variable | ||
153 | Refresh Rate, or by the vendor-specific names FreeSync/G-Sync). | ||
154 | |||
155 | Adaptive sync allows clients to submit frames a little to late without | ||
156 | having to wait a whole refresh period to display it on screen. Enabling | ||
157 | adaptive sync can improve latency, but can cause flickering on some | ||
158 | hardware. | ||
159 | |||
151 | # SEE ALSO | 160 | # SEE ALSO |
152 | 161 | ||
153 | *sway*(5) *sway-input*(5) | 162 | *sway*(5) *sway-input*(5) |