From d1c931cbe87ee18a46519f6f8c5cf8528e6b291d Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Wed, 7 Apr 2021 10:03:51 +0200 Subject: [PATCH] output: fallback to XRGB in output_pick_format This will be necessary for the primary buffer. --- types/wlr_output.c | 53 +++++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 22 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); - return NULL; - } - - 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; + 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; } - } 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 (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); + } + + if (format == NULL) { + wlr_log(WLR_DEBUG, "Failed to intersect display and render " + "modifiers for format 0x%"PRIX32, fmt); + } else { + break; + } + } 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; }