gallium/u_threaded: clean up tc_improve_map_buffer_flags and prevent reentry
authorMarek Olšák <marek.olsak@amd.com>
Thu, 2 Nov 2017 00:06:43 +0000 (01:06 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Mon, 6 Nov 2017 15:23:20 +0000 (16:23 +0100)
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/auxiliary/util/u_threaded_context.c

index 7e28b87..0f23258 100644 (file)
@@ -1276,6 +1276,14 @@ tc_improve_map_buffer_flags(struct threaded_context *tc,
                             struct threaded_resource *tres, unsigned usage,
                             unsigned offset, unsigned size)
 {
+   /* Never invalidate inside the driver and never infer "unsynchronized". */
+   unsigned tc_flags = TC_TRANSFER_MAP_NO_INVALIDATE |
+                       TC_TRANSFER_MAP_NO_INFER_UNSYNCHRONIZED;
+
+   /* Prevent a reentry. */
+   if (usage & tc_flags)
+      return usage;
+
    /* Sparse buffers can't be mapped directly and can't be reallocated
     * (fully invalidated). That may just be a radeonsi limitation, but
     * the threaded context must obey it with radeonsi.
@@ -1295,12 +1303,12 @@ tc_improve_map_buffer_flags(struct threaded_context *tc,
       return usage;
    }
 
+   usage |= tc_flags;
+
    /* Handle CPU reads trivially. */
    if (usage & PIPE_TRANSFER_READ) {
       /* Drivers aren't allowed to do buffer invalidations. */
-      return (usage & ~PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE) |
-             TC_TRANSFER_MAP_NO_INVALIDATE |
-             TC_TRANSFER_MAP_NO_INFER_UNSYNCHRONIZED;
+      return usage & ~PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE;
    }
 
    /* See if the buffer range being mapped has never been initialized,
@@ -1342,10 +1350,7 @@ tc_improve_map_buffer_flags(struct threaded_context *tc,
       usage |= TC_TRANSFER_MAP_THREADED_UNSYNC; /* notify the driver */
    }
 
-   /* Never invalidate inside the driver and never infer "unsynchronized". */
-   return usage |
-          TC_TRANSFER_MAP_NO_INVALIDATE |
-          TC_TRANSFER_MAP_NO_INFER_UNSYNCHRONIZED;
+   return usage;
 }
 
 static void *