aboutsummaryrefslogtreecommitdiff
path: root/render/egl.c
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2022-12-13 12:14:28 +0100
committerSimon Zeni <simon@bl4ckb0ne.ca>2022-12-13 16:43:22 +0000
commitf12cdc53f3c07ca3ee8125fcac1dd6e17bed0c73 (patch)
treeb1ce04d7820120728ce462045c69e58628579948 /render/egl.c
parent80074d95fba4fea5b8de1c2e948016eac63caec2 (diff)
render/egl: stop advertising render support for external-only formats
Some formats like YUV are only supported by Mesa for sampling, not for rendering. However we always unconditionally added the INVALID modifier to the list of render formats. Check whether all modifiers are external-only, in that case, don't add INVALID to the list of render formats.
Diffstat (limited to 'render/egl.c')
-rw-r--r--render/egl.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/render/egl.c b/render/egl.c
index b50fe448..70596c75 100644
--- a/render/egl.c
+++ b/render/egl.c
@@ -136,11 +136,25 @@ static void init_dmabuf_formats(struct wlr_egl *egl) {
has_modifiers = has_modifiers || modifiers_len > 0;
- // EGL always supports implicit modifiers
+ bool all_external_only = true;
+ for (int j = 0; j < modifiers_len; j++) {
+ wlr_drm_format_set_add(&egl->dmabuf_texture_formats, fmt,
+ modifiers[j]);
+ if (!external_only[j]) {
+ wlr_drm_format_set_add(&egl->dmabuf_render_formats, fmt,
+ modifiers[j]);
+ all_external_only = false;
+ }
+ }
+
+ // EGL always supports implicit modifiers. If at least one modifier supports rendering,
+ // assume the implicit modifier supports rendering too.
wlr_drm_format_set_add(&egl->dmabuf_texture_formats, fmt,
DRM_FORMAT_MOD_INVALID);
- wlr_drm_format_set_add(&egl->dmabuf_render_formats, fmt,
- DRM_FORMAT_MOD_INVALID);
+ if (modifiers_len == 0 || !all_external_only) {
+ wlr_drm_format_set_add(&egl->dmabuf_render_formats, fmt,
+ DRM_FORMAT_MOD_INVALID);
+ }
if (modifiers_len == 0) {
// Asume the linear layout is supported if the driver doesn't
@@ -151,15 +165,6 @@ static void init_dmabuf_formats(struct wlr_egl *egl) {
DRM_FORMAT_MOD_LINEAR);
}
- for (int j = 0; j < modifiers_len; j++) {
- wlr_drm_format_set_add(&egl->dmabuf_texture_formats, fmt,
- modifiers[j]);
- if (!external_only[j]) {
- wlr_drm_format_set_add(&egl->dmabuf_render_formats, fmt,
- modifiers[j]);
- }
- }
-
if (wlr_log_get_verbosity() >= WLR_DEBUG) {
char *fmt_name = drmGetFormatName(fmt);
wlr_log(WLR_DEBUG, " %s (0x%08"PRIX32")",