diff options
6 files changed, 240 insertions, 6 deletions
diff --git a/libre/mesa-libcl/0001-Mesa-dev-st_glsl_to_tgsi-overlord-fix.patch b/libre/mesa-libcl/0001-Mesa-dev-st_glsl_to_tgsi-overlord-fix.patch new file mode 100644 index 000000000..0ba38ca09 --- /dev/null +++ b/libre/mesa-libcl/0001-Mesa-dev-st_glsl_to_tgsi-overlord-fix.patch @@ -0,0 +1,17 @@ +diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +index 7564119..38e2c4a 100644 +--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp ++++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +@@ -6058,7 +6058,11 @@ st_translate_program( + inputSemanticName[i], inputSemanticIndex[i], + interpMode[i], 0, interpLocation[i], + array_id, array_size); +- i += array_size - 1; ++ ++ GLuint base_attr = inputSlotToAttr[i]; ++ while (i + 1 < numInputs && ++ inputSlotToAttr[i + 1] < base_attr + array_size) ++ ++i; + } + else { + t->inputs[i] = ureg_DECL_fs_input_cyl_centroid(ureg, diff --git a/libre/mesa-libcl/0001-i965-import-prime-buffers-in-the-current-context-not.patch b/libre/mesa-libcl/0001-i965-import-prime-buffers-in-the-current-context-not.patch new file mode 100644 index 000000000..0b37366f6 --- /dev/null +++ b/libre/mesa-libcl/0001-i965-import-prime-buffers-in-the-current-context-not.patch @@ -0,0 +1,66 @@ +From e180e9e3c830d3611a6cf7d32e988b4c28d20942 Mon Sep 17 00:00:00 2001 +From: Martin Peres <martin.peres@linux.intel.com> +Date: Wed, 3 Aug 2016 12:58:23 +0300 +Subject: [PATCH] i965: import prime buffers in the current context, not screen + +This mirrors the codepath taken by DRI2 in IntelSetTexBuffer2() and +fixes many applications when using DRI3: + - Totem with libva on hw-accelerated decoding + - obs-studio, using Window Capture (Xcomposite) as a Source + - gstreamer with VAAPI + +Cc: mesa-stable@lists.freedesktop.org +Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=71759 +Signed-off-by: Martin Peres <martin.peres@linux.intel.com> +--- + src/mesa/drivers/dri/i965/intel_screen.c | 25 +++++++++++++++++++++++-- + 1 file changed, 23 insertions(+), 2 deletions(-) + +diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c +index ae51c40..169d578 100644 +--- a/src/mesa/drivers/dri/i965/intel_screen.c ++++ b/src/mesa/drivers/dri/i965/intel_screen.c +@@ -702,8 +702,11 @@ intel_create_image_from_fds(__DRIscreen *screen, + int *fds, int num_fds, int *strides, int *offsets, + void *loaderPrivate) + { ++ GET_CURRENT_CONTEXT(ctx); + struct intel_screen *intelScreen = screen->driverPrivate; ++ struct brw_context *brw = brw_context(ctx); + struct intel_image_format *f; ++ dri_bufmgr *bufmgr; + __DRIimage *image; + int i, index; + +@@ -744,8 +747,26 @@ intel_create_image_from_fds(__DRIscreen *screen, + size = end; + } + +- image->bo = drm_intel_bo_gem_create_from_prime(intelScreen->bufmgr, +- fds[0], size); ++ /* Let's import the buffer into the current context instead of the current ++ * screen as some applications like gstreamer, totem, or obs create multiple ++ * X connections which end up creating multiple screens and thus multiple ++ * buffer managers. They then proceed to use a different X connection than ++ * the one used by the currently-bound context to call GLXBindTexImageExt() ++ * which should then import the buffer in the current bound context and not ++ * the current screen. This is done properly upstairs for texture management ++ * so we need to mirror this behaviour if we don't want the kernel rejecting ++ * our pushbuffers as the buffer would not have been imported by the same ++ * buffer manager that sent the pushbuffer referencing it. ++ * ++ * If there is no context currently bound, then revert to using the screen's ++ * buffer manager and hope for the best... ++ */ ++ if (brw) ++ bufmgr = brw->bufmgr; ++ else ++ bufmgr = intelScreen->bufmgr; ++ ++ image->bo = drm_intel_bo_gem_create_from_prime(bufmgr, fds[0], size); + if (image->bo == NULL) { + free(image); + return NULL; +-- +2.9.0 + diff --git a/libre/mesa-libcl/0001-st-mesa-fix-reference-counting-bug-in-st_vdpau.patch b/libre/mesa-libcl/0001-st-mesa-fix-reference-counting-bug-in-st_vdpau.patch new file mode 100644 index 000000000..3f2391dbc --- /dev/null +++ b/libre/mesa-libcl/0001-st-mesa-fix-reference-counting-bug-in-st_vdpau.patch @@ -0,0 +1,76 @@ +From 9ce52baf7f479d506bcea17a371dcf2fad92f139 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com> +Date: Wed, 13 Jul 2016 14:54:31 +0200 +Subject: [PATCH] st/mesa: fix reference counting bug in st_vdpau +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Otherwise we leak the resources created for the DMA-buf descriptors. + +Signed-off-by: Christian König <christian.koenig@amd.com> +Cc: 12.0 <mesa-stable@lists.freedesktop.org> +Tested-and-Reviewed by: Leo Liu <leo.liu@amd.com> +Ack-by: Tom St Denis <tom.stdenis@amd.com> +--- + src/mesa/state_tracker/st_vdpau.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +diff --git a/src/mesa/state_tracker/st_vdpau.c b/src/mesa/state_tracker/st_vdpau.c +index dffa52f..4f599dd 100644 +--- a/src/mesa/state_tracker/st_vdpau.c ++++ b/src/mesa/state_tracker/st_vdpau.c +@@ -65,6 +65,7 @@ st_vdpau_video_surface_gallium(struct gl_context *ctx, const void *vdpSurface, + + struct pipe_video_buffer *buffer; + struct pipe_sampler_view **samplers; ++ struct pipe_resource *res = NULL; + + getProcAddr = (void *)ctx->vdpGetProcAddress; + if (getProcAddr(device, VDP_FUNC_ID_VIDEO_SURFACE_GALLIUM, (void**)&f)) +@@ -82,7 +83,8 @@ st_vdpau_video_surface_gallium(struct gl_context *ctx, const void *vdpSurface, + if (!sv) + return NULL; + +- return sv->texture; ++ pipe_resource_reference(&res, sv->texture); ++ return res; + } + + static struct pipe_resource * +@@ -90,13 +92,15 @@ st_vdpau_output_surface_gallium(struct gl_context *ctx, const void *vdpSurface) + { + int (*getProcAddr)(uint32_t device, uint32_t id, void **ptr); + uint32_t device = (uintptr_t)ctx->vdpDevice; ++ struct pipe_resource *res = NULL; + VdpOutputSurfaceGallium *f; + + getProcAddr = (void *)ctx->vdpGetProcAddress; + if (getProcAddr(device, VDP_FUNC_ID_OUTPUT_SURFACE_GALLIUM, (void**)&f)) + return NULL; + +- return f((uintptr_t)vdpSurface); ++ pipe_resource_reference(&res, f((uintptr_t)vdpSurface)); ++ return res; + } + + static struct pipe_resource * +@@ -208,6 +212,7 @@ st_vdpau_map_surface(struct gl_context *ctx, GLenum target, GLenum access, + /* do we have different screen objects ? */ + if (res->screen != st->pipe->screen) { + _mesa_error(ctx, GL_INVALID_OPERATION, "VDPAUMapSurfacesNV"); ++ pipe_resource_reference(&res, NULL); + return; + } + +@@ -241,6 +246,7 @@ st_vdpau_map_surface(struct gl_context *ctx, GLenum target, GLenum access, + stObj->surface_format = res->format; + + _mesa_dirty_texobj(ctx, texObj); ++ pipe_resource_reference(&res, NULL); + } + + static void +-- +2.9.0 + diff --git a/libre/mesa-libcl/0002-vl-dri3-fix-a-memory-leak-from-front-buffer.patch b/libre/mesa-libcl/0002-vl-dri3-fix-a-memory-leak-from-front-buffer.patch new file mode 100644 index 000000000..e9da7c50c --- /dev/null +++ b/libre/mesa-libcl/0002-vl-dri3-fix-a-memory-leak-from-front-buffer.patch @@ -0,0 +1,38 @@ +From 134d6e4e4f980d738361bfcae1daedb8cc58b5df Mon Sep 17 00:00:00 2001 +From: Leo Liu <leo.liu@amd.com> +Date: Thu, 14 Jul 2016 09:19:59 -0400 +Subject: [PATCH] vl/dri3: fix a memory leak from front buffer + +Inspired by fix for mem leak of vdpau interop, resource_from_handle +set texture reference count, that need to be decreased and released, +recall there is a similar case for DRI3, that is with VA-API glx +extension, there is temporary TFP(texture from pixmap), we target it +through dma-buf. leak happens when without count down the reference. + +Checked and found with mpv vo=opengl case, there only one static TFP, +the leak happens once, but for totem player using gstreamer VA-API glx, +the dynamic TFP for each frame, so leak quite a bit. + +This fixes mem leak for mpv and totem. + +Signed-off-by: Leo Liu <leo.liu@amd.com> +Cc: "12.0" <mesa-stable@lists.freedesktop.org> +--- + src/gallium/auxiliary/vl/vl_winsys_dri3.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/gallium/auxiliary/vl/vl_winsys_dri3.c b/src/gallium/auxiliary/vl/vl_winsys_dri3.c +index f7f572e..493e645 100644 +--- a/src/gallium/auxiliary/vl/vl_winsys_dri3.c ++++ b/src/gallium/auxiliary/vl/vl_winsys_dri3.c +@@ -89,6 +89,7 @@ dri3_free_front_buffer(struct vl_dri3_screen *scrn, + { + xcb_sync_destroy_fence(scrn->conn, buffer->sync_fence); + xshmfence_unmap_shm(buffer->shm_fence); ++ pipe_resource_reference(&buffer->texture, NULL); + FREE(buffer); + } + +-- +2.9.0 + diff --git a/libre/mesa-libcl/PKGBUILD b/libre/mesa-libcl/PKGBUILD index 1093de40d..49d9d9769 100644 --- a/libre/mesa-libcl/PKGBUILD +++ b/libre/mesa-libcl/PKGBUILD @@ -4,7 +4,7 @@ pkgbase=mesa _pkgname=libcl pkgname=$pkgbase-$_pkgname -pkgver=11.2.2 +pkgver=12.0.1 pkgrel=1 pkgdesc='Mesa 3-D OpenCL library and ICD loader' arch=('i686' 'x86_64') @@ -17,16 +17,40 @@ makedepends=('python2-mako' 'dri2proto' 'dri3proto' 'glproto' 'presentproto' 'py provides=("$_pkgname" 'opencl-icd-loader') conflicts=("$_pkgname" "$_pkgname-libre" 'opencl-nvidia' 'opencl-nvidia-304xx' 'ocl-icd') replaces=("$_pkgname" "$_pkgname-libre" 'opencl-nvidia' 'opencl-nvidia-304xx') -source=(ftp://ftp.freedesktop.org/pub/$pkgbase/$pkgver/$pkgbase-$pkgver.tar.xz{,.sig}) -sha512sums=('fd1fcb1bc97e52784a4b3dedfd8c8ba95bc1b03a62b132d2e16154d076be7a6fabbca1bcba705a7916a1507d811d7f3e6c3488aa386d5e63891282fb1713ce52' - 'SKIP') +source=(ftp://ftp.freedesktop.org/pub/$pkgbase/$pkgver/$pkgbase-$pkgver.tar.xz{,.sig} + remove-libpthread-stubs.patch + 0001-st-mesa-fix-reference-counting-bug-in-st_vdpau.patch + 0002-vl-dri3-fix-a-memory-leak-from-front-buffer.patch + 0001-Mesa-dev-st_glsl_to_tgsi-overlord-fix.patch + 0001-i965-import-prime-buffers-in-the-current-context-not.patch) +sha512sums=('11898336478d1f5bd3946d695b9599647c0b9084ad8890b4fa89daa922a217e5ca6d8b72f5801e362c3dd7723382f2daaa655b54f65a6d088ad8cfdb85f10023' + 'SKIP' + '6349de16a2a11b8540d82a78cd15574ea92e0a22f2e184b93311060f72cc3749efba67be464a1b399493035c6e389017d5631b0be2e8ef5da115b137e26c33df' + '499312eb048e32b27820eebeb243df926226f3c2247bfc9b19b28664eaffc7e524cc1dc760d701159a46f37be46e49e956b27de473c465cecbdf0db6d6b97fe0' + 'e8b6c75565b7f72f5bc073469fef50e2b04311dc235885f69ad15591e338601273dec99bfd8cbb85f0cc5b3ecf4e4ac8c6ef64225e2ed68504081af3944f88a8' + 'fd677879e97f7d30346ef9c41e89770e06e4714b0e74c7bb3d88984038e2fb3cc7f7fb6df59469527ba2c07f8bf51959f65e8dd6dfceea9e400b44157308b816' + '8b6c5eb3024ae5095fbb86e07aa578ede106844388077b5b9d2e9b5822640424be308e34d67daff44b0c25624f2b4ff1e67fc5d21cf5dfaa07b760be2cbd1531') validpgpkeys=('8703B6700E7EE06D7A39B8D6EDAE37B02CEB490D') # Emil Velikov <emil.l.velikov@gmail.com> prepare() { cd $srcdir/$pkgbase-$pkgver - # Fix detection of libLLVM when built with CMake + # Fix detection of libLLVM when builds with CMake sed -i 's/LLVM_SO_NAME=.*/LLVM_SO_NAME=LLVM/' configure + + # Now mesa checks for libpthread-stubs - so remove the check + patch -Np1 -i ../remove-libpthread-stubs.patch + + # fix memory leaks - merged upstream + patch -Np1 -i ../0001-st-mesa-fix-reference-counting-bug-in-st_vdpau.patch + patch -Np1 -i ../0002-vl-dri3-fix-a-memory-leak-from-front-buffer.patch + # fix rendering in some games - merged upstream + patch -Np1 -i ../0001-Mesa-dev-st_glsl_to_tgsi-overlord-fix.patch + # fix https://bugs.freedesktop.org/show_bug.cgi?id=71759 / FS#50240 + # reverted because of it segfault X with modesetting/intel + #patch -Np1 -i ../0001-i965-import-prime-buffers-in-the-current-context-not.patch + + autoreconf -fiv } build() { @@ -58,7 +82,6 @@ package() { cp -rv $srcdir/fakeinstall/usr/lib/gallium-pipe/pipe_{nouveau,r300,swrast,vmwgfx}.so $pkgdir/usr/lib/gallium-pipe/ install -vm755 -d $pkgdir/usr/share/licenses/$pkgname - install -vm644 docs/COPYING $pkgdir/usr/share/licenses/$pkgname install -vm644 docs/license.html $pkgdir/usr/share/licenses/$pkgname/LICENSE } diff --git a/libre/mesa-libcl/remove-libpthread-stubs.patch b/libre/mesa-libcl/remove-libpthread-stubs.patch new file mode 100644 index 000000000..5b44d03cc --- /dev/null +++ b/libre/mesa-libcl/remove-libpthread-stubs.patch @@ -0,0 +1,14 @@ +diff -ur mesa-orig/configure.ac mesa-origb/configure.ac +--- mesa-orig/configure.ac 2016-05-25 15:37:44.191643017 +0200 ++++ mesa-origb/configure.ac 2016-05-25 15:42:20.861654709 +0200 +@@ -813,10 +813,6 @@ + dnl pkgconfig files. + test -z "$PTHREAD_LIBS" && PTHREAD_LIBS="-lpthread" + +-PKG_CHECK_MODULES(PTHREADSTUBS, pthread-stubs) +-AC_SUBST(PTHREADSTUBS_CFLAGS) +-AC_SUBST(PTHREADSTUBS_LIBS) +- + dnl SELinux awareness. + AC_ARG_ENABLE([selinux], + [AS_HELP_STRING([--enable-selinux], |