OSDN Git Service

nouveau: Add busy() query, determines if BOs can be mapped immediately.
authorYounes Manton <younes.m@gmail.com>
Thu, 11 Dec 2008 22:55:16 +0000 (17:55 -0500)
committerYounes Manton <younes.m@gmail.com>
Sat, 10 Jan 2009 18:52:05 +0000 (13:52 -0500)
src/gallium/winsys/drm/nouveau/nouveau_bo.c
src/gallium/winsys/drm/nouveau/nouveau_drmif.h

index b594299..76b98be 100644 (file)
@@ -273,6 +273,40 @@ nouveau_bo_del(struct nouveau_bo **bo)
 }
 
 int
+nouveau_bo_busy(struct nouveau_bo *bo, uint32_t flags)
+{
+       struct nouveau_bo_priv *nvbo = nouveau_bo(bo);
+       struct nouveau_fence *fence;
+
+       if (!nvbo)
+               return -EINVAL;
+
+       /* If the buffer is pending it must be busy, unless
+        * both are RD, in which case we can allow access */
+       if (nvbo->pending) {
+               if ((nvbo->pending->flags & NOUVEAU_BO_RDWR) == NOUVEAU_BO_RD &&
+                   (flags & NOUVEAU_BO_RDWR) == NOUVEAU_BO_RD)
+                       return 0;
+               else
+                       return 1;
+       }
+
+       if (flags & NOUVEAU_BO_WR)
+               fence = nvbo->fence;
+       else
+               fence = nvbo->wr_fence;
+
+       /* If the buffer is not pending and doesn't have a fence
+        * that conflicts with our flags then it can't be busy
+        */
+       if (!fence)
+               return 0;
+       else
+               /* If the fence is signalled the buffer is not busy, else is busy */
+               return !nouveau_fence(fence)->signalled;
+}
+
+int
 nouveau_bo_map(struct nouveau_bo *bo, uint32_t flags)
 {
        struct nouveau_bo_priv *nvbo = nouveau_bo(bo);
index dcd6a5e..5f72800 100644 (file)
@@ -287,6 +287,9 @@ extern void
 nouveau_bo_del(struct nouveau_bo **);
 
 extern int
+nouveau_bo_busy(struct nouveau_bo *bo, uint32_t flags);
+
+extern int
 nouveau_bo_map(struct nouveau_bo *, uint32_t flags);
 
 extern void