Date: Saturday, May 30, 2020 @ 14:02:18 Author: heftig Revision: 387900
20.1.0-4: drop patches; cause issues with Xorg Modified: mesa/trunk/PKGBUILD Deleted: mesa/trunk/0001-iris-fix-BO-destruction-in-error-path.patch mesa/trunk/0002-iris-fix-export-of-GEM-handles.patch mesa/trunk/0003-i965-fix-export-of-GEM-handles.patch --------------------------------------------------+ 0001-iris-fix-BO-destruction-in-error-path.patch | 41 -- 0002-iris-fix-export-of-GEM-handles.patch | 364 --------------------- 0003-i965-fix-export-of-GEM-handles.patch | 343 ------------------- PKGBUILD | 36 -- 4 files changed, 14 insertions(+), 770 deletions(-) Deleted: 0001-iris-fix-BO-destruction-in-error-path.patch =================================================================== --- 0001-iris-fix-BO-destruction-in-error-path.patch 2020-05-30 13:57:22 UTC (rev 387899) +++ 0001-iris-fix-BO-destruction-in-error-path.patch 2020-05-30 14:02:18 UTC (rev 387900) @@ -1,41 +0,0 @@ -From eac7681c13f127d762474a8207399c2eb0c76f30 Mon Sep 17 00:00:00 2001 -From: Lionel Landwerlin <lionel.g.landwer...@intel.com> -Date: Sat, 2 May 2020 22:43:22 +0300 -Subject: [PATCH 1/3] iris: fix BO destruction in error path -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Lionel Landwerlin <lionel.g.landwer...@intel.com> -Cc: <mesa-sta...@lists.freedesktop.org> -Tested-by: Tapani Pälli <tapani.pa...@intel.com> -Signed-off-by: Laurent Carlier <lordhea...@gmail.com> ---- - src/gallium/drivers/iris/iris_bufmgr.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/src/gallium/drivers/iris/iris_bufmgr.c b/src/gallium/drivers/iris/iris_bufmgr.c -index c8e6d0c654b..9064647d0e5 100644 ---- a/src/gallium/drivers/iris/iris_bufmgr.c -+++ b/src/gallium/drivers/iris/iris_bufmgr.c -@@ -589,6 +589,7 @@ iris_bo_create_userptr(struct iris_bufmgr *bufmgr, const char *name, - void *ptr, size_t size, - enum iris_memory_zone memzone) - { -+ struct drm_gem_close close = { 0, }; - struct iris_bo *bo; - - bo = bo_calloc(); -@@ -634,7 +635,8 @@ iris_bo_create_userptr(struct iris_bufmgr *bufmgr, const char *name, - return bo; - - err_close: -- gen_ioctl(bufmgr->fd, DRM_IOCTL_GEM_CLOSE, &bo->gem_handle); -+ close.handle = bo->gem_handle; -+ gen_ioctl(bufmgr->fd, DRM_IOCTL_GEM_CLOSE, &close); - err_free: - free(bo); - return NULL; --- -2.26.2 - Deleted: 0002-iris-fix-export-of-GEM-handles.patch =================================================================== --- 0002-iris-fix-export-of-GEM-handles.patch 2020-05-30 13:57:22 UTC (rev 387899) +++ 0002-iris-fix-export-of-GEM-handles.patch 2020-05-30 14:02:18 UTC (rev 387900) @@ -1,364 +0,0 @@ -From e01e146e35681dbdc68d70a2118b71a78ef67e6a Mon Sep 17 00:00:00 2001 -From: Lionel Landwerlin <lionel.g.landwer...@intel.com> -Date: Sat, 2 May 2020 16:46:47 +0300 -Subject: [PATCH 2/3] iris: fix export of GEM handles -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -We reuse DRM file descriptors internally. Therefore when we export a -GEM handle we must do so in the file descriptor used externally. - -v2: Don't bother checking fd equals, they're always different - Fix dmabuf leak - Fix GEM handle leaks by tracking exported handles - -v3: Check os_same_file_description error (Michel) - Don't create multiple exports for a given GEM table - -v4: Add WARN_ONCE (Ken) - Rename external_fd to winsys_fd - -v5: Remove export lock in favor of bufmgr's - -Signed-off-by: Lionel Landwerlin <lionel.g.landwer...@intel.com> -Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/2882 -Fixes: 7557f1605968 ("iris: share buffer managers accross screens") -Tested-by: Eric Engestrom <e...@engestrom.ch> -Tested-by: Tapani Pälli <tapani.pa...@intel.com> -Signed-off-by: Laurent Carlier <lordhea...@gmail.com> ---- - src/gallium/drivers/iris/iris_bufmgr.c | 108 ++++++++++++++++++++++- - src/gallium/drivers/iris/iris_bufmgr.h | 16 ++++ - src/gallium/drivers/iris/iris_resource.c | 33 +++++-- - src/gallium/drivers/iris/iris_screen.c | 2 + - src/gallium/drivers/iris/iris_screen.h | 8 +- - 5 files changed, 157 insertions(+), 10 deletions(-) - -diff --git a/src/gallium/drivers/iris/iris_bufmgr.c b/src/gallium/drivers/iris/iris_bufmgr.c -index 9064647d0e5..3c39769b9cb 100644 ---- a/src/gallium/drivers/iris/iris_bufmgr.c -+++ b/src/gallium/drivers/iris/iris_bufmgr.c -@@ -63,6 +63,7 @@ - #include "util/macros.h" - #include "util/hash_table.h" - #include "util/list.h" -+#include "util/os_file.h" - #include "util/u_dynarray.h" - #include "util/vma.h" - #include "iris_bufmgr.h" -@@ -91,6 +92,17 @@ - - #define PAGE_SIZE 4096 - -+#define WARN_ONCE(cond, fmt...) do { \ -+ if (unlikely(cond)) { \ -+ static bool _warned = false; \ -+ if (!_warned) { \ -+ fprintf(stderr, "WARNING: "); \ -+ fprintf(stderr, fmt); \ -+ _warned = true; \ -+ } \ -+ } \ -+} while (0) -+ - #define FILE_DEBUG_FLAG DEBUG_BUFMGR - - static inline int -@@ -126,6 +138,16 @@ struct bo_cache_bucket { - uint64_t size; - }; - -+struct bo_export { -+ /** File descriptor associated with a handle export. */ -+ int drm_fd; -+ -+ /** GEM handle in drm_fd */ -+ uint32_t gem_handle; -+ -+ struct list_head link; -+}; -+ - struct iris_bufmgr { - /** - * List into the list of bufmgr. -@@ -349,9 +371,13 @@ static struct iris_bo * - bo_calloc(void) - { - struct iris_bo *bo = calloc(1, sizeof(*bo)); -- if (bo) { -- bo->hash = _mesa_hash_pointer(bo); -- } -+ if (!bo) -+ return NULL; -+ -+ list_inithead(&bo->exports); -+ -+ bo->hash = _mesa_hash_pointer(bo); -+ - return bo; - } - -@@ -707,6 +733,7 @@ iris_bo_gem_create_from_name(struct iris_bufmgr *bufmgr, - - bo->tiling_mode = get_tiling.tiling_mode; - bo->swizzle_mode = get_tiling.swizzle_mode; -+ - /* XXX stride is unknown */ - DBG("bo_create_from_handle: %d (%s)\n", handle, bo->name); - -@@ -735,6 +762,16 @@ bo_close(struct iris_bo *bo) - - entry = _mesa_hash_table_search(bufmgr->handle_table, &bo->gem_handle); - _mesa_hash_table_remove(bufmgr->handle_table, entry); -+ -+ list_for_each_entry_safe(struct bo_export, export, &bo->exports, link) { -+ struct drm_gem_close close = { .handle = export->gem_handle }; -+ gen_ioctl(export->drm_fd, DRM_IOCTL_GEM_CLOSE, &close); -+ -+ list_del(&export->link); -+ free(export); -+ } -+ } else { -+ assert(list_is_empty(&bo->exports)); - } - - /* Close this object */ -@@ -1490,6 +1527,71 @@ iris_bo_flink(struct iris_bo *bo, uint32_t *name) - return 0; - } - -+int -+iris_bo_export_gem_handle_for_device(struct iris_bo *bo, int drm_fd, -+ uint32_t *out_handle) -+{ -+ /* Only add the new GEM handle to the list of export if it belongs to a -+ * different GEM device. Otherwise we might close the same buffer multiple -+ * times. -+ */ -+ struct iris_bufmgr *bufmgr = bo->bufmgr; -+ int ret = os_same_file_description(drm_fd, bufmgr->fd); -+ WARN_ONCE(ret < 0, -+ "Kernel has no file descriptor comparison support: %s\n", -+ strerror(errno)); -+ if (ret == 0) { -+ *out_handle = iris_bo_export_gem_handle(bo); -+ return 0; -+ } -+ -+ struct bo_export *export = calloc(1, sizeof(*export)); -+ if (!export) -+ return -ENOMEM; -+ -+ export->drm_fd = drm_fd; -+ -+ int dmabuf_fd = -1; -+ int err = iris_bo_export_dmabuf(bo, &dmabuf_fd); -+ if (err) { -+ free(export); -+ return err; -+ } -+ -+ mtx_lock(&bufmgr->lock); -+ err = drmPrimeFDToHandle(drm_fd, dmabuf_fd, &export->gem_handle); -+ close(dmabuf_fd); -+ if (err) { -+ mtx_unlock(&bufmgr->lock); -+ free(export); -+ return err; -+ } -+ -+ iris_bo_make_external_locked(bo); -+ -+ bool found = false; -+ list_for_each_entry(struct bo_export, iter, &bo->exports, link) { -+ if (iter->drm_fd != drm_fd) -+ continue; -+ /* Here we assume that for a given DRM fd, we'll always get back the -+ * same GEM handle for a given buffer. -+ */ -+ assert(iter->gem_handle == export->gem_handle); -+ free(export); -+ export = iter; -+ found = true; -+ break; -+ } -+ if (!found) -+ list_addtail(&export->link, &bo->exports); -+ -+ mtx_unlock(&bufmgr->lock); -+ -+ *out_handle = export->gem_handle; -+ -+ return 0; -+} -+ - static void - add_bucket(struct iris_bufmgr *bufmgr, int size) - { -diff --git a/src/gallium/drivers/iris/iris_bufmgr.h b/src/gallium/drivers/iris/iris_bufmgr.h -index d7edda23aca..084de82c375 100644 ---- a/src/gallium/drivers/iris/iris_bufmgr.h -+++ b/src/gallium/drivers/iris/iris_bufmgr.h -@@ -28,6 +28,7 @@ - #include <stdint.h> - #include <stdio.h> - #include <sys/types.h> -+#include "c11/threads.h" - #include "util/macros.h" - #include "util/u_atomic.h" - #include "util/list.h" -@@ -166,6 +167,9 @@ struct iris_bo { - /** BO cache list */ - struct list_head head; - -+ /** List of GEM handle exports of this buffer (bo_export) */ -+ struct list_head exports; -+ - /** - * Boolean of whether the GPU is definitely not accessing the buffer. - * -@@ -365,6 +369,18 @@ int iris_bo_export_dmabuf(struct iris_bo *bo, int *prime_fd); - struct iris_bo *iris_bo_import_dmabuf(struct iris_bufmgr *bufmgr, int prime_fd, - uint32_t tiling, uint32_t stride); - -+/** -+ * Exports a bo as a GEM handle into a given DRM file descriptor -+ * \param bo Buffer to export -+ * \param drm_fd File descriptor where the new handle is created -+ * \param out_handle Pointer to store the new handle -+ * -+ * Returns 0 if the buffer was successfully exported, a non zero error code -+ * otherwise. -+ */ -+int iris_bo_export_gem_handle_for_device(struct iris_bo *bo, int drm_fd, -+ uint32_t *out_handle); -+ - uint32_t iris_bo_export_gem_handle(struct iris_bo *bo); - - int iris_reg_read(struct iris_bufmgr *bufmgr, uint32_t offset, uint64_t *out); -diff --git a/src/gallium/drivers/iris/iris_resource.c b/src/gallium/drivers/iris/iris_resource.c -index 3d2805f3548..0f71c5a8593 100644 ---- a/src/gallium/drivers/iris/iris_resource.c -+++ b/src/gallium/drivers/iris/iris_resource.c -@@ -1139,7 +1139,7 @@ iris_resource_disable_aux_on_first_query(struct pipe_resource *resource, - } - - static bool --iris_resource_get_param(struct pipe_screen *screen, -+iris_resource_get_param(struct pipe_screen *pscreen, - struct pipe_context *context, - struct pipe_resource *resource, - unsigned plane, -@@ -1148,6 +1148,7 @@ iris_resource_get_param(struct pipe_screen *screen, - unsigned handle_usage, - uint64_t *value) - { -+ struct iris_screen *screen = (struct iris_screen *)pscreen; - struct iris_resource *res = (struct iris_resource *)resource; - bool mod_with_aux = - res->mod_info && res->mod_info->aux_usage != ISL_AUX_USAGE_NONE; -@@ -1156,7 +1157,7 @@ iris_resource_get_param(struct pipe_screen *screen, - unsigned handle; - - if (iris_resource_unfinished_aux_import(res)) -- iris_resource_finish_aux_import(screen, res); -+ iris_resource_finish_aux_import(pscreen, res); - - struct iris_bo *bo = wants_aux ? res->aux.bo : res->bo; - -@@ -1188,9 +1189,19 @@ iris_resource_get_param(struct pipe_screen *screen, - if (result) - *value = handle; - return result; -- case PIPE_RESOURCE_PARAM_HANDLE_TYPE_KMS: -- *value = iris_bo_export_gem_handle(bo); -+ case PIPE_RESOURCE_PARAM_HANDLE_TYPE_KMS: { -+ /* Because we share the same drm file across multiple iris_screen, when -+ * we export a GEM handle we must make sure it is valid in the DRM file -+ * descriptor the caller is using (this is the FD given at screen -+ * creation). -+ */ -+ uint32_t handle; -+ if (iris_bo_export_gem_handle_for_device(bo, screen->winsys_fd, &handle)) -+ return false; -+ *value = handle; - return true; -+ } -+ - case PIPE_RESOURCE_PARAM_HANDLE_TYPE_FD: - result = iris_bo_export_dmabuf(bo, (int *) &handle) == 0; - if (result) -@@ -1208,6 +1219,7 @@ iris_resource_get_handle(struct pipe_screen *pscreen, - struct winsys_handle *whandle, - unsigned usage) - { -+ struct iris_screen *screen = (struct iris_screen *) pscreen; - struct iris_resource *res = (struct iris_resource *)resource; - bool mod_with_aux = - res->mod_info && res->mod_info->aux_usage != ISL_AUX_USAGE_NONE; -@@ -1245,9 +1257,18 @@ iris_resource_get_handle(struct pipe_screen *pscreen, - switch (whandle->type) { - case WINSYS_HANDLE_TYPE_SHARED: - return iris_bo_flink(bo, &whandle->handle) == 0; -- case WINSYS_HANDLE_TYPE_KMS: -- whandle->handle = iris_bo_export_gem_handle(bo); -+ case WINSYS_HANDLE_TYPE_KMS: { -+ /* Because we share the same drm file across multiple iris_screen, when -+ * we export a GEM handle we must make sure it is valid in the DRM file -+ * descriptor the caller is using (this is the FD given at screen -+ * creation). -+ */ -+ uint32_t handle; -+ if (iris_bo_export_gem_handle_for_device(bo, screen->winsys_fd, &handle)) -+ return false; -+ whandle->handle = handle; - return true; -+ } - case WINSYS_HANDLE_TYPE_FD: - return iris_bo_export_dmabuf(bo, (int *) &whandle->handle) == 0; - } -diff --git a/src/gallium/drivers/iris/iris_screen.c b/src/gallium/drivers/iris/iris_screen.c -index 94ee60eb016..3e2761aecc3 100644 ---- a/src/gallium/drivers/iris/iris_screen.c -+++ b/src/gallium/drivers/iris/iris_screen.c -@@ -559,6 +559,7 @@ iris_screen_destroy(struct iris_screen *screen) - u_transfer_helper_destroy(screen->base.transfer_helper); - iris_bufmgr_unref(screen->bufmgr); - disk_cache_destroy(screen->disk_cache); -+ close(screen->winsys_fd); - ralloc_free(screen); - } - -@@ -717,6 +718,7 @@ iris_screen_create(int fd, const struct pipe_screen_config *config) - return NULL; - - screen->fd = iris_bufmgr_get_fd(screen->bufmgr); -+ screen->winsys_fd = fd; - - screen->aperture_bytes = get_aperture_size(fd); - -diff --git a/src/gallium/drivers/iris/iris_screen.h b/src/gallium/drivers/iris/iris_screen.h -index 5ec58f6c216..afae2037b9f 100644 ---- a/src/gallium/drivers/iris/iris_screen.h -+++ b/src/gallium/drivers/iris/iris_screen.h -@@ -144,9 +144,15 @@ struct iris_screen { - /** Global slab allocator for iris_transfer_map objects */ - struct slab_parent_pool transfer_pool; - -- /** drm device file descriptor, on shared with bufmgr, do not close. */ -+ /** drm device file descriptor, shared with bufmgr, do not close. */ - int fd; - -+ /** -+ * drm device file descriptor to used for window system integration, owned -+ * by iris_screen, can be a different DRM instance than fd. -+ */ -+ int winsys_fd; -+ - /** PCI ID for our GPU device */ - int pci_id; - --- -2.26.2 - Deleted: 0003-i965-fix-export-of-GEM-handles.patch =================================================================== --- 0003-i965-fix-export-of-GEM-handles.patch 2020-05-30 13:57:22 UTC (rev 387899) +++ 0003-i965-fix-export-of-GEM-handles.patch 2020-05-30 14:02:18 UTC (rev 387900) @@ -1,343 +0,0 @@ -From e45e6fb29a008006af354f317bd82da2aed8ccf6 Mon Sep 17 00:00:00 2001 -From: Lionel Landwerlin <lionel.g.landwer...@intel.com> -Date: Sat, 2 May 2020 16:59:19 +0300 -Subject: [PATCH 3/3] i965: fix export of GEM handles -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -We reuse DRM file descriptors internally. Therefore when we export a -GEM handle we must do so in the file descriptor used externally. - -v2: Fix dmabuf leak - Fix GEM handle leaks by tracking exported handles - -v3: Check os_same_file_description error (Michel) - Don't create multiple exports for a given GEM table - -v4: Add WARN_ONCE - -Signed-off-by: Lionel Landwerlin <lionel.g.landwer...@intel.com> -Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/2882 -Fixes: 4094558e8643 ("i965: share buffer managers across screens") -Tested-by: Eric Engestrom <e...@engestrom.ch> -Tested-by: Tapani Pälli <tapani.pa...@intel.com> -Signed-off-by: Laurent Carlier <lordhea...@gmail.com> ---- - src/mesa/drivers/dri/i965/brw_bufmgr.c | 122 +++++++++++++++++- - src/mesa/drivers/dri/i965/brw_bufmgr.h | 20 +++ - src/mesa/drivers/dri/i965/intel_batchbuffer.c | 6 + - src/mesa/drivers/dri/i965/intel_screen.c | 11 +- - 4 files changed, 154 insertions(+), 5 deletions(-) - -diff --git a/src/mesa/drivers/dri/i965/brw_bufmgr.c b/src/mesa/drivers/dri/i965/brw_bufmgr.c -index 9b706c42e38..ce904727674 100644 ---- a/src/mesa/drivers/dri/i965/brw_bufmgr.c -+++ b/src/mesa/drivers/dri/i965/brw_bufmgr.c -@@ -58,6 +58,7 @@ - #include "util/macros.h" - #include "util/hash_table.h" - #include "util/list.h" -+#include "util/os_file.h" - #include "util/u_dynarray.h" - #include "util/vma.h" - #include "brw_bufmgr.h" -@@ -74,6 +75,20 @@ - #define VG(x) - #endif - -+/* Bufmgr is not aware of brw_context. */ -+#undef WARN_ONCE -+#define WARN_ONCE(cond, fmt...) do { \ -+ if (unlikely(cond)) { \ -+ static bool _warned = false; \ -+ if (!_warned) { \ -+ fprintf(stderr, "WARNING: "); \ -+ fprintf(stderr, fmt); \ -+ _warned = true; \ -+ } \ -+ } \ -+} while (0) -+ -+ - /* VALGRIND_FREELIKE_BLOCK unfortunately does not actually undo the earlier - * VALGRIND_MALLOCLIKE_BLOCK but instead leaves vg convinced the memory is - * leaked. All because it does not call VG(cli_free) from its -@@ -135,6 +150,16 @@ struct bo_cache_bucket { - struct util_dynarray vma_list[BRW_MEMZONE_COUNT]; - }; - -+struct bo_export { -+ /** File descriptor associated with a handle export. */ -+ int drm_fd; -+ -+ /** GEM handle in drm_fd */ -+ uint32_t gem_handle; -+ -+ struct list_head link; -+}; -+ - struct brw_bufmgr { - uint32_t refcount; - -@@ -158,6 +183,7 @@ struct brw_bufmgr { - bool has_mmap_wc:1; - bool has_mmap_offset:1; - bool bo_reuse:1; -+ bool file_cmp_failed:1; - - uint64_t initial_kflags; - }; -@@ -484,6 +510,18 @@ brw_bo_cache_purge_bucket(struct brw_bufmgr *bufmgr, - } - } - -+static struct brw_bo * -+bo_calloc(void) -+{ -+ struct brw_bo *bo = calloc(1, sizeof(*bo)); -+ if (!bo) -+ return NULL; -+ -+ list_inithead(&bo->exports); -+ -+ return bo; -+} -+ - static struct brw_bo * - bo_alloc_internal(struct brw_bufmgr *bufmgr, - const char *name, -@@ -557,6 +595,7 @@ retry: - } - - if (alloc_from_cache) { -+ assert(list_is_empty(&bo->exports)); - if (!brw_bo_madvise(bo, I915_MADV_WILLNEED)) { - bo_free(bo); - brw_bo_cache_purge_bucket(bufmgr, bucket); -@@ -589,7 +628,7 @@ retry: - bo->gtt_offset = 0ull; - } - } else { -- bo = calloc(1, sizeof(*bo)); -+ bo = bo_calloc(); - if (!bo) - goto err; - -@@ -760,11 +799,12 @@ brw_bo_gem_create_from_name(struct brw_bufmgr *bufmgr, - */ - bo = hash_find_bo(bufmgr->handle_table, open_arg.handle); - if (bo) { -+ assert(list_is_empty(&bo->exports)); - brw_bo_reference(bo); - goto out; - } - -- bo = calloc(1, sizeof(*bo)); -+ bo = bo_calloc(); - if (!bo) - goto out; - -@@ -834,6 +874,9 @@ bo_free(struct brw_bo *bo) - - entry = _mesa_hash_table_search(bufmgr->handle_table, &bo->gem_handle); - _mesa_hash_table_remove(bufmgr->handle_table, entry); -+ -+ } else { -+ assert(list_is_empty(&bo->exports)); - } - - /* Close this object */ -@@ -883,6 +926,14 @@ bo_unreference_final(struct brw_bo *bo, time_t time) - - DBG("bo_unreference final: %d (%s)\n", bo->gem_handle, bo->name); - -+ list_for_each_entry_safe(struct bo_export, export, &bo->exports, link) { -+ struct drm_gem_close close = { .handle = export->gem_handle }; -+ gen_ioctl(export->drm_fd, DRM_IOCTL_GEM_CLOSE, &close); -+ -+ list_del(&export->link); -+ free(export); -+ } -+ - bucket = bucket_for_size(bufmgr, bo->size); - /* Put the buffer into our internal cache for reuse if we can. */ - if (bufmgr->bo_reuse && bo->reusable && bucket != NULL && -@@ -1440,11 +1491,12 @@ brw_bo_gem_create_from_prime_internal(struct brw_bufmgr *bufmgr, int prime_fd, - */ - bo = hash_find_bo(bufmgr->handle_table, handle); - if (bo) { -+ assert(list_is_empty(&bo->exports)); - brw_bo_reference(bo); - goto out; - } - -- bo = calloc(1, sizeof(*bo)); -+ bo = bo_calloc(); - if (!bo) - goto out; - -@@ -1579,6 +1631,70 @@ brw_bo_flink(struct brw_bo *bo, uint32_t *name) - return 0; - } - -+int -+brw_bo_export_gem_handle_for_device(struct brw_bo *bo, int drm_fd, -+ uint32_t *out_handle) -+{ -+ struct brw_bufmgr *bufmgr = bo->bufmgr; -+ -+ /* Only add the new GEM handle to the list of export if it belongs to a -+ * different GEM device. Otherwise we might close the same buffer multiple -+ * times. -+ */ -+ int ret = os_same_file_description(drm_fd, bufmgr->fd); -+ WARN_ONCE(ret < 0, -+ "Kernel has no file descriptor comparison support: %s\n", -+ strerror(errno)); -+ if (ret == 0) { -+ *out_handle = brw_bo_export_gem_handle(bo); -+ return 0; -+ } -+ -+ struct bo_export *export = calloc(1, sizeof(*export)); -+ if (!export) -+ return -ENOMEM; -+ -+ export->drm_fd = drm_fd; -+ -+ int dmabuf_fd = -1; -+ int err = brw_bo_gem_export_to_prime(bo, &dmabuf_fd); -+ if (err) { -+ free(export); -+ return err; -+ } -+ -+ mtx_lock(&bufmgr->lock); -+ err = drmPrimeFDToHandle(drm_fd, dmabuf_fd, &export->gem_handle); -+ close(dmabuf_fd); -+ if (err) { -+ mtx_unlock(&bufmgr->lock); -+ free(export); -+ return err; -+ } -+ -+ bool found = false; -+ list_for_each_entry(struct bo_export, iter, &bo->exports, link) { -+ if (iter->drm_fd != drm_fd) -+ continue; -+ /* Here we assume that for a given DRM fd, we'll always get back the -+ * same GEM handle for a given buffer. -+ */ -+ assert(iter->gem_handle == export->gem_handle); -+ free(export); -+ export = iter; -+ found = true; -+ break; -+ } -+ if (!found) -+ list_addtail(&export->link, &bo->exports); -+ -+ mtx_unlock(&bufmgr->lock); -+ -+ *out_handle = export->gem_handle; -+ -+ return 0; -+} -+ - static void - add_bucket(struct brw_bufmgr *bufmgr, int size) - { -diff --git a/src/mesa/drivers/dri/i965/brw_bufmgr.h b/src/mesa/drivers/dri/i965/brw_bufmgr.h -index 499309b5bd3..32346ff8a30 100644 ---- a/src/mesa/drivers/dri/i965/brw_bufmgr.h -+++ b/src/mesa/drivers/dri/i965/brw_bufmgr.h -@@ -39,6 +39,7 @@ - #include <stdio.h> - #include <time.h> - -+#include "c11/threads.h" - #include "util/u_atomic.h" - #include "util/list.h" - -@@ -179,6 +180,13 @@ struct brw_bo { - /** BO cache list */ - struct list_head head; - -+ /** -+ * List of GEM handle exports of this buffer (bo_export). -+ * -+ * Hold bufmgr->lock when using this list. -+ */ -+ struct list_head exports; -+ - /** - * Boolean of whether this buffer can be re-used - */ -@@ -372,6 +380,18 @@ struct brw_bo *brw_bo_gem_create_from_prime_tiled(struct brw_bufmgr *bufmgr, - - uint32_t brw_bo_export_gem_handle(struct brw_bo *bo); - -+/** -+ * Exports a bo as a GEM handle into a given DRM file descriptor -+ * \param bo Buffer to export -+ * \param drm_fd File descriptor where the new handle is created -+ * \param out_handle Pointer to store the new handle -+ * -+ * Returns 0 if the buffer was successfully exported, a non zero error code -+ * otherwise. -+ */ -+int brw_bo_export_gem_handle_for_device(struct brw_bo *bo, int drm_fd, -+ uint32_t *out_handle); -+ - int brw_reg_read(struct brw_bufmgr *bufmgr, uint32_t offset, - uint64_t *result); - -diff --git a/src/mesa/drivers/dri/i965/intel_batchbuffer.c b/src/mesa/drivers/dri/i965/intel_batchbuffer.c -index bfb39c1ea86..eab6bb2bf72 100644 ---- a/src/mesa/drivers/dri/i965/intel_batchbuffer.c -+++ b/src/mesa/drivers/dri/i965/intel_batchbuffer.c -@@ -507,11 +507,17 @@ grow_buffer(struct brw_context *brw, - new_bo->refcount = bo->refcount; - bo->refcount = 1; - -+ assert(list_is_empty(&bo->exports)); -+ assert(list_is_empty(&new_bo->exports)); -+ - struct brw_bo tmp; - memcpy(&tmp, bo, sizeof(struct brw_bo)); - memcpy(bo, new_bo, sizeof(struct brw_bo)); - memcpy(new_bo, &tmp, sizeof(struct brw_bo)); - -+ list_inithead(&bo->exports); -+ list_inithead(&new_bo->exports); -+ - grow->partial_bo = new_bo; /* the one reference of the OLD bo */ - grow->partial_bytes = existing_bytes; - } -diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c -index f2fbe70cada..cfc70ff7303 100644 ---- a/src/mesa/drivers/dri/i965/intel_screen.c -+++ b/src/mesa/drivers/dri/i965/intel_screen.c -@@ -901,9 +901,16 @@ intel_query_image(__DRIimage *image, int attrib, int *value) - case __DRI_IMAGE_ATTRIB_STRIDE: - *value = image->pitch; - return true; -- case __DRI_IMAGE_ATTRIB_HANDLE: -- *value = brw_bo_export_gem_handle(image->bo); -+ case __DRI_IMAGE_ATTRIB_HANDLE: { -+ __DRIscreen *dri_screen = image->screen->driScrnPriv; -+ uint32_t handle; -+ if (brw_bo_export_gem_handle_for_device(image->bo, -+ dri_screen->fd, -+ &handle)) -+ return false; -+ *value = handle; - return true; -+ } - case __DRI_IMAGE_ATTRIB_NAME: - return !brw_bo_flink(image->bo, (uint32_t *) value); - case __DRI_IMAGE_ATTRIB_FORMAT: --- -2.26.2 - Modified: PKGBUILD =================================================================== --- PKGBUILD 2020-05-30 13:57:22 UTC (rev 387899) +++ PKGBUILD 2020-05-30 14:02:18 UTC (rev 387900) @@ -1,28 +1,24 @@ +# Maintainer: Laurent Carlier <lordhea...@gmail.com> +# Maintainer: Felix Yan <felixonm...@archlinux.org> # Maintainer: Jan de Groot <j...@archlinux.org> -# Maintainer: Andreas Radke <andy...@archlinux.org> +# Contributor: Andreas Radke <andy...@archlinux.org> pkgbase=mesa pkgname=('vulkan-mesa-layers' 'opencl-mesa' 'vulkan-intel' 'vulkan-radeon' 'libva-mesa-driver' 'mesa-vdpau' 'mesa') pkgdesc="An open-source implementation of the OpenGL specification" pkgver=20.1.0 -pkgrel=3 +pkgrel=4 arch=('x86_64') makedepends=('python-mako' 'libxml2' 'libx11' 'xorgproto' 'libdrm' 'libxshmfence' 'libxxf86vm' - 'libxdamage' 'libvdpau' 'libva' 'wayland' 'wayland-protocols' 'zstd' - 'elfutils' 'llvm' 'libomxil-bellagio' 'libclc' 'clang' 'libglvnd' 'libunwind' 'lm_sensors' - 'libxrandr' 'valgrind' 'glslang' 'meson') + 'libxdamage' 'libvdpau' 'libva' 'wayland' 'wayland-protocols' 'zstd' 'elfutils' 'llvm' + 'libomxil-bellagio' 'libclc' 'clang' 'libglvnd' 'libunwind' 'lm_sensors' 'libxrandr' + 'valgrind' 'glslang' 'meson') url="https://www.mesa3d.org/" license=('custom') source=(https://mesa.freedesktop.org/archive/mesa-${pkgver}.tar.xz{,.sig} - 0001-iris-fix-BO-destruction-in-error-path.patch - 0002-iris-fix-export-of-GEM-handles.patch - 0003-i965-fix-export-of-GEM-handles.patch LICENSE) sha512sums=('f49230d18febe1bfd7c6282ab95fc244530f5cef56df0f804d8bece8a70bafcb445b8b83df96ad1b4c5af022c4e39a71f19a8f7e47b1fb09ada2b1a1317ff3be' 'SKIP' - '456d1296ac8ce01d2f1e0c9d9cb8fc995d5f5e5de8f56a3487452a131a7ccfa4beaeb3fc693afbf4691e8de90e399d86bb121cd7514a981fe96b4333df980af3' - '7903c26dcb11932f26dcc6ffd2fd2ecd05840141dc2abfcaf404716320927cd40ba472c434a6e4ae9a08fafa7d54bdb26890efd2177634947f134de6d1fb7315' - '9fe91699d00a9eee4de5b1e60dd14e7cde83933d2fff13f09fd24687addc84a3f9a6c512e02587ceabe6a4c459dbd1f452953ab741ac4843526e1504c12cf5d7' 'f9f0d0ccf166fe6cb684478b6f1e1ab1f2850431c06aa041738563eb1808a004e52cdec823c103c9e180f03ffc083e95974d291353f0220fe52ae6d4897fecc7') validpgpkeys=('8703B6700E7EE06D7A39B8D6EDAE37B02CEB490D' # Emil Velikov <emil.l.veli...@gmail.com> '946D09B5E4C9845E63075FF1D961C596A7203456' # Andres Gomez <ta...@igalia.com> @@ -33,11 +29,6 @@ prepare() { cd mesa-$pkgver - - # fix https://gitlab.freedesktop.org/mesa/mesa/-/issues/2882 - patch -Np1 -i ../0001-iris-fix-BO-destruction-in-error-path.patch - patch -Np1 -i ../0002-iris-fix-export-of-GEM-handles.patch - patch -Np1 -i ../0003-i965-fix-export-of-GEM-handles.patch } build() { @@ -77,11 +68,11 @@ meson configure build ninja -C build xmlpool-pot xmlpool-update-po xmlpool-gmo - ninja -C build + meson compile -C build # fake installation to be seperated into packages # outside of fakeroot but mesa doesn't need to chown/mod - DESTDIR="${srcdir}/fakeinstall" ninja -C build install + DESTDIR="${srcdir}/fakeinstall" meson install -C build } _install() { @@ -126,7 +117,7 @@ package_vulkan-intel() { pkgdesc="Intel's Vulkan mesa driver" depends=('wayland' 'libx11' 'libxshmfence' 'libdrm' 'zstd') - optdepends=('vulkan-mesa-layer: a vulkan layer to display information using an overlay') + optdepends=('vulkan-mesa-layers: additional vulkan layers') provides=('vulkan-driver') _install fakeinstall/usr/share/vulkan/icd.d/intel_icd*.json @@ -139,7 +130,7 @@ package_vulkan-radeon() { pkgdesc="Radeon's Vulkan mesa driver" depends=('wayland' 'libx11' 'libxshmfence' 'libelf' 'libdrm' 'zstd' 'llvm-libs') - optdepends=('vulkan-mesa-layer: a vulkan layer to display information using an overlay') + optdepends=('vulkan-mesa-layers: additional vulkan layers') provides=('vulkan-driver') _install fakeinstall/usr/share/vulkan/icd.d/radeon_icd*.json @@ -168,7 +159,8 @@ package_mesa() { depends=('libdrm' 'wayland' 'libxxf86vm' 'libxdamage' 'libxshmfence' 'libelf' - 'libomxil-bellagio' 'libunwind' 'llvm-libs' 'lm_sensors' 'libglvnd') + 'libomxil-bellagio' 'libunwind' 'llvm-libs' 'lm_sensors' 'libglvnd' + 'zstd') optdepends=('opengl-man-pages: for the OpenGL API man pages' 'mesa-vdpau: for accelerated video playback' 'libva-mesa-driver: for accelerated video playback') @@ -201,7 +193,7 @@ # indirect rendering ln -s /usr/lib/libGLX_mesa.so.0 "${pkgdir}/usr/lib/libGLX_indirect.so.0" - + # make sure there are no files left to install find fakeinstall -depth -print0 | xargs -0 rmdir