diff options
author | Simon Ser <contact@emersion.fr> | 2021-04-07 10:03:51 +0200 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2021-07-28 22:52:35 +0200 |
commit | d1c931cbe87ee18a46519f6f8c5cf8528e6b291d (patch) | |
tree | 798570863677e576a27c8899742a20c341c9ba7a | |
parent | e5063ef3a3b12d4384595cb0554cf1f84d5be6f8 (diff) |
output: fallback to XRGB in output_pick_format
This will be necessary for the primary buffer.
-rw-r--r-- | types/wlr_output.c | 51 |
1 files changed, 30 insertions, 21 deletions
diff --git a/types/wlr_output.c b/types/wlr_output.c index 4b3cabf7..2a054e7c 100644 --- a/types/wlr_output.c +++ b/types/wlr_output.c @@ -1178,32 +1178,41 @@ static struct wlr_drm_format *output_pick_format(struct wlr_output *output, return NULL; } - uint32_t fmt = DRM_FORMAT_ARGB8888; + struct wlr_drm_format *format = NULL; + const uint32_t candidates[] = { DRM_FORMAT_ARGB8888, DRM_FORMAT_XRGB8888 }; + for (size_t i = 0; i < sizeof(candidates) / sizeof(candidates[0]); i++) { + uint32_t fmt = candidates[i]; + + const struct wlr_drm_format *render_format = + wlr_drm_format_set_get(render_formats, fmt); + if (render_format == NULL) { + wlr_log(WLR_DEBUG, "Renderer doesn't support format 0x%"PRIX32, fmt); + continue; + } - const struct wlr_drm_format *render_format = - wlr_drm_format_set_get(render_formats, fmt); - if (render_format == NULL) { - wlr_log(WLR_DEBUG, "Renderer doesn't support format 0x%"PRIX32, fmt); - return NULL; - } + if (display_formats != NULL) { + const struct wlr_drm_format *display_format = + wlr_drm_format_set_get(display_formats, fmt); + if (display_format == NULL) { + wlr_log(WLR_DEBUG, "Output doesn't support format 0x%"PRIX32, fmt); + continue; + } + format = wlr_drm_format_intersect(display_format, render_format); + } else { + // The output can display any format + format = wlr_drm_format_dup(render_format); + } - const struct wlr_drm_format *display_format; - if (display_formats != NULL) { - display_format = wlr_drm_format_set_get(display_formats, fmt); - if (display_format == NULL) { - wlr_log(WLR_DEBUG, "Output doesn't support format 0x%"PRIX32, fmt); - return NULL; + if (format == NULL) { + wlr_log(WLR_DEBUG, "Failed to intersect display and render " + "modifiers for format 0x%"PRIX32, fmt); + } else { + break; } - } else { - // The output can display any format - display_format = render_format; } - - struct wlr_drm_format *format = - wlr_drm_format_intersect(display_format, render_format); if (format == NULL) { - wlr_log(WLR_DEBUG, "Failed to intersect display and render " - "modifiers for format 0x%"PRIX32, fmt); + wlr_log(WLR_ERROR, "Failed to choose a format for output '%s'", + output->name); return NULL; } |