[Piglit] [PATCH 2/3] ARB_ubo/maxuniformblocksize: Add support for GL_ARB_geometry_shader4.
Fabian Bieler
fabianbieler at fastmail.fm
Mon Jun 17 14:47:57 PDT 2013
On 2013-06-17 22:34, Eric Anholt wrote:
> Passes on the i965 driver.
> ---
> tests/all.tests | 2 +
> .../maxuniformblocksize.c | 82 ++++++++++++++++++----
> 2 files changed, 70 insertions(+), 14 deletions(-)
>
> diff --git a/tests/all.tests b/tests/all.tests
> index ea18999..1eb752d 100644
> --- a/tests/all.tests
> +++ b/tests/all.tests
> @@ -2142,6 +2142,8 @@ arb_uniform_buffer_object['link-mismatch-blocks'] = concurrent_test('arb_uniform
> arb_uniform_buffer_object['maxblocks'] = concurrent_test('arb_uniform_buffer_object-maxblocks')
> arb_uniform_buffer_object['maxuniformblocksize/vs'] = concurrent_test('arb_uniform_buffer_object-maxuniformblocksize vs')
> arb_uniform_buffer_object['maxuniformblocksize/vsexceed'] = concurrent_test('arb_uniform_buffer_object-maxuniformblocksize vsexceed')
> +arb_uniform_buffer_object['maxuniformblocksize/gs'] = concurrent_test('arb_uniform_buffer_object-maxuniformblocksize gs')
> +arb_uniform_buffer_object['maxuniformblocksize/gsexceed'] = concurrent_test('arb_uniform_buffer_object-maxuniformblocksize gsexceed')
> arb_uniform_buffer_object['maxuniformblocksize/fs'] = concurrent_test('arb_uniform_buffer_object-maxuniformblocksize fs')
> arb_uniform_buffer_object['maxuniformblocksize/fsexceed'] = concurrent_test('arb_uniform_buffer_object-maxuniformblocksize fsexceed')
> arb_uniform_buffer_object['minmax'] = concurrent_test('arb_uniform_buffer_object-minmax')
> diff --git a/tests/spec/arb_uniform_buffer_object/maxuniformblocksize.c b/tests/spec/arb_uniform_buffer_object/maxuniformblocksize.c
> index 879fa19..6513afd 100644
> --- a/tests/spec/arb_uniform_buffer_object/maxuniformblocksize.c
> +++ b/tests/spec/arb_uniform_buffer_object/maxuniformblocksize.c
> @@ -21,7 +21,7 @@
> * DEALINGS IN THE SOFTWARE.
> */
>
> -/** @file maxblocks.c
> +/** @file maxuniformblocksize.c
> *
> * Tests linking and drawing with uniform buffer objects of size
> * MAX_UNIFORM_BLOCK_SIZE and MAX_UNIFORM_BLOCK_SIZE + 4.
> @@ -45,6 +45,8 @@ PIGLIT_GL_TEST_CONFIG_END
> static enum {
> VS,
> VS_EXCEED,
> + GS,
> + GS_EXCEED,
> FS,
> FS_EXCEED,
> } mode;
> @@ -52,7 +54,8 @@ static enum {
> static void
> usage(const char *name)
> {
> - fprintf(stderr, "usage: %s <vs | vs_exceed | fs | fs_exceed>\n",
> + fprintf(stderr, "usage: %s <vs | vs_exceed | gs | gs_exceed | "
> + "fs | fs_exceed>\n",
The underscores before "exceed" are not present in the actual command line arguments.
> name);
> piglit_report_result(PIGLIT_FAIL);
> }
> @@ -75,7 +78,7 @@ piglit_display(void)
> " vary = v[i];\n"
> "}\n";
>
> - const char *fs_template =
> + const char *fs_source =
> "#extension GL_ARB_uniform_buffer_object : enable\n"
> "\n"
> "varying vec4 vary;"
> @@ -84,7 +87,7 @@ piglit_display(void)
> " gl_FragColor = vary;\n"
> "}\n";
>
> - const char *vs_template =
> + const char *vs_source =
> "#extension GL_ARB_uniform_buffer_object : enable\n"
> "\n"
> "void main() {\n"
> @@ -103,9 +106,26 @@ piglit_display(void)
> " gl_FragColor = v[i];\n"
> "}\n";
>
> - char *vs_source, *fs_source;
> + const char *gs_ubo_template =
> + "#extension GL_ARB_uniform_buffer_object : enable\n"
> + "#extension GL_ARB_geometry_shader4 : enable\n"
> + "\n"
> + "layout(std140) uniform ubo {\n"
> + " vec4 v[%d];\n"
> + "};\n"
> + "uniform int i;\n"
> + "varying vec4 vary;"
> + "\n"
> + "void main() {\n"
> + " vary = v[i];\n"
> + " for (int v = 0; v < 3; v++) {\n"
> + " gl_Position = gl_PositionIn[v];\n"
> + " EmitVertex();\n"
> + " }\n"
> + "}\n";
> + char *gen_source = NULL;
> GLint max_size, vec4s, i_location;
> - GLuint vs, fs, prog, bo;
> + GLuint vs, gs = 0, fs, prog, bo;
> GLenum target;
> float *data;
> size_t size;
> @@ -129,6 +149,15 @@ piglit_display(void)
> may_link_fail = true;
> vec4s++;
> break;
> + case GS:
> + target = GL_GEOMETRY_SHADER;
> + may_link_fail = false;
> + break;
> + case GS_EXCEED:
> + target = GL_GEOMETRY_SHADER;
> + may_link_fail = true;
> + vec4s++;
> + break;
> case FS:
> target = GL_FRAGMENT_SHADER;
> may_link_fail = false;
> @@ -140,26 +169,47 @@ piglit_display(void)
> break;
> }
>
> + if (target == GL_GEOMETRY_SHADER)
> + piglit_require_extension("GL_ARB_geometry_shader4");
> +
> + prog = glCreateProgram();
> +
> switch (target) {
> case GL_VERTEX_SHADER:
> - asprintf(&vs_source, vs_ubo_template, vec4s);
> - asprintf(&fs_source, fs_template);
> + asprintf(&gen_source, vs_ubo_template, vec4s);
> + vs = piglit_compile_shader_text(GL_VERTEX_SHADER, gen_source);
> + fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER, fs_source);
> printf("Testing VS with uniform block vec4 v[%d]\n", vec4s);
> break;
> + case GL_GEOMETRY_SHADER:
> + asprintf(&gen_source, gs_ubo_template, vec4s);
> + vs = piglit_compile_shader_text(GL_VERTEX_SHADER, vs_source);
> + gs = piglit_compile_shader_text(GL_GEOMETRY_SHADER, gen_source);
> + fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER, fs_source);
> +
> + printf("Testing GS with uniform block vec4 v[%d]\n", vec4s);
> +
> + glProgramParameteri(prog,
> + GL_GEOMETRY_INPUT_TYPE_ARB, GL_TRIANGLES);
> + glProgramParameteri(prog,
> + GL_GEOMETRY_OUTPUT_TYPE_ARB,
> + GL_TRIANGLE_STRIP);
> + glProgramParameteri(prog,
> + GL_GEOMETRY_VERTICES_OUT_ARB, 3);
> + break;
> case GL_FRAGMENT_SHADER:
> - asprintf(&vs_source, vs_template);
> - asprintf(&fs_source, fs_ubo_template, vec4s);
> + asprintf(&gen_source, fs_ubo_template, vec4s);
> + vs = piglit_compile_shader_text(GL_VERTEX_SHADER, vs_source);
> + fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER, gen_source);
> printf("Testing FS with uniform block vec4 v[%d]\n", vec4s);
> break;
> default:
> piglit_report_result(PIGLIT_FAIL);
> }
>
> - vs = piglit_compile_shader_text(GL_VERTEX_SHADER, vs_source);
> - fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER, fs_source);
> -
> - prog = glCreateProgram();
> glAttachShader(prog, vs);
> + if (gs)
> + glAttachShader(prog, gs);
> glAttachShader(prog, fs);
> glLinkProgram(prog);
>
> @@ -219,6 +269,10 @@ piglit_init(int argc, char **argv)
> mode = VS;
> else if (strcmp(argv[1], "vsexceed") == 0)
> mode = VS_EXCEED;
> + else if (strcmp(argv[1], "gs") == 0)
> + mode = GS;
> + else if (strcmp(argv[1], "gsexceed") == 0)
> + mode = GS_EXCEED;
> else if (strcmp(argv[1], "fs") == 0)
> mode = FS;
> else if (strcmp(argv[1], "fsexceed") == 0)
>
Reviewed-by: Fabian Bieler <fabianbieler at fastmail.fm>
More information about the Piglit
mailing list