[Piglit] [PATCH] fbo-drawbuffers-maxtargets: use different colors for different buffers

Jose Fonseca jfonseca at vmware.com
Fri Nov 15 08:25:34 PST 2013



----- Original Message -----
> Before, the test always drew green rects for all the target buffers.
> Now we draw a different color into each buffer to be more thorough.
> 
> Plus, replace 16 with MAX_TARGETS, add some comments, etc.
> 
> Note: the test now fails with Mesa's swrast because swrast errantly
> writes the same color to all render targets.
> ---
>  tests/fbo/fbo-drawbuffers-maxtargets.c |   63
>  ++++++++++++++++++++++++++------
>  1 file changed, 51 insertions(+), 12 deletions(-)
> 
> diff --git a/tests/fbo/fbo-drawbuffers-maxtargets.c
> b/tests/fbo/fbo-drawbuffers-maxtargets.c
> index c7a8f7d..1efe819 100644
> --- a/tests/fbo/fbo-drawbuffers-maxtargets.c
> +++ b/tests/fbo/fbo-drawbuffers-maxtargets.c
> @@ -44,6 +44,8 @@ PIGLIT_GL_TEST_CONFIG_BEGIN
>  
>  PIGLIT_GL_TEST_CONFIG_END
>  
> +#define MAX_TARGETS 16
> +
>  static GLint max_targets;
>  
>  static char *vs_source =
> @@ -53,13 +55,37 @@ static char *vs_source =
>  	"}\n";
>  
>  static char *fs_source =
> +	"uniform vec4 colors[16]; \n"
>  	"void main()\n"
>  	"{\n"
>  	"	for (int i = 0; i < %d; i++) {\n"
> -	"		gl_FragData[i] = vec4(0.0, 1.0, 0.0, 0.0);\n"
> +	"		gl_FragData[i] = colors[i];\n"
>  	"	}\n"
>  	"}\n";
>  
> +static const float colors[][4] = {
> +	{ 1.0, 0.0, 0.0, 0.0 },  /* red */
> +	{ 0.0, 1.0, 0.0, 0.0 },  /* green */
> +	{ 0.0, 0.0, 1.0, 0.0 },  /* blue */
> +	{ 0.0, 1.0, 1.0, 0.0 },  /* cyan */
> +
> +	{ 1.0, 0.0, 1.0, 0.0 },  /* purple */
> +	{ 1.0, 1.0, 0.0, 0.0 },  /* green */
> +	{ 0.5, 0.0, 0.0, 0.0 },  /* half red */
> +	{ 0.0, 0.5, 0.0, 0.0 },  /* half green */
> +
> +	{ 0.0, 0.0, 0.5, 0.0 },  /* half blue */
> +	{ 0.0, 0.5, 0.5, 0.0 },  /* half cyan */
> +	{ 0.5, 0.0, 0.5, 0.0 },  /* half purple */
> +	{ 0.5, 0.5, 0.0, 0.0 },  /* half green */
> +
> +	{ 1.0, 1.0, 1.0, 0.0 },    /* white */
> +	{ 0.75, 0.75, 0.75, 0.0 }, /* 75% gray */
> +	{ 0.5, 0.5, 0.5, 0.0 },    /* 50% gray */
> +	{ 0.25, 0.25, 0.25, 0.0 }  /* 25% gray */
> +};
> +
> +
>  static GLuint
>  attach_texture(int i)
>  {
> @@ -87,10 +113,11 @@ attach_texture(int i)
>  static void
>  generate_and_display_drawbuffers(int count)
>  {
> -	GLuint tex[16], fb, fs, vs, prog;
> -	GLenum attachments[16], status;
> +	GLuint tex[MAX_TARGETS], fb, fs, vs, prog;
> +	GLenum attachments[MAX_TARGETS], status;
>  	char *fs_count_source;
>  	int i;
> +	int colors_uniform;
>  
>  	glGenFramebuffersEXT(1, &fb);
>  	glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb);
> @@ -112,7 +139,7 @@ generate_and_display_drawbuffers(int count)
>  	glClearColor(1.0, 0.0, 0.0, 0.0);
>  	glClear(GL_COLOR_BUFFER_BIT);
>  
> -	/* Build the shader that spams green to all outputs. */
> +	/* Build the shader that writes different color to each buffer. */
>  	vs = piglit_compile_shader_text(GL_VERTEX_SHADER, vs_source);
>  
>  	fs_count_source = malloc(strlen(fs_source) + 5);
> @@ -126,6 +153,9 @@ generate_and_display_drawbuffers(int count)
>  	if (!piglit_check_gl_error(GL_NO_ERROR))
>  		piglit_report_result(PIGLIT_FAIL);
>  
> +	colors_uniform = glGetUniformLocation(prog, "colors");
> +	glUniform4fv(colors_uniform, MAX_TARGETS, (GLfloat *) colors);
> +
>  	/* Now render to all the color buffers. */
>  	piglit_draw_rect(-1, -1, 2, 2);
>  
> @@ -135,6 +165,7 @@ generate_and_display_drawbuffers(int count)
>  	piglit_ortho_projection(piglit_width, piglit_height, GL_FALSE);
>  	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
>  	glEnable(GL_TEXTURE_2D);
> +	/* draw row of boxes, each with the color from texture/target[i] */
>  	for (i = 0; i < count; i++) {
>  		glBindTexture(GL_TEXTURE_2D, tex[i]);
>  		piglit_draw_rect_tex(16 * i, 16 * (count - 1),
> @@ -154,22 +185,24 @@ enum piglit_result
>  piglit_display(void)
>  {
>  	GLboolean pass = GL_TRUE;
> -	float green[] = {0, 1, 0, 0};
>  	int count, i;
>  
>  	glClearColor(0.5, 0.5, 0.5, 0.5);
>  	glClear(GL_COLOR_BUFFER_BIT);
>  
> +
>  	for (count = 1; count <= max_targets; count++) {
>  		generate_and_display_drawbuffers(count);
>  	}
>  
> +	/* walk over rows */
>  	for (count = 1; count <= max_targets; count++) {
> +		/* walk over columns */
>  		for (i = 0; i < count; i++) {
>  			pass = pass &&
>  				piglit_probe_pixel_rgb(16 * i + 8,
>  						       16 * (count - 1) + 8,
> -						       green);
> +						       colors[i]);
>  		}
>  	}
>  
> @@ -183,9 +216,10 @@ piglit_init(int argc, char **argv)
>  {
>  	GLint max_attachments;
>  
> -	printf("The result should be increasing lengths of rows of green\n"
> -	       "boxes as the test increases the number of drawbuffers \n"
> -	       "targets used.\n");
> +	assert(ARRAY_SIZE(colors) == MAX_TARGETS);
> +
> +	printf("Each row tests a different number of drawing buffers.\n");
> +	printf("Each column tests a different color for a different buffer.\n");
>  
>  	piglit_ortho_projection(piglit_width, piglit_height, GL_FALSE);
>  
> @@ -195,13 +229,18 @@ piglit_init(int argc, char **argv)
>  	piglit_require_extension("GL_ARB_draw_buffers");
>  
>  	glGetIntegerv(GL_MAX_DRAW_BUFFERS_ARB, &max_targets);
> +	printf("GL_MAX_DRAW_BUFFERS_ARB = %d\n", max_targets);
> +
>  	if (max_targets < 2)
>  		piglit_report_result(PIGLIT_SKIP);
> +	if (max_targets > MAX_TARGETS) {
> +		printf("Warning: clamping GL_MAX_DRAW_BUFFERS to %d\n",
> +		       MAX_TARGETS);
> +		max_targets = MAX_TARGETS;
> +	}
>  
>  	glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, &max_attachments);
> +	printf("GL_MAX_COLOR_ATTACHMENTS_EXT = %d\n", max_attachments);
>  	if (max_targets > max_attachments)
>  		max_targets = max_attachments;
> -
> -	if (max_targets > 16)
> -		max_targets = 16;
>  }
> --
> 1.7.10.4
> 
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit
> 

Reviewed-by: Jose Fonseca <jfonseca at vmware.com>


More information about the Piglit mailing list