[Piglit] [PATCH] util/gl: Kill duplicated code using new var arg funcs

Ian Romanick idr at freedesktop.org
Tue Sep 24 16:29:48 PDT 2013


On 09/20/2013 06:54 PM, Chad Versace wrote:
> Replace the body of each function below with a call to its variable
> argument variant:
> 
>   piglit_link_simple_program
>   piglit_build_simple_program_unlinked
>   piglit_build_simple_program
> 
> CC: Jacob Penner <jkpenner91 at gmail.com>
> Signed-off-by: Chad Versace <chad.versace at linux.intel.com>
> ---
>  tests/util/piglit-shader.c | 74 ++++++++++++++++++----------------------------
>  1 file changed, 28 insertions(+), 46 deletions(-)
> 
> diff --git a/tests/util/piglit-shader.c b/tests/util/piglit-shader.c
> index b326abd..e7b5635 100644
> --- a/tests/util/piglit-shader.c
> +++ b/tests/util/piglit-shader.c
> @@ -238,31 +238,16 @@ piglit_link_check_status_quiet(GLint prog)
>  
>  GLint piglit_link_simple_program(GLint vs, GLint fs)

This function is good.  I like it.

>  {
> -	GLint prog;
> +	GLint args[2] = {0};
> +	int i = 0;
>  
> -	piglit_require_GLSL();
> -
> -	prog = glCreateProgram();
>  	if (vs)
> -		glAttachShader(prog, vs);
> +		args[i++] = vs;
>  	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;
> -	}
> +		args[i++] = fs;
>  
> -	return prog;
> +	return piglit_link_simple_program_multiple_shaders(
> +		args[0], args[1], 0);
>  }
>  
>  
> @@ -274,23 +259,23 @@ GLuint
>  piglit_build_simple_program_unlinked(const char *vs_source,
>  				     const char *fs_source)

There are 7 users of this function.  Would it be better to convert them
to the new interface?

>  {
> -	GLuint prog;
> +	intptr_t args[4] = {0};
> +	int i = 0;
>  
> -	piglit_require_GLSL();
> -	prog = glCreateProgram();
>  	if (vs_source) {
> -		GLuint vs = piglit_compile_shader_text(GL_VERTEX_SHADER,
> -						       vs_source);
> -		glAttachShader(prog, vs);
> -		glDeleteShader(vs);
> +		args[i++] = GL_VERTEX_SHADER;
> +		args[i++] = (intptr_t) vs_source;
>  	}
> +
>  	if (fs_source) {
> -		GLuint fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER,
> -						       fs_source);
> -		glAttachShader(prog, fs);
> -		glDeleteShader(fs);
> +		args[i++] = GL_FRAGMENT_SHADER;
> +		args[i++] = (intptr_t) fs_source;
>  	}
> -	return prog;
> +
> +	return piglit_build_simple_program_unlinked_multiple_shaders(
> +			(GLint) args[0], (const char*) args[1],
> +			(GLint) args[2], (const char*) args[3],
> +			0);

This (and the similar code in the next function) made me feel a little
sick.  If we delete this function, is it still worth the ugliness of the
other function?  I'm not sure...

>  }
>  
>  
> @@ -301,26 +286,23 @@ piglit_build_simple_program_unlinked(const char *vs_source,
>  GLint
>  piglit_build_simple_program(const char *vs_source, const char *fs_source)
>  {
> -	GLuint vs = 0, fs = 0, prog;
> +	intptr_t args[4] = {0};
> +	int i = 0;
>  
>  	if (vs_source) {
> -		vs = piglit_compile_shader_text(GL_VERTEX_SHADER, vs_source);
> +		args[i++] = GL_VERTEX_SHADER;
> +		args[i++] = (intptr_t) vs_source;
>  	}
>  
>  	if (fs_source) {
> -		fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER, fs_source);
> +		args[i++] = GL_FRAGMENT_SHADER;
> +		args[i++] = (intptr_t) fs_source;
>  	}
>  
> -	prog = piglit_link_simple_program(vs, fs);
> -	if (!prog)
> -		piglit_report_result(PIGLIT_FAIL);
> -
> -	if (fs)
> -		glDeleteShader(fs);
> -	if (vs)
> -		glDeleteShader(vs);
> -
> -	return prog;
> +	return piglit_build_simple_program_multiple_shaders(
> +			(GLint) args[0], (const char*) args[1],
> +			(GLint) args[2], (const char*) args[3],
> +			0);
>  }
>  
>  GLint piglit_link_simple_program_multiple_shaders(GLint shader1, ...)
> 



More information about the Piglit mailing list