diff options
Diffstat (limited to 'render/egl.c')
| -rw-r--r-- | render/egl.c | 29 | 
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")", | 
