vc4: Align following shader recs to 16 bytes.
authorEric Anholt <eric@anholt.net>
Fri, 1 Aug 2014 18:24:29 +0000 (11:24 -0700)
committerEric Anholt <eric@anholt.net>
Mon, 11 Aug 2014 21:45:31 +0000 (14:45 -0700)
Otherwise, the low address bits will end up being interpreted as attribute
counts.

src/gallium/drivers/vc4/vc4_simulator_validate.c
src/gallium/drivers/vc4/vc4_simulator_validate.h

index e16b3728eaca1fd170fbc360b948a012f40065f9..a660f94c58a889809cee94d190f9e225cbd85677 100644 (file)
@@ -143,7 +143,8 @@ validate_gl_shader_state(VALIDATE_ARGS)
        *(uint32_t *)validated = (exec->shader_rec_p +
                                  exec->shader_state[i].addr);
 
-       exec->shader_rec_p += gl_shader_rec_size(exec->shader_state[i].addr);
+       exec->shader_rec_p +=
+               roundup(gl_shader_rec_size(exec->shader_state[i].addr), 16);
 
        return 0;
 }
@@ -461,7 +462,13 @@ validate_shader_rec(struct drm_device *dev,
        pkt_v = exec->shader_rec_v;
        memcpy(pkt_v, pkt_u, packet_size);
        exec->shader_rec_u += packet_size;
-       exec->shader_rec_v += packet_size;
+       /* Shader recs have to be aligned to 16 bytes (due to the attribute
+        * flags being in the low bytes), so round the next validated shader
+        * rec address up.  This should be safe, since we've got so many
+        * relocations in a shader rec packet.
+        */
+       BUG_ON(roundup(packet_size, 16) - packet_size > nr_relocs * 4);
+       exec->shader_rec_v += roundup(packet_size, 16);
        exec->shader_rec_size -= packet_size;
 
        for (i = 0; i < nr_relocs; i++) {
index 28dd2f65e703bf2fecc87c7571588a71be990de0..52f664adbc11a2458881dde0a6ce7ba915d952c2 100644 (file)
@@ -41,6 +41,7 @@
 #define kfree(ptr) free(ptr)
 #define krealloc(ptr, size, args) realloc(ptr, size)
 #define roundup(x, y) align(x, y)
+#define BUG_ON(condition) assert(!(condition))
 
 static inline int
 copy_from_user(void *dst, void *src, size_t size)