Re: [Mesa-dev] [PATCH 8/9] gallium/radeon: Implement hooks for DRI Image 7

2013-11-22 Thread Axel Davy

+size = lseek(whandle->handle, SEEK_END, 0);
+/*
+ * Could check errno to determine whether the kernel is new enough, but
+ * it doesn't really matter why this failed, just that it failed.
+ */
+if (size == (off_t)-1) {
+FREE(bo);
+goto fail;
+}
+lseek(whandle->handle, SEEK_SET, 0);



The lseek arguments are not in the right order



+args.handle = bo->handle;
+r = drmCommandWriteRead(bo->rws->fd, DRM_RADEON_GEM_BUSY, &args, 
sizeof(args));
+if (r) {
+fprintf(stderr, "radeon: Failed to find initial domain for imported 
bo\n");
+radeon_bo_destroy(&bo->base);
+return NULL;
+}


the ioctl should be called again until it doesn't return -EBUSY.


Axel Davy

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 8/9] gallium/radeon: Implement hooks for DRI Image 7

2013-11-20 Thread christopher . halse . rogers
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);
+