aboutsummaryrefslogtreecommitdiff
path: root/render
diff options
context:
space:
mode:
Diffstat (limited to 'render')
-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")",