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