[arch-commits] Commit in mesa/trunk (4 files)
Jan Steffens
heftig at archlinux.org
Sat May 30 14:02:18 UTC 2020
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.landwerlin at 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.landwerlin at intel.com>
-Cc: <mesa-stable at lists.freedesktop.org>
-Tested-by: Tapani Pälli <tapani.palli at intel.com>
-Signed-off-by: Laurent Carlier <lordheavym at 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.landwerlin at 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.landwerlin at intel.com>
-Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/2882
-Fixes: 7557f1605968 ("iris: share buffer managers accross screens")
-Tested-by: Eric Engestrom <eric at engestrom.ch>
-Tested-by: Tapani Pälli <tapani.palli at intel.com>
-Signed-off-by: Laurent Carlier <lordheavym at 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.landwerlin at 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.landwerlin at intel.com>
-Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/2882
-Fixes: 4094558e8643 ("i965: share buffer managers across screens")
-Tested-by: Eric Engestrom <eric at engestrom.ch>
-Tested-by: Tapani Pälli <tapani.palli at intel.com>
-Signed-off-by: Laurent Carlier <lordheavym at 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 <lordheavym at gmail.com>
+# Maintainer: Felix Yan <felixonmars at archlinux.org>
# Maintainer: Jan de Groot <jgc at archlinux.org>
-# Maintainer: Andreas Radke <andyrtr at archlinux.org>
+# Contributor: Andreas Radke <andyrtr at 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.velikov at gmail.com>
'946D09B5E4C9845E63075FF1D961C596A7203456' # Andres Gomez <tanty at 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
More information about the arch-commits
mailing list