From 792e92b385dbf107f29286abe94b7f498d9d44a1 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Mon, 26 Feb 2018 08:29:01 +0100 Subject: [PATCH] Backport patch to fix video corruption Signed-off-by: Igor Gnatenko --- ...egl-Reinstate-the-loader_dri3_vtable.patch | 131 ++++++++++++++++++ mesa.spec | 6 +- 2 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 0001-loader_dri3-glx-egl-Reinstate-the-loader_dri3_vtable.patch diff --git a/0001-loader_dri3-glx-egl-Reinstate-the-loader_dri3_vtable.patch b/0001-loader_dri3-glx-egl-Reinstate-the-loader_dri3_vtable.patch new file mode 100644 index 0000000..b2ccd38 --- /dev/null +++ b/0001-loader_dri3-glx-egl-Reinstate-the-loader_dri3_vtable.patch @@ -0,0 +1,131 @@ +From 318e8c521e81b2dc90f3c9f4855d60c334b4523a Mon Sep 17 00:00:00 2001 +From: Thomas Hellstrom +Date: Fri, 9 Feb 2018 09:37:19 +0100 +Subject: [PATCH] loader_dri3/glx/egl: Reinstate the loader_dri3_vtable + get_dri_screen callback + +Removing this callback caused rendering corruption in some multi-screen cases, +so it is reinstated but without the drawable argument which was never used +by implementations and was confusing since the drawable could have been +created with another screen. + +Cc: "17.3 18.0" mesa-stable@lists.freedesktop.org +Fixes: 5198e48a0d (loader_dri3/glx/egl: Remove the loader_dri3_vtable get_dri_screen callback) +Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105013 +Reported-by: Daniel van Vugt +Tested-by: Timo Aaltonen +Signed-off-by: Thomas Hellstrom +Reviewed-by: Brian Paul +(cherry picked from commit f386776ea55f86d0288c955cf4cf877a1b4a027d) +--- + src/egl/drivers/dri2/platform_x11_dri3.c | 12 ++++++++++++ + src/glx/dri3_glx.c | 11 +++++++++++ + src/loader/loader_dri3_helper.c | 12 +++++++++++- + src/loader/loader_dri3_helper.h | 1 + + 4 files changed, 35 insertions(+), 1 deletion(-) + +diff --git a/src/egl/drivers/dri2/platform_x11_dri3.c b/src/egl/drivers/dri2/platform_x11_dri3.c +index 6e40eaa596..060b5f83a3 100644 +--- a/src/egl/drivers/dri2/platform_x11_dri3.c ++++ b/src/egl/drivers/dri2/platform_x11_dri3.c +@@ -75,6 +75,17 @@ egl_dri3_get_dri_context(struct loader_dri3_drawable *draw) + return dri2_ctx->dri_context; + } + ++static __DRIscreen * ++egl_dri3_get_dri_screen(void) ++{ ++ _EGLContext *ctx = _eglGetCurrentContext(); ++ struct dri2_egl_context *dri2_ctx; ++ if (!ctx) ++ return NULL; ++ dri2_ctx = dri2_egl_context(ctx); ++ return dri2_egl_display(dri2_ctx->base.Resource.Display)->dri_screen; ++} ++ + static void + egl_dri3_flush_drawable(struct loader_dri3_drawable *draw, unsigned flags) + { +@@ -88,6 +99,7 @@ static const struct loader_dri3_vtable egl_dri3_vtable = { + .set_drawable_size = egl_dri3_set_drawable_size, + .in_current_context = egl_dri3_in_current_context, + .get_dri_context = egl_dri3_get_dri_context, ++ .get_dri_screen = egl_dri3_get_dri_screen, + .flush_drawable = egl_dri3_flush_drawable, + .show_fps = NULL, + }; +diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c +index f280a8cef7..016f91b196 100644 +--- a/src/glx/dri3_glx.c ++++ b/src/glx/dri3_glx.c +@@ -116,6 +116,16 @@ glx_dri3_get_dri_context(struct loader_dri3_drawable *draw) + return (gc != &dummyContext) ? dri3Ctx->driContext : NULL; + } + ++static __DRIscreen * ++glx_dri3_get_dri_screen(void) ++{ ++ struct glx_context *gc = __glXGetCurrentContext(); ++ struct dri3_context *pcp = (struct dri3_context *) gc; ++ struct dri3_screen *psc = (struct dri3_screen *) pcp->base.psc; ++ ++ return (gc != &dummyContext && psc) ? psc->driScreen : NULL; ++} ++ + static void + glx_dri3_flush_drawable(struct loader_dri3_drawable *draw, unsigned flags) + { +@@ -150,6 +160,7 @@ static const struct loader_dri3_vtable glx_dri3_vtable = { + .set_drawable_size = glx_dri3_set_drawable_size, + .in_current_context = glx_dri3_in_current_context, + .get_dri_context = glx_dri3_get_dri_context, ++ .get_dri_screen = glx_dri3_get_dri_screen, + .flush_drawable = glx_dri3_flush_drawable, + .show_fps = glx_dri3_show_fps, + }; +diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c +index fbda3d635c..2e3b6c619e 100644 +--- a/src/loader/loader_dri3_helper.c ++++ b/src/loader/loader_dri3_helper.c +@@ -1311,6 +1311,7 @@ dri3_get_pixmap_buffer(__DRIdrawable *driDrawable, unsigned int format, + xcb_sync_fence_t sync_fence; + struct xshmfence *shm_fence; + int fence_fd; ++ __DRIscreen *cur_screen; + + if (buffer) + return buffer; +@@ -1341,8 +1342,17 @@ dri3_get_pixmap_buffer(__DRIdrawable *driDrawable, unsigned int format, + if (!bp_reply) + goto no_image; + ++ /* Get the currently-bound screen or revert to using the drawable's screen if ++ * no contexts are currently bound. The latter case is at least necessary for ++ * obs-studio, when using Window Capture (Xcomposite) as a Source. ++ */ ++ cur_screen = draw->vtable->get_dri_screen(); ++ if (!cur_screen) { ++ cur_screen = draw->dri_screen; ++ } ++ + buffer->image = loader_dri3_create_image(draw->conn, bp_reply, format, +- draw->dri_screen, draw->ext->image, ++ cur_screen, draw->ext->image, + buffer); + if (!buffer->image) + goto no_image; +diff --git a/src/loader/loader_dri3_helper.h b/src/loader/loader_dri3_helper.h +index 4ce98b8c59..839cba30df 100644 +--- a/src/loader/loader_dri3_helper.h ++++ b/src/loader/loader_dri3_helper.h +@@ -99,6 +99,7 @@ struct loader_dri3_vtable { + void (*set_drawable_size)(struct loader_dri3_drawable *, int, int); + bool (*in_current_context)(struct loader_dri3_drawable *); + __DRIcontext *(*get_dri_context)(struct loader_dri3_drawable *); ++ __DRIscreen *(*get_dri_screen)(void); + void (*flush_drawable)(struct loader_dri3_drawable *, unsigned); + void (*show_fps)(struct loader_dri3_drawable *, uint64_t); + }; +-- +2.16.2 + diff --git a/mesa.spec b/mesa.spec index a872e9a..6739194 100644 --- a/mesa.spec +++ b/mesa.spec @@ -62,7 +62,7 @@ Name: mesa Summary: Mesa graphics libraries Version: 18.0.0 -Release: 0.1%{?rctag:.%{rctag}}%{?dist} +Release: 0.2%{?rctag:.%{rctag}}%{?dist} License: MIT URL: http://www.mesa3d.org @@ -87,6 +87,7 @@ Patch10: glvnd-fix-gl-dot-pc.patch Patch11: 0001-Fix-linkage-against-shared-glapi.patch # backport from upstream +Patch1001: 0001-loader_dri3-glx-egl-Reinstate-the-loader_dri3_vtable.patch BuildRequires: gcc BuildRequires: gcc-c++ @@ -695,6 +696,9 @@ popd %endif %changelog +* Mon Feb 26 2018 Igor Gnatenko - 18.0.0-0.2.rc4 +- Backport patch to fix video corruption + * Mon Feb 19 2018 Igor Gnatenko - 18.0.0-0.1.rc4 - Update to 18.0.0~rc4