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