mesa: Add missing _mm_mfence() before streaming loads.
authorMatt Turner <mattst88@gmail.com>
Thu, 1 Oct 2015 17:06:55 +0000 (10:06 -0700)
committerMatt Turner <mattst88@gmail.com>
Mon, 5 Oct 2015 19:06:33 +0000 (12:06 -0700)
According to the Intel Software Development Manual (Volume 1: Basic
Architecture, 12.10.3 Streaming Load Hint Instruction):

   Streaming loads may be weakly ordered and may appear to software to
   execute out of order with respect to other memory operations.
   Software must explicitly use fences (e.g. MFENCE) if it needs to
   preserve order among streaming loads or between streaming loads and
   other memory operations.

That is, a memory fence is needed to preserve the order between the GPU
writing the buffer and the streaming loads reading it back.

Reported-by: Joseph Nuzman <joseph.nuzman@intel.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
src/mesa/main/streaming-load-memcpy.c

index d7147afdc5c436a8563ab366cb4e62e00d76e57a..32854b60eb223282a749af6a58e3d417271493bb 100644 (file)
@@ -59,6 +59,9 @@ _mesa_streaming_load_memcpy(void *restrict dst, void *restrict src, size_t len)
       len -= MIN2(bytes_before_alignment_boundary, len);
    }
 
+   if (len >= 64)
+      _mm_mfence();
+
    while (len >= 64) {
       __m128i *dst_cacheline = (__m128i *)d;
       __m128i *src_cacheline = (__m128i *)s;