aboutsummaryrefslogtreecommitdiffstats
path: root/sway/config/output.c
diff options
context:
space:
mode:
authorLibravatar Manuel Stoeckl <code@mstoeckl.com>2021-09-02 21:45:23 -0400
committerLibravatar Simon Ser <contact@emersion.fr>2021-11-23 15:51:54 +0100
commita23cdbbea145e0890627743d316c0ab6fe6c9c1f (patch)
tree586a3c020872b9caa131ebc0ec1896043603f9c9 /sway/config/output.c
parentsway: create wlr_renderer and wlr_allocator (diff)
downloadsway-a23cdbbea145e0890627743d316c0ab6fe6c9c1f.tar.gz
sway-a23cdbbea145e0890627743d316c0ab6fe6c9c1f.tar.zst
sway-a23cdbbea145e0890627743d316c0ab6fe6c9c1f.zip
Add 'output render_bit_depth [8|10]' command
This makes it possible to hint to the renderer and backends how many bits per channel the buffers that the compositor draws windows onto should have. Renderers and backends may deviate from this if they do not support the formats with higher bit depth.
Diffstat (limited to 'sway/config/output.c')
-rw-r--r--sway/config/output.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/sway/config/output.c b/sway/config/output.c
index 6d39c2f5..63c81382 100644
--- a/sway/config/output.c
+++ b/sway/config/output.c
@@ -1,5 +1,6 @@
1#define _POSIX_C_SOURCE 200809L 1#define _POSIX_C_SOURCE 200809L
2#include <assert.h> 2#include <assert.h>
3#include <drm_fourcc.h>
3#include <stdbool.h> 4#include <stdbool.h>
4#include <string.h> 5#include <string.h>
5#include <sys/socket.h> 6#include <sys/socket.h>
@@ -67,6 +68,7 @@ struct output_config *new_output_config(const char *name) {
67 oc->subpixel = WL_OUTPUT_SUBPIXEL_UNKNOWN; 68 oc->subpixel = WL_OUTPUT_SUBPIXEL_UNKNOWN;
68 oc->max_render_time = -1; 69 oc->max_render_time = -1;
69 oc->adaptive_sync = -1; 70 oc->adaptive_sync = -1;
71 oc->render_bit_depth = RENDER_BIT_DEPTH_DEFAULT;
70 return oc; 72 return oc;
71} 73}
72 74
@@ -113,6 +115,9 @@ void merge_output_config(struct output_config *dst, struct output_config *src) {
113 if (src->adaptive_sync != -1) { 115 if (src->adaptive_sync != -1) {
114 dst->adaptive_sync = src->adaptive_sync; 116 dst->adaptive_sync = src->adaptive_sync;
115 } 117 }
118 if (src->render_bit_depth != RENDER_BIT_DEPTH_DEFAULT) {
119 dst->render_bit_depth = src->render_bit_depth;
120 }
116 if (src->background) { 121 if (src->background) {
117 free(dst->background); 122 free(dst->background);
118 dst->background = strdup(src->background); 123 dst->background = strdup(src->background);
@@ -351,6 +356,23 @@ static int compute_default_scale(struct wlr_output *output) {
351 return 2; 356 return 2;
352} 357}
353 358
359/* Lists of formats to try, in order, when a specific render bit depth has
360 * been asked for. The second to last format in each list should always
361 * be XRGB8888, as a reliable backup in case the others are not available;
362 * the last should be DRM_FORMAT_INVALID, to indicate the end of the list. */
363static const uint32_t *bit_depth_preferences[] = {
364 [RENDER_BIT_DEPTH_8] = (const uint32_t []){
365 DRM_FORMAT_XRGB8888,
366 DRM_FORMAT_INVALID,
367 },
368 [RENDER_BIT_DEPTH_10] = (const uint32_t []){
369 DRM_FORMAT_XRGB2101010,
370 DRM_FORMAT_XBGR2101010,
371 DRM_FORMAT_XRGB8888,
372 DRM_FORMAT_INVALID,
373 },
374};
375
354static void queue_output_config(struct output_config *oc, 376static void queue_output_config(struct output_config *oc,
355 struct sway_output *output) { 377 struct sway_output *output) {
356 if (output == root->noop_output) { 378 if (output == root->noop_output) {
@@ -437,6 +459,22 @@ static void queue_output_config(struct output_config *oc,
437 oc->adaptive_sync); 459 oc->adaptive_sync);
438 wlr_output_enable_adaptive_sync(wlr_output, oc->adaptive_sync == 1); 460 wlr_output_enable_adaptive_sync(wlr_output, oc->adaptive_sync == 1);
439 } 461 }
462
463 if (oc && oc->render_bit_depth != RENDER_BIT_DEPTH_DEFAULT) {
464 const uint32_t *fmts = bit_depth_preferences[oc->render_bit_depth];
465 assert(fmts);
466
467 for (size_t i = 0; fmts[i] != DRM_FORMAT_INVALID; i++) {
468 wlr_output_set_render_format(wlr_output, fmts[i]);
469 if (wlr_output_test(wlr_output)) {
470 break;
471 }
472
473 sway_log(SWAY_DEBUG, "Preferred output format 0x%08x "
474 "failed to work, falling back to next in "
475 "list, 0x%08x", fmts[i], fmts[i + 1]);
476 }
477 }
440} 478}
441 479
442bool apply_output_config(struct output_config *oc, struct sway_output *output) { 480bool apply_output_config(struct output_config *oc, struct sway_output *output) {