gallium: Force blend color to 16-byte alignment
authorChuck Atkins <chuck.atkins@kitware.com>
Wed, 29 Jun 2016 02:32:02 +0000 (22:32 -0400)
committerTim Rowley <timothy.o.rowley@intel.com>
Thu, 30 Jun 2016 22:04:41 +0000 (17:04 -0500)
This aligns the 4-element color float array to 16 byte boundaries.  This
should allow compiler vectorizers to generate better optimizations.
Also fixes broken vectorization generated by Intel compiler.

v2: Fixed indentation and added a lengthy comment explaining the
    reason for the alignment.

Cc: <mesa-stable@lists.freedesktop.org>
Reported-by: Tim Rowley <timothy.o.rowley@intel.com>
Tested-by: Tim Rowley <timothy.o.rowley@intel.com>
Signed-off-by: Chuck Atkins <chuck.atkins@kitware.com>
Acked-by: Roland Scheidegger <sroland@vmware.com>
src/gallium/include/pipe/p_state.h

index 1543e90972e9902008bf4a6c0a31bdff45d2817d..5526c392aa706fcb7f064d88b061fc8b160663a9 100644 (file)
@@ -326,7 +326,17 @@ struct pipe_blend_state
 
 struct pipe_blend_color
 {
-   float color[4];
+   /**
+    * Making the color array explicitly 16-byte aligned provides a hint to
+    * compilers to make more efficient auto-vectorization optimizations.
+    * The actual performance gains from vectorizing the blend color array are
+    * fairly minimal, if any, but the alignment is necessary to work around
+    * buggy vectorization in some compilers which fail to generate the correct
+    * unaligned accessors resulting in a segfault.  Specifically several
+    * versions of the Intel compiler are known to be affected but it's likely
+    * others are as well.
+    */
+   PIPE_ALIGN_VAR(16) float color[4];
 };