On Fri, Nov 18, 2011 at 03:38:46PM +0800, Yuanhan Liu wrote:
> 
> The two patches tries to fix an issue that happened while calling glDrawPixels
> with texture enabled. 
> 
> Here I attached a piglit testcase for this issue.
> 
> 
> 
> 
> Yuanhan Liu (2):
>   swrast: simplify the prototype of function texture_combine
>   swrast: fix unmatched span->array->ChanType
> 
>  src/mesa/swrast/s_texcombine.c |   24 ++++++++++++++----------
>  1 files changed, 14 insertions(+), 10 deletions(-)
> 
> -- 
> 1.7.4.4
> 
> 
> Here is the piglit testcase:
> --
> >From c199828cddae5bd0f8e96d586b91be6ad423dbce Mon Sep 17 00:00:00 2001
> From: Yuanhan Liu <yuanhan....@linux.intel.com>
> Date: Fri, 18 Nov 2011 15:37:33 +0800
> Subject: [PATCH] Add a draw-pixel-with-texture testcase
> 
> Add a draw-pixel-with-texture testcase to check if sampling is happened
> while drawing pixels by glDrawPixels.
> 
> Signed-off-by: Yuanhan Liu <yuanhan....@linux.intel.com>
> ---

[snip..]

> +#include "piglit-util.h"
> +
> +int piglit_width = 100, piglit_height = 100;
> +int piglit_window_mode = GLUT_RGB | GLUT_DOUBLE;
> +
> +
> +enum piglit_result
> +piglit_display(void)
> +{
> +     GLboolean pass = GL_TRUE;
> +     GLfloat tex_data[2 * 2 * 4] = {
> +             1, 0, 0, 1,     1, 0, 0, 1,
> +             1, 0, 0, 1,     1, 0, 0, 1,
> +     };
> +     GLfloat pixels[20 * 20 * 4];
> +     GLfloat expected[4] = {0.2, 0, 0, 1};
> +     int i;
> +
> +     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_FLOAT, 
> tex_data);
> +     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
> +     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
> +     glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

If GL_MODULATE was changed to GL_REPLACE, then the two patches does fix
this issue. 

if GL_TEXTURE_ENV_MODE was set to GL_MODULATE, then the final color
should be pixels_color(as GL_PRIMARY_COLOR) * texture_color. But the
result is black. Since the current code did:
  1. combine->SourceRGB[1] was set to GL_PREVIOUS but not GL_PRIMARY_COLOR.
  2. Do not use primary_rgba, as swrast->_TextureCombinePrimary was set FALSE.

Actually, the two are of the same issue. 2 was caused by 1. And we have
no previous texture, thus got a final color equal to "texture_color *
(0, 0, 0, 0) = (0, 0, 0, 0).

I made a _quite_ dirty(too dirty that myself doesn't accept it) patch to fix
this issue. I may need to dig this issue furthre. But before that, comments
and ideas are welcome.

Thanks,
Yuanhan Liu

> +
> +     glTexCoord2f(0.5, 0.5);
> +     glEnable(GL_TEXTURE_2D);
> +
> +     for (i = 0; i < 20 * 20 * 4; i += 4) {
> +             pixels[i + 0] = 0.2;
> +             pixels[i + 1] = 1;
> +             pixels[i + 2] = 0;
> +             pixels[i + 3] = 1;
> +     }
> +
> +     glClear(GL_COLOR_BUFFER_BIT);
> +
> +     glDrawPixels(20, 20, GL_RGBA, GL_FLOAT, pixels);
> +
> +     /* Here just sample a small set of pixels */
> +     pass &= piglit_probe_pixel_rgba(5, 5, expected);
> +     pass &= piglit_probe_pixel_rgba(7, 12, expected);
> +     pass &= piglit_probe_pixel_rgba(10, 10, expected);
> +     pass &= piglit_probe_pixel_rgba(18, 18, expected);
> +
> +     glutSwapBuffers();
> +
> +     return pass ? PIGLIT_PASS : PIGLIT_FAIL;
> +}
> +
> +
> +void
> +piglit_init(int argc, char **argv)
> +{
> +     glClearColor(0.0, 0.0, 0.0, 1.0);
> +}
> -- 
> 1.7.4.4
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to