[Piglit] [PATCH 1/3] glsl-1.50: Put a struct after a struct with weird alignment

Ian Romanick idr at freedesktop.org
Wed Sep 10 15:17:39 PDT 2014


From: Ian Romanick <ian.d.romanick at intel.com>

The trick of this test is putting a structure after a structure that is
larger than 16-bytes but not 16-byte aligned.  In this case the first
structure is 24 bytes.  This should have an array stride of 32-bytes.
There seems to be some problem in Mesa's glsl_type::std140_size() that
causes the total array size to be 48 instead of 64.  The correct values
are, however, reported via the GL API.

NOTE: On Mesa we get the correct locations, but the shader doesn't
generate the correct results.  The test fails.

Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=83639
---
 .../struct_base_alignment.shader_test              | 86 ++++++++++++++++++++++
 1 file changed, 86 insertions(+)
 create mode 100644 tests/spec/glsl-1.50/uniform_buffer/struct_base_alignment.shader_test

diff --git a/tests/spec/glsl-1.50/uniform_buffer/struct_base_alignment.shader_test b/tests/spec/glsl-1.50/uniform_buffer/struct_base_alignment.shader_test
new file mode 100644
index 0000000..6ea9302
--- /dev/null
+++ b/tests/spec/glsl-1.50/uniform_buffer/struct_base_alignment.shader_test
@@ -0,0 +1,86 @@
+[require]
+GLSL >= 1.50
+
+[vertex shader]
+#extension GL_ARB_shader_bit_encoding: enable
+#extension GL_ARB_gpu_shader5: enable
+
+// To reproduce the Mesa bug, S1 must be larger than 16 bytes and not
+// 16-byte aligned.  In addition, the uniform block must have an instance
+// name.
+
+struct S1 {
+    bvec2       bv1;
+    float       f1;
+    uvec2       uv1;
+};
+
+struct S2 {
+    mat4x2      m42_1;
+};
+
+struct S3 {
+    S2          s2_1;
+};
+
+layout(std140)
+uniform UB {
+                          // base   base  align  padded  row-   array   matrix
+                          // align  off.  off.   size    major  stride  stride
+    S1[2]      s1_1;      //    16     0      0      64    -        32       -
+//    [0]
+//    bvec2       bv1            8     0      0       8    -         -       -
+//    float       f1             4     8      8       4    -         -       -
+//    uvec2       uv1            8    12     16       8    -         -       -
+//    [1]
+//    bvec2       bv1            8    32     32       8    -         -       -
+//    float       f1             4    40     40       4    -         -       -
+//    uvec2       uv1            8    44     48       8    -         -       -
+    S3[1]      s3_1;      //    16    64     64      64    -        64       -
+//    [0]
+//    S2          s2_1          16    64     64      64    -         -       -
+//      mat4x2      m42_1       16    64     64      64   no         -      16
+} ub;
+
+flat out int vertex_pass;
+in vec4 piglit_vertex;
+
+#if defined(GL_ARB_shader_bit_encoding) || defined(GL_ARB_gpu_shader5) || __VERSION__ >= 430
+bool float_match(float u, float f, uint bits) { return floatBitsToUint(u) == bits; }
+#else
+bool float_match(float u, float f, uint bits) { return u == f; }
+#endif
+
+void main()
+{
+    bool pass;
+
+    pass = float_match(ub.s3_1[0].s2_1.m42_1[0].y, 32703.5333028, 0x46ff7f11u);
+
+    vertex_pass = int(pass);
+    gl_Position = piglit_vertex;
+}
+
+[fragment shader]
+out vec4 piglit_fragcolor;
+flat in int vertex_pass;
+
+void main()
+{
+    piglit_fragcolor = bool(vertex_pass) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+link success
+
+active uniform UB.s3_1[0].s2_1.m42_1 GL_UNIFORM_TYPE GL_FLOAT_MAT4x2
+active uniform UB.s3_1[0].s2_1.m42_1 GL_UNIFORM_SIZE 1
+active uniform UB.s3_1[0].s2_1.m42_1 GL_UNIFORM_OFFSET 64
+active uniform UB.s3_1[0].s2_1.m42_1 GL_UNIFORM_ARRAY_STRIDE 0
+active uniform UB.s3_1[0].s2_1.m42_1 GL_UNIFORM_MATRIX_STRIDE 16
+active uniform UB.s3_1[0].s2_1.m42_1 GL_UNIFORM_IS_ROW_MAJOR 0
+
+uniform mat4x2 UB.s3_1[0].s2_1.m42_1 0x4680c6b6 0x46ff7f11 0x462085c4 0x46cefb3e 0xc6b24e67 0x469e776a 0xc6e2d23a 0xc64833be
+
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 1.0
-- 
1.8.1.4



More information about the Piglit mailing list