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 b5942994d94503326ae724d3956dda97b83db85a..76b98bed675a46c4821df90e310db4d56d89d858 100644 (file)
@@ -272,6 +272,40 @@ nouveau_bo_del(struct nouveau_bo **bo)
                nouveau_bo_del_cb(nvbo);
 }
 
+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)
 {
index dcd6a5eb0a492337450eb0ce2034d98075146c3d..5f72800676df2af0f1b11f2942ba010e4ca8b485 100644 (file)
@@ -286,6 +286,9 @@ nouveau_bo_set_status(struct nouveau_bo *, uint32_t flags);
 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);