Blame SOURCES/0010-xwayland-eglstream-Check-framebuffer-status.patch

d05f4b
From 070abe64b15db831802a842aa1965403eb24679e Mon Sep 17 00:00:00 2001
d05f4b
From: Olivier Fourdan <ofourdan@redhat.com>
d05f4b
Date: Wed, 31 Mar 2021 09:49:35 +0200
d05f4b
Subject: [PATCH xserver 10/27] xwayland/eglstream: Check framebuffer status
d05f4b
MIME-Version: 1.0
d05f4b
Content-Type: text/plain; charset=UTF-8
d05f4b
Content-Transfer-Encoding: 8bit
d05f4b
d05f4b
The EGLStream backend would sometime generate GL errors trying to draw
d05f4b
to the framebuffer, which gives an invalid buffer, which in turn would
d05f4b
generate a Wayland error from the compositor which is fatal to the
d05f4b
client.
d05f4b
d05f4b
Check the framebuffer status and bail out early if it's not complete,
d05f4b
to avoid getting into trouble later.
d05f4b
d05f4b
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
d05f4b
Reviewed-by: Michel Dänzer <mdaenzer@redhat.com>
d05f4b
https://gitlab.freedesktop.org/xorg/xserver/-/issues/1156
d05f4b
(cherry picked from commit 85244d2a2081d61a2e4a06e847041f638de01e3f)
d05f4b
---
d05f4b
 hw/xwayland/xwayland-glamor-eglstream.c | 18 ++++++++++++++----
d05f4b
 1 file changed, 14 insertions(+), 4 deletions(-)
d05f4b
d05f4b
diff --git a/hw/xwayland/xwayland-glamor-eglstream.c b/hw/xwayland/xwayland-glamor-eglstream.c
d05f4b
index f64d05064..64fe93b7c 100644
d05f4b
--- a/hw/xwayland/xwayland-glamor-eglstream.c
d05f4b
+++ b/hw/xwayland/xwayland-glamor-eglstream.c
d05f4b
@@ -619,6 +619,7 @@ xwl_glamor_eglstream_post_damage(struct xwl_window *xwl_window,
d05f4b
         box->x2 - box->x1, box->y2 - box->y1
d05f4b
     };
d05f4b
     GLint saved_vao;
d05f4b
+    int status;
d05f4b
 
d05f4b
     if (xwl_pixmap->type != XWL_PIXMAP_EGLSTREAM)
d05f4b
         /* This can happen if a client does X11 rendering on a
d05f4b
@@ -652,6 +653,13 @@ xwl_glamor_eglstream_post_damage(struct xwl_window *xwl_window,
d05f4b
     glUniform1i(xwl_eglstream->blit_is_rgba_pos,
d05f4b
                 pixmap->drawable.depth >= 32);
d05f4b
 
d05f4b
+    status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
d05f4b
+    if (status != GL_FRAMEBUFFER_COMPLETE) {
d05f4b
+        ErrorF("eglstream: Framebuffer incomplete 0x%X, not posting damage\n", status);
d05f4b
+        status = FALSE;
d05f4b
+        goto out;
d05f4b
+    }
d05f4b
+
d05f4b
     /* Blit rendered image into EGLStream surface */
d05f4b
     glDrawBuffer(GL_BACK);
d05f4b
     glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
d05f4b
@@ -662,14 +670,16 @@ xwl_glamor_eglstream_post_damage(struct xwl_window *xwl_window,
d05f4b
     else
d05f4b
         eglSwapBuffers(xwl_screen->egl_display, xwl_pixmap->surface);
d05f4b
 
d05f4b
+    /* hang onto the pixmap until the compositor has released it */
d05f4b
+    pixmap->refcnt++;
d05f4b
+    status = TRUE;
d05f4b
+
d05f4b
+out:
d05f4b
     /* Restore previous state */
d05f4b
     glBindVertexArray(saved_vao);
d05f4b
     glBindTexture(GL_TEXTURE_2D, 0);
d05f4b
 
d05f4b
-    /* hang onto the pixmap until the compositor has released it */
d05f4b
-    pixmap->refcnt++;
d05f4b
-
d05f4b
-    return TRUE;
d05f4b
+    return status;
d05f4b
 }
d05f4b
 
d05f4b
 static Bool
d05f4b
-- 
d05f4b
2.31.1
d05f4b