[Piglit] [PATCH] util: Add geometry shader version of piglit_build_simple_program functions

Ian Romanick idr at freedesktop.org
Wed Sep 4 14:25:47 PDT 2013


On 09/04/2013 11:08 AM, Jacob Penner wrote:
> Add piglit_link_simple_program_with_gs()
> Add piglit_build_simple_program_with_gs()
> Add piglit_build_simple_program_unlinked_with_gs()
> ---
>  tests/util/piglit-shader.c | 102 +++++++++++++++++++++++++++++++++++++++++++++
>  tests/util/piglit-shader.h |   7 ++++
>  2 files changed, 109 insertions(+)
> 
> diff --git a/tests/util/piglit-shader.c b/tests/util/piglit-shader.c
> index f7bd06f..227f80c 100644
> --- a/tests/util/piglit-shader.c
> +++ b/tests/util/piglit-shader.c
> @@ -322,3 +322,105 @@ piglit_build_simple_program(const char *vs_source, const char *fs_source)
>  
>  	return prog;
>  }
> +
> +GLint piglit_link_simple_program_with_gs(GLint vs, GLint gs, GLint fs)

Yuck.  What's going to happen when we have tesselation shaders?  In
computers, there at most 4 numbers: zero, one, two, and N.  Some will
argue whether or not two should be in that list.
piglit_link_simple_program already handles one and two, and there's no
need for zero.  I'd suggest making a new function:

GLint piglit_link_program_mulitple_shaders(GLint sh1, ...)
{
	va_list ap;
        GLint prog;

        piglit_require_GLSL();

        prog = glCreateProgram();

	va_start(ap, sh1);

        sh = sh1;
	do {
		glAttachShader(prog, sh);
		sh = va_arg(ap, GLint);
	} while (sh != 0);

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

Use 0 to terminate the list, and use varargs macros to iterate the list.

Do the same thing for the other variations.

> +{
> +	GLint prog;
> +
> +	piglit_require_GLSL();
> +
> +	prog = glCreateProgram();
> +	if (vs)
> +		glAttachShader(prog, vs);
> +	if (gs)
> +		glAttachShader(prog, gs);
> +	if (fs)
> +		glAttachShader(prog, fs);
> +
> +	/* 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;
> +}
> +
> +/**
> + * Builds a program from optional VS, GS and FS sources, but does not link
> + * it. If there is a compile failure, the test is terminated.
> + */
> +GLint
> +piglit_build_simple_program_unlinked_with_gs(const char *vs_source,
> +					     const char *gs_source,
> +		    			     const char *fs_source)
> +{
> +	GLuint prog;
> +
> +	piglit_require_GLSL();
> +	prog = glCreateProgram();
> +	if (vs_source) {
> +		GLuint vs = piglit_compile_shader_text(GL_VERTEX_SHADER,
> +						       vs_source);
> +		glAttachShader(prog, vs);
> +		glDeleteShader(vs);
> +	}
> +	if (gs_source) {
> +		GLuint gs = piglit_compile_shader_text(GL_GEOMETRY_SHADER,
> +						       gs_source);
> +		glAttachShader(prog, gs);
> +		glDeleteShader(gs);
> +	}
> +	if (fs_source) {
> +		GLuint fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER,
> +						       fs_source);
> +		glAttachShader(prog, fs);
> +		glDeleteShader(fs);
> +	}
> +	return prog;
> +}
> +
> +/**
> + * Builds and links a program from optional VS, GS and FS sources,
> + * throwing PIGLIT_FAIL on error.
> + */
> +GLint
> +piglit_build_simple_program_with_gs(const char *vs_source,
> +				    const char *gs_source,
> +				    const char *fs_source)
> +{
> +	GLuint vs = 0, gs = 0, fs = 0, prog;
> +
> +	if (vs_source) {
> +		vs = piglit_compile_shader_text(GL_VERTEX_SHADER, vs_source);
> +	}
> +
> +	if (gs_source) {
> +		gs = piglit_compile_shader_text(GL_GEOMETRY_SHADER, gs_source);
> +	}
> +
> +	if (fs_source) {
> +		fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER, fs_source);
> +	}
> +
> +	prog = piglit_link_simple_program_with_gs(vs, gs, fs);
> +	if (!prog)
> +		piglit_report_result(PIGLIT_FAIL);
> +
> +	if (fs)
> +		glDeleteShader(fs);
> +	if (gs)
> +		glDeleteShader(gs);
> +	if (vs)
> +		glDeleteShader(vs);
> +
> +	return prog;
> +}
> diff --git a/tests/util/piglit-shader.h b/tests/util/piglit-shader.h
> index 8f18f0a..91acbe8 100644
> --- a/tests/util/piglit-shader.h
> +++ b/tests/util/piglit-shader.h
> @@ -38,6 +38,13 @@ GLint piglit_link_simple_program(GLint vs, GLint fs);
>  GLint piglit_build_simple_program(const char *vs_source, const char *fs_source);
>  GLuint piglit_build_simple_program_unlinked(const char *vs_source,
>  					    const char *fs_source);
> +GLint piglit_link_simple_program_with_gs(GLint vs, GLint gs, GLint fs);
> +GLint piglit_build_simple_program_with_gs(const char *vs_source,
> +					  const char *gs_source,
> +					  const char *fs_source);
> +GLint piglit_build_simple_program_unlinked_with_gs(const char *vs_source,
> +						   const char *gs_source,
> +					           const char *fs_source);
>  
>  #if defined(PIGLIT_USE_OPENGL_ES1)
>  #define glAttachShader assert(!"glAttachShader does not exist in ES1")
> 



More information about the Piglit mailing list