On 09/11/2013 11:23 AM, Jacob Penner wrote:
Add piglit_link_simple_program_multiple_shader()
Add piglit_build_simple_program_multiple_shader_v()
Add piglit_build_simple_program_multiple_shader()
Add piglit_build_simple_program_unlinked_multiple_shader()

In the actual patch, some function names contain "shader" and others
contain "shaders". Then names should be consistent. I slightly prefer "shaders",
but it doesn't really matter.

---
  tests/util/piglit-shader.c | 134 +++++++++++++++++++++++++++++++++++++++++++++
  tests/util/piglit-shader.h |  10 ++++
  2 files changed, 144 insertions(+)

diff --git a/tests/util/piglit-shader.c b/tests/util/piglit-shader.c
index f7bd06f..8c2137a 100644
--- a/tests/util/piglit-shader.c
+++ b/tests/util/piglit-shader.c
@@ -322,3 +322,137 @@ piglit_build_simple_program(const char *vs_source, const 
char *fs_source)

        return prog;
  }
+
+GLint piglit_link_simple_program_multiple_shaders(GLint shader1, ...)
+{
+       va_list ap;
+       GLint prog, sh;
+
+       piglit_require_GLSL();
+
+       prog = glCreateProgram();
+
+       va_start(ap, shader1);
+       sh = shader1;
+
+       while (sh != 0) {
+               glAttachShader(prog, sh);
+               sh = va_arg(ap, GLint);
+       }
+
+       va_end(ap);
+
+       /* If the shaders reference piglit_vertex or piglit_tex, bind
+        * them to some fixed attribute locations so they can be used
+        * with piglit_draw_rect_tex() in GLES.
+        */
+       glBindAttribLocation(prog, PIGLIT_ATTRIB_POS, "piglit_vertex");
+       glBindAttribLocation(prog, PIGLIT_ATTRIB_TEX, "piglit_texcoord");
+
+       glLinkProgram(prog);
+
+       if (!piglit_link_check_status(prog)) {
+               glDeleteProgram(prog);
+               prog = 0;
+       }
+
+       return prog;
+}
+
+GLint
+piglit_build_simple_program_unlinked_multiple_shader_v(GLenum target1,
+                                                      const char*source1,
                                                                 ^^^ Need space 
before '*'.
+                                                      va_list ap)
+{
+       GLuint prog;
+       GLenum target;
+       const char *source;
+
+       piglit_require_GLSL();
+       prog = glCreateProgram();
+
+

Remove extra newline here.

+       source = source1;
+       target = target1;
+
+       while (target != 0) {
+               GLuint shader = piglit_compile_shader_text(target, source);
+
+               glAttachShader(prog, shader);
+               glDeleteShader(shader);
+
+               target  = va_arg(ap, GLenum);
+               if (target != 0)
+                       source = va_arg(ap, char*);
+       }
+
+       return prog;
+}
+
+/**
+ * Builds and links a program from optional sources,  but does not link
+ * it. The last target must be 0. If there is a compile failure,
+ * the test is terminated.
+ *
+ * example:
+ * piglit_build_simple_program_unlinked_multiple_shader(
+ *                             GL_VERTEX_SHADER,   vs,
+ *                             GL_GEOMETRY_SHADER, gs,
+ *                             GL_FRAGMENT_SHADER, fs,
+ *                             0);
+ */
+GLint
+piglit_build_simple_program_unlinked_multiple_shader(GLenum target1,
+                                                    const char *source1,
+                                                    ...)
+{
+       GLuint prog;
+       va_list ap;
+
+       va_start(ap, source1);
+
+       prog = piglit_build_simple_program_unlinked_multiple_shader_v(target1,
+                                                                     source1,
+                                                                     ap);
+       va_end(ap);
+
+       return prog;
+}
+
+/**
+ * Builds and links a program from optional sources, throwing
+ * PIGLIT_FAIL on error. The last target must be 0.
+ */
+GLint
+piglit_build_simple_program_multiple_shader(GLenum target1,
+                                           const char *source1,
+                                           ...)
+{
+       va_list ap;
+       GLuint prog;
+
+       va_start(ap, source1);
+
+       prog = piglit_build_simple_program_unlinked_multiple_shader_v(target1,
+                                                                     source1,
+                                                                     ap);
+
+       va_end(ap);
+
+       /* If the shaders reference piglit_vertex or piglit_tex, bind
+        * them to some fixed attribute locations so they can be used
+        * with piglit_draw_rect_tex() in GLES.
+        */
+       glBindAttribLocation(prog, PIGLIT_ATTRIB_POS, "piglit_vertex");
+       glBindAttribLocation(prog, PIGLIT_ATTRIB_TEX, "piglit_texcoord");
+
+       glLinkProgram(prog);
+
+       if (!piglit_link_check_status(prog)) {
+               glDeleteProgram(prog);
+               prog = 0;
+               piglit_report_result(PIGLIT_FAIL);
+       }
+
+       return prog;
+}

Fix the my small quibbles (two spacing issues and naming inconsistency) and
this is
Reviewed-by: Chad Versace <[email protected]>

_______________________________________________
Piglit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to