If this test worked before, it was by accident.

- Declare blocks as layout(std140) for portability.
- Use vec4[] rather than float[]; According to std140 rules, the array
  stride of float[] is actually sizeof(vec4), not sizeof(float), so
  we were asking for a considerably larger UBO than intended.
- Don't insist on an error when exceeding GL_MAX_UNIFORM_BLOCK_SIZE. The
  spec doesn't require it to be emitted.
- Fetch max uniform block size before using it.

Signed-off-by: Chris Forbes <chr...@ijw.co.nz>
---

Various fixes for the `large-uniforms` test sent out a few days ago. Will 
squash it
in when these land.

 .../spec/arb_tessellation_shader/large-uniforms.c  | 46 ++++++++++++++--------
 1 file changed, 30 insertions(+), 16 deletions(-)

diff --git a/tests/spec/arb_tessellation_shader/large-uniforms.c 
b/tests/spec/arb_tessellation_shader/large-uniforms.c
index 118f12e..7502d2e 100644
--- a/tests/spec/arb_tessellation_shader/large-uniforms.c
+++ b/tests/spec/arb_tessellation_shader/large-uniforms.c
@@ -73,8 +73,8 @@ static const char *const tcs_source_uniform_block_template =
 "#version 150\n"
 "#extension GL_ARB_tessellation_shader: require\n"
 "layout(vertices = 3) out;\n"
-"uniform block {\n"
-"      float large_array[%d];\n"
+"layout(std140) uniform block {\n"
+"      vec4 large_array[%d];\n"
 "} large_block[%d];\n"
 "void main() {\n"
 "      gl_TessLevelOuter = float[4](1.0, 1.0, 1.0, 1.0);\n"
@@ -104,8 +104,8 @@ static const char *const tes_source_uniform_block_template =
 "#version 150\n"
 "#extension GL_ARB_tessellation_shader: require\n"
 "layout(triangles) in;\n"
-"uniform block {\n"
-"      float large_array[%d];\n"
+"layout(std140) uniform block {\n"
+"      vec4 large_array[%d];\n"
 "} large_block[%d];\n"
 "void main() {\n"
 "      gl_Position = vec4(0.0);\n"
@@ -170,7 +170,7 @@ test_uniform_block(const GLenum shader, const int 
num_blocks, const int size,
        const char *source_template = shader == GL_TESS_CONTROL_SHADER ?
                                      tcs_source_uniform_block_template :
                                      tes_source_uniform_block_template;
-       const char *summand_template = " + large_block[%d].large_array[i]";
+       const char *summand_template = " + large_block[%d].large_array[i].w";
        char *sum;
        int i;
 
@@ -204,13 +204,13 @@ test_uniform_block(const GLenum shader, const int 
num_blocks, const int size,
        link_status = piglit_link_check_status_quiet(prog);
 
        if (link_status && expect_fail) {
-               fprintf(stderr, "Program with %d uniform blocks of size %d "
-                       "in %s linked succesfully\n", num_blocks, size,
+               fprintf(stderr, "Program with %d uniform blocks of size %d 
(vec4s)"
+                       "in %s linked successfully\n", num_blocks, size,
                        piglit_get_gl_enum_name(shader));
                return false;
        }
        if (!link_status && !expect_fail) {
-               fprintf(stderr, "Program with %d uniform blocks of size %d "
+               fprintf(stderr, "Program with %d uniform blocks of size %d 
(vec4s)"
                        "in %s failed to link\n", num_blocks, size,
                        piglit_get_gl_enum_name(shader));
                return false;
@@ -224,6 +224,17 @@ test_uniform_block(const GLenum shader, const int 
num_blocks, const int size,
 
 
 static bool
+report(bool result, GLenum shader, char const *name)
+{
+       piglit_report_subtest_result(result ? PIGLIT_PASS : PIGLIT_FAIL,
+                                    "%s-%s",
+                                    piglit_get_gl_enum_name(shader),
+                                    name);
+       return result;
+}
+
+
+static bool
 test_shader(const GLenum shader, const int max_uniform_components,
            const int max_combined_uniform_components,
            const int max_uniform_blocks)
@@ -239,19 +250,22 @@ test_shader(const GLenum shader, const int 
max_uniform_components,
         *       (MAX_UNIFORM_BLOCK_SIZE/4)
         *    using the minimum values of the corresponding terms.
         */
-       pass = max_combined_uniform_components >=
+       glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, &max_uniform_block_size);
+
+       pass = report(max_combined_uniform_components >=
               max_uniform_components +
               max_uniform_blocks *
-              (max_uniform_block_size/4) && pass;
+              (max_uniform_block_size/4), shader, 
"combined-limit-large-enough") && pass;
 
-       pass = test_uniform_array(shader, max_uniform_components, false) && 
pass;
-       pass = test_uniform_array(shader, max_uniform_components + 1, true) && 
pass;
+       pass = report(test_uniform_array(shader, max_uniform_components, 
false), shader, "array-at-limit") && pass;
+       pass = report(test_uniform_array(shader, max_uniform_components + 1, 
true), shader, "array-too-large") && pass;
 
-       glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, &max_uniform_block_size);
 
-       pass = test_uniform_block(shader, max_uniform_blocks, 
max_uniform_block_size/4, false) && pass;
-       pass = test_uniform_block(shader, max_uniform_blocks + 1, 
max_uniform_block_size/4, true) && pass;
-       pass = test_uniform_block(shader, max_uniform_blocks, 
max_uniform_block_size/4 + 1, true) && pass;
+       pass = report(test_uniform_block(shader, max_uniform_blocks, 
max_uniform_block_size/16, false), shader, "blocks-at-limits") && pass;
+       pass = report(test_uniform_block(shader, max_uniform_blocks + 1, 
max_uniform_block_size/16, true), shader, "blocks-too-many-blocks") && pass;
+       /* For uniform blocks too large, the spec says a linker error *may* be
+        * emitted; it is not required. so don't test that.
+        */
 
        return pass;
 }
-- 
2.0.4

_______________________________________________
Piglit mailing list
Piglit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to