[PATCH weston] gl-renderer: Ignore INVALID modifier

Daniel Stone daniels at collabora.com
Wed Oct 4 17:35:45 UTC 2017


If the user has passed an INVALID modifier, it's because there is no
applicable modifier, and the buffer layout should be determined by a
magic side-channel call (e.g. bo_get_tiling). If the modifier is
INVALID, don't try to pass it through to EGL, but just drop it.

On the other hand, if a modifier _is_ explicitly specified and we don't
have the modifiers extension, then refuse to import the buffer.

Signed-off-by: Daniel Stone <daniels at collabora.com>
---
 libweston/gl-renderer.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/libweston/gl-renderer.c b/libweston/gl-renderer.c
index 5749aa71..244ce309 100644
--- a/libweston/gl-renderer.c
+++ b/libweston/gl-renderer.c
@@ -1735,6 +1735,7 @@ import_simple_dmabuf(struct gl_renderer *gr,
 	struct egl_image *image;
 	EGLint attribs[50];
 	int atti = 0;
+	bool has_modifier;
 
 	/* This requires the Mesa commit in
 	 * Mesa 10.3 (08264e5dad4df448e7718e782ad9077902089a07) or
@@ -1751,6 +1752,14 @@ import_simple_dmabuf(struct gl_renderer *gr,
 	attribs[atti++] = EGL_LINUX_DRM_FOURCC_EXT;
 	attribs[atti++] = attributes->format;
 
+	if (attributes->modifier[0] != DRM_FORMAT_MOD_INVALID) {
+		if (!gr->has_dmabuf_import_modifiers)
+			return NULL;
+		has_modifier = true;
+	} else {
+		has_modifier = false;
+	}
+
 	if (attributes->n_planes > 0) {
 		attribs[atti++] = EGL_DMA_BUF_PLANE0_FD_EXT;
 		attribs[atti++] = attributes->fd[0];
@@ -1758,7 +1767,7 @@ import_simple_dmabuf(struct gl_renderer *gr,
 		attribs[atti++] = attributes->offset[0];
 		attribs[atti++] = EGL_DMA_BUF_PLANE0_PITCH_EXT;
 		attribs[atti++] = attributes->stride[0];
-		if (gr->has_dmabuf_import_modifiers) {
+		if (has_modifier) {
 			attribs[atti++] = EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT;
 			attribs[atti++] = attributes->modifier[0] & 0xFFFFFFFF;
 			attribs[atti++] = EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT;
@@ -1773,7 +1782,7 @@ import_simple_dmabuf(struct gl_renderer *gr,
 		attribs[atti++] = attributes->offset[1];
 		attribs[atti++] = EGL_DMA_BUF_PLANE1_PITCH_EXT;
 		attribs[atti++] = attributes->stride[1];
-		if (gr->has_dmabuf_import_modifiers) {
+		if (has_modifier) {
 			attribs[atti++] = EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT;
 			attribs[atti++] = attributes->modifier[1] & 0xFFFFFFFF;
 			attribs[atti++] = EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT;
@@ -1788,7 +1797,7 @@ import_simple_dmabuf(struct gl_renderer *gr,
 		attribs[atti++] = attributes->offset[2];
 		attribs[atti++] = EGL_DMA_BUF_PLANE2_PITCH_EXT;
 		attribs[atti++] = attributes->stride[2];
-		if (gr->has_dmabuf_import_modifiers) {
+		if (has_modifier) {
 			attribs[atti++] = EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT;
 			attribs[atti++] = attributes->modifier[2] & 0xFFFFFFFF;
 			attribs[atti++] = EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT;
-- 
2.14.2



More information about the wayland-devel mailing list