llvmpipe: fix lp_rast_plane alignment on 32bit
authorRoland Scheidegger <sroland@vmware.com>
Tue, 15 Mar 2016 15:39:55 +0000 (16:39 +0100)
committerRoland Scheidegger <sroland@vmware.com>
Tue, 15 Mar 2016 18:42:15 +0000 (19:42 +0100)
Some rasterization code relies (for sse) on the first and third planes
(but not the second for now) being 128bit aligned, and we didn't get that
on 32bit - I mistakenly thought the 64bit number in the struct would get
the thing aligned to 64bit even on 32bit archs.
Stephane Marchesin really figured this out.

Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
CC: <mesa-stable@lists.freedesktop.org>
src/gallium/drivers/llvmpipe/lp_rast.h
src/gallium/drivers/llvmpipe/lp_setup_tri.c

index 34008e1c01ecdb7d76a8ce3532f2c0c07de6f176..d9be7f392ef892fefaf4ca0889fe06b73edd0420 100644 (file)
@@ -116,6 +116,12 @@ struct lp_rast_plane {
 
    /* one-pixel sized trivial reject offsets for each plane */
    uint32_t eo;
+   /*
+    * We rely on this struct being 64bit aligned (ideally it would be 128bit
+    * but that's quite the waste) and therefore on 32bit we need padding
+    * since otherwise (even with the 64bit number in there) it wouldn't be.
+    */
+   uint32_t pad;
 };
 
 /**
index 29aee726941ef7c70414801aa105e6b3ae0d457d..98243a12de1b65edfc59441b976ab452d1168df6 100644 (file)
@@ -94,6 +94,8 @@ lp_setup_alloc_triangle(struct lp_scene *scene,
    unsigned plane_sz = nr_planes * sizeof(struct lp_rast_plane);
    struct lp_rast_triangle *tri;
 
+   STATIC_ASSERT(sizeof(struct lp_rast_plane) % 8 == 0);
+
    *tri_size = (sizeof(struct lp_rast_triangle) +
                 3 * input_array_sz +
                 plane_sz);