aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2021-04-07 10:03:51 +0200
committerSimon Ser <contact@emersion.fr>2021-07-28 22:52:35 +0200
commitd1c931cbe87ee18a46519f6f8c5cf8528e6b291d (patch)
tree798570863677e576a27c8899742a20c341c9ba7a
parente5063ef3a3b12d4384595cb0554cf1f84d5be6f8 (diff)
output: fallback to XRGB in output_pick_format
This will be necessary for the primary buffer.
-rw-r--r--types/wlr_output.c51
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;
}