From: Christopher James Halse Rogers
---
src/gallium/targets/r300/common/drm_target.c | 27 +-
src/gallium/targets/r600/common/drm_target.c | 16
src/gallium/targets/radeonsi/common/drm_target.c | 16
src/gallium/winsys/radeon/drm/radeon_drm_bo.c| 107 ++-
4 files changed, 141 insertions(+), 25 deletions(-)
diff --git a/src/gallium/targets/r300/common/drm_target.c
b/src/gallium/targets/r300/common/drm_target.c
index 2c10bbd..9b48446 100644
--- a/src/gallium/targets/r300/common/drm_target.c
+++ b/src/gallium/targets/r300/common/drm_target.c
@@ -51,4 +51,29 @@ create_screen(int fd)
return sws->screen;
}
-DRM_DRIVER_DESCRIPTOR("r300", "radeon", create_screen, NULL)
+/* Technically this is only true for kernels >= 3.12, which
+ * support lseek on dma-buf fds.
+ *
+ * We could check for this in create_screen and return the correct
+ * value, but for now just return true in all cases.
+ *
+ * createImageFromFds fails gracefully on kernel < 3.12, so this
+ * shouldn't be a huge problem.
+ */
+static const struct drm_conf_ret share_fd_ret = {
+ .type = DRM_CONF_BOOL,
+ .val.val_int = true,
+};
+
+static const struct drm_conf_ret *drm_configuration(enum drm_conf conf)
+{
+ switch (conf) {
+ case DRM_CONF_SHARE_FD:
+ return &share_fd_ret;
+ default:
+ break;
+ }
+ return NULL;
+}
+
+DRM_DRIVER_DESCRIPTOR("r300", "radeon", create_screen, drm_configuration)
diff --git a/src/gallium/targets/r600/common/drm_target.c
b/src/gallium/targets/r600/common/drm_target.c
index 28004ac..ab1eec6 100644
--- a/src/gallium/targets/r600/common/drm_target.c
+++ b/src/gallium/targets/r600/common/drm_target.c
@@ -55,11 +55,27 @@ static const struct drm_conf_ret throttle_ret = {
.val.val_int = 2,
};
+/* Technically this is only true for kernels >= 3.12, which
+ * support lseek on dma-buf fds.
+ *
+ * We could check for this in create_screen and return the correct
+ * value, but for now just return true in all cases.
+ *
+ * createImageFromFds fails gracefully on kernel < 3.12, so this
+ * shouldn't be a huge problem.
+ */
+static const struct drm_conf_ret share_fd_ret = {
+ .type = DRM_CONF_BOOL,
+ .val.val_int = true,
+};
+
static const struct drm_conf_ret *drm_configuration(enum drm_conf conf)
{
switch (conf) {
case DRM_CONF_THROTTLE:
return &throttle_ret;
+ case DRM_CONF_SHARE_FD:
+ return &share_fd_ret;
default:
break;
}
diff --git a/src/gallium/targets/radeonsi/common/drm_target.c
b/src/gallium/targets/radeonsi/common/drm_target.c
index 9eef368..08ff47d 100644
--- a/src/gallium/targets/radeonsi/common/drm_target.c
+++ b/src/gallium/targets/radeonsi/common/drm_target.c
@@ -55,11 +55,27 @@ static const struct drm_conf_ret throttle_ret = {
.val.val_int = 2,
};
+/* Technically this is only true for kernels >= 3.12, which
+ * support lseek on dma-buf fds.
+ *
+ * We could check for this in create_screen and return the correct
+ * value, but for now just return true in all cases.
+ *
+ * createImageFromFds fails gracefully on kernel < 3.12, so this
+ * shouldn't be a huge problem.
+ */
+static const struct drm_conf_ret share_fd_ret = {
+ .type = DRM_CONF_BOOL,
+ .val.val_int = true,
+};
+
static const struct drm_conf_ret *drm_configuration(enum drm_conf conf)
{
switch (conf) {
case DRM_CONF_THROTTLE:
return &throttle_ret;
+ case DRM_CONF_SHARE_FD:
+ return &share_fd_ret;
default:
break;
}
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c
b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c
index 5ddbc00..91e37e6 100644
--- a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c
@@ -40,6 +40,7 @@
#include
#include
#include
+#include
/*
* this are copy from radeon_drm, once an updated libdrm is released
@@ -116,6 +117,8 @@ struct radeon_bomgr {
/* List of buffer GEM names. Protected by bo_handles_mutex. */
struct util_hash_table *bo_names;
+/* List of buffer handles. Protectded by bo_handles_mutex. */
+struct util_hash_table *bo_handles;
pipe_mutex bo_handles_mutex;
pipe_mutex bo_va_mutex;
@@ -370,12 +373,13 @@ static void radeon_bo_destroy(struct pb_buffer *_buf)
memset(&args, 0, sizeof(args));
+pipe_mutex_lock(bo->mgr->bo_handles_mutex);
+util_hash_table_remove(bo->mgr->bo_handles, (void*)(uintptr_t)bo->handle);
if (bo->name) {
-pipe_mutex_lock(bo->mgr->bo_handles_mutex);
util_hash_table_remove(bo->mgr->bo_names,
(void*)(uintptr_t)bo->name);
-pipe_mutex_unlock(bo->mgr->bo_handles_mutex);
}
+pipe_mutex_unlock(bo->mgr->bo_handles_mutex);
if (bo->ptr)
os_munmap(bo->ptr, bo->base.size);
@@ -661,6 +665,7 @@ static void radeon_bomgr_destroy(struct pb_manager *_mgr)
{
struct radeon_bomgr *mgr = radeon_bomgr(_mgr);
util_hash_table_destroy(mgr->bo_names);
+