v3d: only process glMemoryBarrier() for SSBOs and images
authorIago Toral Quiroga <itoral@igalia.com>
Thu, 8 Aug 2019 10:46:43 +0000 (12:46 +0200)
committerIago Toral Quiroga <itoral@igalia.com>
Tue, 13 Aug 2019 06:25:15 +0000 (08:25 +0200)
PIPE_BARRIER_UPDATE is defined as:
PIPE_BARRIER_UPDATE_BUFFER | PIPE_BARRIER_UPDATE_TEXTURE

Which means we were flushing for any flags other than these two, but
this was intended to only flush for ssbos and images.

Actually, the driver automatically flushes jobs as we need, including
writes/reads involving SSBOs and images, so we don't really need to
flush anything when the program emits a barrier. However, this may
lead to excessive flushing in some cases, so we will soon change this
to avoid atutomatic flushing of the current job for SSBOs and images,
meaning that we will rely on the application to emit correct memory
barriers for these that we should make sure to process here.

Reviewed-by: Eric Anholt <eric@anholt.net>
src/gallium/drivers/v3d/v3d_context.c

index 8dc8dd635816677d3c5b273af4d00fd663ee59d6..93f0caabc357e078e1e107306d8d599254879bfc 100644 (file)
@@ -72,7 +72,13 @@ v3d_memory_barrier(struct pipe_context *pctx, unsigned int flags)
 {
         struct v3d_context *v3d = v3d_context(pctx);
 
-       if (!(flags & ~PIPE_BARRIER_UPDATE))
+        /* We only need to flush for SSBOs and images, because for everything
+         * else we flush the job automatically when we needed.
+         */
+        const unsigned int flush_flags = PIPE_BARRIER_SHADER_BUFFER |
+                                         PIPE_BARRIER_IMAGE;
+
+       if (!(flags & flush_flags))
                return;
 
         /* We only need to flush jobs writing to SSBOs/images. */