----- 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@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit
> 

Reviewed-by: Jose Fonseca <jfons...@vmware.com>
_______________________________________________
Piglit mailing list
Piglit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to