<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>