[Piglit] [PATCH 6/9] update EXT_transform_feedback error detection
Paul Berry
stereotype441 at gmail.com
Sat Sep 7 20:08:40 PDT 2013
On 4 September 2013 12:57, Ian Romanick <idr at freedesktop.org> wrote:
> From: Gregory Hainaut <gregory.hainaut at gmail.com>
>
> program pipeline add new INVALID_OPERATION (spec chapter 13.2.2)
>
> Note: FGLRX don't report any of the expected errors...
>
> V4:
> * merge the separate vertex shader
> * use asprintf to set the version (avoid bug in FGLRX)
>
> V5 (idr):
> * Trivial reformatting.
> ---
> tests/all.tests | 4 +-
> tests/spec/ext_transform_feedback/api-errors.c | 89
> +++++++++++++++++++++++++-
> 2 files changed, 90 insertions(+), 3 deletions(-)
>
> diff --git a/tests/all.tests b/tests/all.tests
> index bfd6025..c8df16d 100644
> --- a/tests/all.tests
> +++ b/tests/all.tests
> @@ -2097,7 +2097,9 @@ for mode in ['interleaved_ok_base',
> 'interleaved_ok_range',
> 'bind_range_offset_2', 'bind_range_offset_3',
> 'bind_range_offset_5', 'bind_offset_offset_1',
> 'bind_offset_offset_2', 'bind_offset_offset_3',
> - 'bind_offset_offset_5', 'not_a_program']:
> + 'bind_offset_offset_5', 'not_a_program',
> + 'useprogstage_noactive', 'useprogstage_active',
> + 'bind_pipeline']:
> test_name = 'api-errors {0}'.format(mode)
> ext_transform_feedback[test_name] = concurrent_test(
> 'ext_transform_feedback-{0}'.format(test_name))
> diff --git a/tests/spec/ext_transform_feedback/api-errors.c
> b/tests/spec/ext_transform_feedback/api-errors.c
> index 04470b2..2cfe946 100644
> --- a/tests/spec/ext_transform_feedback/api-errors.c
> +++ b/tests/spec/ext_transform_feedback/api-errors.c
> @@ -48,6 +48,7 @@
> * implementation is not overly aggressive in flagging errors.
> */
>
> +#define _GNU_SOURCE
> #include "piglit-util-gl-common.h"
>
> PIGLIT_GL_TEST_CONFIG_BEGIN
> @@ -78,6 +79,9 @@ enum test_mode {
> BIND_BAD_SIZE,
> BIND_BAD_OFFSET,
> NOT_A_PROGRAM,
> + USEPROGSTAGE_ACTIVE,
> + USEPROGSTAGE_NOACTIVE,
> + BIND_PIPELINE
> };
>
> enum bind_mode {
> @@ -97,6 +101,24 @@ static const char *vstext =
> " gl_Position = vec4(1.0);\n"
> "}\n";
>
> +static const char *vstext_sep_template =
> + "#version %d\n"
> + "#extension GL_ARB_separate_shader_objects : enable\n"
> + "#if __VERSION__ > 140\n"
> + "out gl_PerVertex {\n"
> + " vec4 gl_Position;\n"
> + "};\n"
> + "#endif\n"
> + "varying vec4 foo;\n"
> + "varying vec4 bar;\n"
> + "\n"
> + "void main()\n"
> + "{\n"
> + " foo = vec4(1.0);\n"
> + " bar = vec4(1.0);\n"
> + " gl_Position = vec4(1.0);\n"
> + "}\n";
> +
> static const char *varyings[] = { "foo", "bar" };
>
> static struct test_desc
> @@ -151,6 +173,10 @@ static struct test_desc
> { "bind_offset_offset_3", BIND_BAD_OFFSET, 3, OFFSET,
> GL_INTERLEAVED_ATTRIBS, 1 },
> { "bind_offset_offset_5", BIND_BAD_OFFSET, 5, OFFSET,
> GL_INTERLEAVED_ATTRIBS, 1 },
> { "not_a_program", NOT_A_PROGRAM, 0, BASE,
> GL_INTERLEAVED_ATTRIBS, 1 },
> + { "useprogstage_noactive", USEPROGSTAGE_NOACTIVE,0, BASE,
> GL_INTERLEAVED_ATTRIBS, 1 },
> + { "useprogstage_active", USEPROGSTAGE_ACTIVE, 0, BASE,
> GL_INTERLEAVED_ATTRIBS, 1 },
> + { "bind_pipeline", BIND_PIPELINE, 0, BASE,
> GL_INTERLEAVED_ATTRIBS, 1 },
> +
> };
>
> static void
> @@ -186,12 +212,29 @@ do_test(const struct test_desc *test)
> {
> GLuint vs;
> GLuint progs[2];
> + GLuint pipes[2];
> GLuint bufs[NUM_BUFFERS];
> float initial_xfb_buffer_contents[XFB_BUFFER_SIZE];
> GLboolean pass = GL_TRUE;
> int i;
> int num_varyings = test->mode == NO_VARYINGS ? 0 :
> test->num_buffers;
> GLint max_separate_attribs;
> + char* vstext_sep;
> +
> + if (test->mode == USEPROGSTAGE_ACTIVE
> + || test->mode == USEPROGSTAGE_NOACTIVE
> + || test->mode == BIND_PIPELINE) {
> + piglit_require_extension("GL_ARB_separate_shader_objects");
> +
> + /* Workaround a bug in FGLRX. They always require a
> + * redeclaration of gl_PerVertex interface block
> + */
>
This comment should go next to the declaration of vstext_sep_template
(where the workaround appears). With that fixed, this patch is:
Reviewed-by: Paul Berry <stereotype441 at gmail.com>
It would be nice to put this comment in some of the other patches in the
series too :)
> + if (piglit_get_gl_version() >= 32)
> + asprintf(&vstext_sep, vstext_sep_template, 150);
> + else
> + asprintf(&vstext_sep, vstext_sep_template, 110);
> +
> + }
>
> glGetIntegerv(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS,
> &max_separate_attribs);
> @@ -200,7 +243,17 @@ do_test(const struct test_desc *test)
>
> printf("Compile vertex shader\n");
> vs = piglit_compile_shader_text(GL_VERTEX_SHADER, vstext);
> - if (test->mode == NOT_A_PROGRAM) {
> + if (test->mode == USEPROGSTAGE_ACTIVE
> + || test->mode == USEPROGSTAGE_NOACTIVE
> + || test->mode == BIND_PIPELINE) {
> + /* Note, we can't use glCreateShaderProgramv because the
> setup
> + * of transform feedback must be done before linking
> + */
> + vs = piglit_compile_shader_text(GL_VERTEX_SHADER,
> vstext_sep);
> + progs[0] = glCreateProgram();
> + glProgramParameteri(progs[0], GL_PROGRAM_SEPARABLE,
> GL_TRUE);
> + glAttachShader(progs[0], vs);
> + } else if (test->mode == NOT_A_PROGRAM) {
> printf("Create a program and then delete it\n");
> progs[0] = glCreateProgram();
> glDeleteProgram(progs[0]);
> @@ -227,6 +280,15 @@ do_test(const struct test_desc *test)
> glLinkProgram(progs[0]);
> pass = piglit_link_check_status(progs[0]) && pass;
>
> + if (test->mode == USEPROGSTAGE_ACTIVE
> + || test->mode == USEPROGSTAGE_NOACTIVE
> + || test->mode == BIND_PIPELINE) {
> + printf("Create 2nd program for the pipeline\n");
> + progs[1] = glCreateShaderProgramv(GL_VERTEX_SHADER, 1,
> + (const char **)
> &vstext_sep);
> + pass = piglit_link_check_status(progs[1]) && pass;
> + }
> +
> if (test->mode == USEPROG_ACTIVE || test->mode ==
> LINK_OTHER_ACTIVE) {
> printf("Prepare 2nd program\n");
> progs[1] = glCreateProgram();
> @@ -238,7 +300,15 @@ do_test(const struct test_desc *test)
> pass = piglit_link_check_status(progs[1]) && pass;
> }
>
> - if (test->mode == SKIP_USE_PROGRAM) {
> + if (test->mode == USEPROGSTAGE_ACTIVE
> + || test->mode == USEPROGSTAGE_NOACTIVE
> + || test->mode == BIND_PIPELINE) {
> + printf("Use pipeline\n");
> + glGenProgramPipelines(2, pipes);
> + glUseProgramStages(pipes[0], GL_VERTEX_SHADER_BIT,
> progs[0]);
> + glUseProgramStages(pipes[1], GL_VERTEX_SHADER_BIT,
> progs[1]);
> + glBindProgramPipeline(pipes[0]);
> + } else if (test->mode == SKIP_USE_PROGRAM) {
> printf("Don't use program\n");
> } else {
> printf("Use program\n");
> @@ -325,6 +395,21 @@ do_test(const struct test_desc *test)
> do_bind(test, bufs[0], 0);
> pass = piglit_check_gl_error(GL_INVALID_OPERATION) && pass;
> break;
> + case USEPROGSTAGE_ACTIVE:
> + printf("Use new program stage\n");
> + glUseProgramStages(pipes[0], GL_VERTEX_SHADER_BIT,
> progs[1]);
> + pass = piglit_check_gl_error(GL_INVALID_OPERATION) && pass;
> + break;
> + case USEPROGSTAGE_NOACTIVE:
> + printf("Use new program stage\n");
> + glUseProgramStages(pipes[1], GL_VERTEX_SHADER_BIT,
> progs[1]);
> + pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
> + break;
> + case BIND_PIPELINE:
> + printf("Bind a new pipeline\n");
> + glBindProgramPipeline(pipes[1]);
> + pass = piglit_check_gl_error(GL_INVALID_OPERATION) && pass;
> + break;
> default:
> break;
> }
> --
> 1.8.1.4
>
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/piglit/attachments/20130907/3b65ff03/attachment-0001.html>
More information about the Piglit
mailing list