r300g: handle interaction between UNSYNCHRONIZED and DONTBLOCK flags in bo_map
authorMarek Olšák <maraeo@gmail.com>
Tue, 15 Feb 2011 02:43:57 +0000 (03:43 +0100)
committerMarek Olšák <maraeo@gmail.com>
Tue, 15 Feb 2011 03:00:47 +0000 (04:00 +0100)
The VBO module uses both, but they are somewhat opposite to each other.
In this case, we pick UNSYNCHRONIZED and ignore DONTBLOCK.

src/gallium/winsys/radeon/drm/radeon_drm_bo.c

index 6de1ff7745db611cd776bdfd353fd01f2d23eacd..e3c6195d5f6360b1d55f45e2c6f0d432978a04a8 100644 (file)
@@ -158,30 +158,26 @@ static void *radeon_bo_map_internal(struct pb_buffer *_buf,
     struct radeon_drm_cs *cs = flush_ctx;
     struct drm_radeon_gem_mmap args = {};
     void *ptr;
-    /* prevents a call to radeon_bo_wait if (usage & DONTBLOCK) and
-     * radeon_is_busy returns FALSE. */
-    boolean may_be_busy = TRUE;
-
-    if (flags & PB_USAGE_DONTBLOCK) {
-        if (radeon_bo_is_referenced_by_cs(cs, bo)) {
-            cs->flush_cs(cs->flush_data);
-            return NULL;
-        }
 
-        if (radeon_bo_is_busy((struct r300_winsys_bo*)bo)) {
-            return NULL;
-        }
+    /* If it's not unsynchronized bo_map, flush CS if needed and then wait. */
+    if (!(flags & PB_USAGE_UNSYNCHRONIZED)) {
+        /* DONTBLOCK doesn't make sense with UNSYNCHRONIZED. */
+        if (flags & PB_USAGE_DONTBLOCK) {
+            if (radeon_bo_is_referenced_by_cs(cs, bo)) {
+                cs->flush_cs(cs->flush_data);
+                return NULL;
+            }
 
-        may_be_busy = FALSE;
-    }
+            if (radeon_bo_is_busy((struct r300_winsys_bo*)bo)) {
+                return NULL;
+            }
+        } else {
+            if (radeon_bo_is_referenced_by_cs(cs, bo)) {
+                cs->flush_cs(cs->flush_data);
+            }
 
-    /* If it's not unsynchronized bo_map, flush CS if needed and then wait. */
-    if (may_be_busy && !(flags & PB_USAGE_UNSYNCHRONIZED)) {
-        if (radeon_bo_is_referenced_by_cs(cs, bo)) {
-            cs->flush_cs(cs->flush_data);
+            radeon_bo_wait((struct r300_winsys_bo*)bo);
         }
-
-        radeon_bo_wait((struct r300_winsys_bo*)bo);
     }
 
     /* Return the pointer if it's already mapped. */