Signed-off-by: Pauli Nieminen <suok...@gmail.com>
---
 libdrm/radeon/radeon_bo.h     |   13 +++++++++++++
 libdrm/radeon/radeon_bo_gem.c |   18 ++++++++++++++++++
 shared-core/radeon_drm.h      |    4 +++-
 3 files changed, 34 insertions(+), 1 deletions(-)

diff --git a/libdrm/radeon/radeon_bo.h b/libdrm/radeon/radeon_bo.h
index cd881c5..a6220d7 100644
--- a/libdrm/radeon/radeon_bo.h
+++ b/libdrm/radeon/radeon_bo.h
@@ -73,6 +73,7 @@ struct radeon_bo_funcs {
                          uint32_t pitch);
     int (*bo_get_tiling)(struct radeon_bo *bo, uint32_t *tiling_flags,
                          uint32_t *pitch);
+    int (*bo_is_busy)(struct radeon_bo *bo, int *busy, int *domain);
 };
 
 struct radeon_bo_manager {
@@ -166,6 +167,16 @@ static inline int _radeon_bo_wait(struct radeon_bo *bo,
     return bo->bom->funcs->bo_wait(bo);
 }
 
+static inline int _radeon_bo_is_busy(struct radeon_bo *bo,
+                                     int *busy,
+                                    int *domain,
+                                     const char *file,
+                                     const char *func,
+                                     int line)
+{
+    return bo->bom->funcs->bo_is_busy(bo, busy, domain);
+}
+
 static inline int radeon_bo_set_tiling(struct radeon_bo *bo,
                                       uint32_t tiling_flags, uint32_t pitch)
 {
@@ -199,5 +210,7 @@ static inline int radeon_bo_is_static(struct radeon_bo *bo)
     _radeon_bo_debug(bo, opcode, __FILE__, __FUNCTION__, __LINE__)
 #define radeon_bo_wait(bo) \
     _radeon_bo_wait(bo, __FILE__, __func__, __LINE__)
+#define radeon_bo_is_busy(bo, busy, domain) \
+    _radeon_bo_is_busy(bo, busy, domain, __FILE__, __func__, __LINE__)
 
 #endif
diff --git a/libdrm/radeon/radeon_bo_gem.c b/libdrm/radeon/radeon_bo_gem.c
index 0ffcf13..7a4a393 100644
--- a/libdrm/radeon/radeon_bo_gem.c
+++ b/libdrm/radeon/radeon_bo_gem.c
@@ -209,6 +209,23 @@ static int bo_wait(struct radeon_bo *bo)
     return ret;
 }
 
+static int bo_is_busy(struct radeon_bo *bo, int *busy, int *domain)
+{
+    struct drm_radeon_gem_busy args;
+    int ret;
+
+    args.handle = bo->handle;
+    args.domain = 0;
+
+    ret = drmCommandWriteRead(bo->bom->fd, DRM_RADEON_GEM_BUSY,
+           &args, sizeof(args));
+
+    *busy = ret == -EBUSY;
+    *domain = args.domain;
+
+    return ret;
+}
+
 static int bo_set_tiling(struct radeon_bo *bo, uint32_t tiling_flags,
                                 uint32_t pitch)
 {
@@ -257,6 +274,7 @@ static struct radeon_bo_funcs bo_gem_funcs = {
     NULL,
     bo_set_tiling,
     bo_get_tiling,
+    bo_is_busy,
 };
 
 struct radeon_bo_manager *radeon_bo_manager_gem_ctor(int fd)
diff --git a/shared-core/radeon_drm.h b/shared-core/radeon_drm.h
index 3745ac5..6659de7 100644
--- a/shared-core/radeon_drm.h
+++ b/shared-core/radeon_drm.h
@@ -505,6 +505,7 @@ typedef struct {
 #define DRM_RADEON_INFO                        0x27
 #define DRM_RADEON_GEM_SET_TILING      0x28
 #define DRM_RADEON_GEM_GET_TILING      0x29
+#define DRM_RADEON_GEM_BUSY            0x2a
 
 #define DRM_IOCTL_RADEON_CP_INIT    DRM_IOW( DRM_COMMAND_BASE + 
DRM_RADEON_CP_INIT, drm_radeon_init_t)
 #define DRM_IOCTL_RADEON_CP_START   DRM_IO(  DRM_COMMAND_BASE + 
DRM_RADEON_CP_START)
@@ -545,6 +546,7 @@ typedef struct {
 #define DRM_IOCTL_RADEON_INFO          DRM_IOWR(DRM_COMMAND_BASE + 
DRM_RADEON_INFO, struct drm_radeon_info)
 #define DRM_IOCTL_RADEON_SET_TILING    DRM_IOWR(DRM_COMMAND_BASE + 
DRM_RADEON_GEM_SET_TILING, struct drm_radeon_gem_set_tiling)
 #define DRM_IOCTL_RADEON_GET_TILING    DRM_IOWR(DRM_COMMAND_BASE + 
DRM_RADEON_GEM_GET_TILING, struct drm_radeon_gem_get_tiling)
+#define DRM_IOCTL_RADEON_GEM_BUSY  DRM_IOWR(DRM_COMMAND_BASE + 
DRM_RADEON_GEM_BUSY, struct drm_radeon_gem_busy)
 
 typedef struct drm_radeon_init {
        enum {
@@ -835,7 +837,7 @@ struct drm_radeon_gem_wait_idle {
 
 struct drm_radeon_gem_busy {
        uint32_t        handle;
-       uint32_t        busy;
+       uint32_t        domain;
 };
 
 struct drm_radeon_gem_pread {
-- 
1.6.3.3


------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to