GL_ADD texture mode was incorrect, renamed some vars

This commit is contained in:
Brian Paul 2001-09-19 22:21:13 +00:00
parent 7c4268176e
commit 7152305e0a

View file

@ -1,4 +1,4 @@
/* $Id: s_triangle.c,v 1.38 2001/09/19 20:30:44 kschultz Exp $ */
/* $Id: s_triangle.c,v 1.39 2001/09/19 22:21:13 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -344,11 +344,16 @@ struct affine_info
GLint fixedToDepthShift;
};
/* This function can handle GL_NEAREST or GL_LINEAR sampling of 2D RGB or RGBA
* textures with GL_REPLACE, GL_MODULATE, GL_BLEND, GL_DECAL or GL_ADD
* texture env modes.
*/
static void
affine_span(GLcontext *ctx, struct triangle_span *span,
struct affine_info *info)
{
GLchan tmp_col[4];
GLchan sample[4]; /* the filtered texture sample */
/* Instead of defining a function for each mode, a test is done
* between the outer and inner loops. This is to reduce code size
@ -357,75 +362,71 @@ affine_span(GLcontext *ctx, struct triangle_span *span,
*/
#define NEAREST_RGB \
tmp_col[RCOMP] = tex00[RCOMP]; \
tmp_col[GCOMP] = tex00[GCOMP]; \
tmp_col[BCOMP] = tex00[BCOMP]; \
tmp_col[ACOMP] = CHAN_MAX
sample[RCOMP] = tex00[RCOMP]; \
sample[GCOMP] = tex00[GCOMP]; \
sample[BCOMP] = tex00[BCOMP]; \
sample[ACOMP] = CHAN_MAX
#define LINEAR_RGB \
tmp_col[RCOMP] = (ti * (si * tex00[0] + sf * tex01[0]) + \
sample[RCOMP] = (ti * (si * tex00[0] + sf * tex01[0]) + \
tf * (si * tex10[0] + sf * tex11[0])) >> 2 * FIXED_SHIFT; \
tmp_col[GCOMP] = (ti * (si * tex00[1] + sf * tex01[1]) + \
sample[GCOMP] = (ti * (si * tex00[1] + sf * tex01[1]) + \
tf * (si * tex10[1] + sf * tex11[1])) >> 2 * FIXED_SHIFT; \
tmp_col[BCOMP] = (ti * (si * tex00[2] + sf * tex01[2]) + \
sample[BCOMP] = (ti * (si * tex00[2] + sf * tex01[2]) + \
tf * (si * tex10[2] + sf * tex11[2])) >> 2 * FIXED_SHIFT; \
tmp_col[ACOMP] = CHAN_MAX
sample[ACOMP] = CHAN_MAX
#define NEAREST_RGBA COPY_CHAN4(tmp_col, tex00)
#define NEAREST_RGBA COPY_CHAN4(sample, tex00)
#define LINEAR_RGBA \
tmp_col[RCOMP] = (ti * (si * tex00[0] + sf * tex01[0]) + \
sample[RCOMP] = (ti * (si * tex00[0] + sf * tex01[0]) + \
tf * (si * tex10[0] + sf * tex11[0])) >> 2 * FIXED_SHIFT;\
tmp_col[GCOMP] = (ti * (si * tex00[1] + sf * tex01[1]) + \
sample[GCOMP] = (ti * (si * tex00[1] + sf * tex01[1]) + \
tf * (si * tex10[1] + sf * tex11[1])) >> 2 * FIXED_SHIFT;\
tmp_col[BCOMP] = (ti * (si * tex00[2] + sf * tex01[2]) + \
sample[BCOMP] = (ti * (si * tex00[2] + sf * tex01[2]) + \
tf * (si * tex10[2] + sf * tex11[2])) >> 2 * FIXED_SHIFT;\
tmp_col[ACOMP] = (ti * (si * tex00[3] + sf * tex01[3]) + \
sample[ACOMP] = (ti * (si * tex00[3] + sf * tex01[3]) + \
tf * (si * tex10[3] + sf * tex11[3])) >> 2 * FIXED_SHIFT
#define MODULATE \
dest[RCOMP] = span->red * (tmp_col[RCOMP] + 1u) >> (FIXED_SHIFT + 8); \
dest[GCOMP] = span->green * (tmp_col[GCOMP] + 1u) >> (FIXED_SHIFT + 8); \
dest[BCOMP] = span->blue * (tmp_col[BCOMP] + 1u) >> (FIXED_SHIFT + 8); \
dest[ACOMP] = span->alpha * (tmp_col[ACOMP] + 1u) >> (FIXED_SHIFT + 8)
dest[RCOMP] = span->red * (sample[RCOMP] + 1u) >> (FIXED_SHIFT + 8); \
dest[GCOMP] = span->green * (sample[GCOMP] + 1u) >> (FIXED_SHIFT + 8); \
dest[BCOMP] = span->blue * (sample[BCOMP] + 1u) >> (FIXED_SHIFT + 8); \
dest[ACOMP] = span->alpha * (sample[ACOMP] + 1u) >> (FIXED_SHIFT + 8)
#define DECAL \
dest[RCOMP] = ((CHAN_MAX - tmp_col[ACOMP]) * span->red + \
((tmp_col[ACOMP] + 1) * tmp_col[RCOMP] << FIXED_SHIFT)) \
dest[RCOMP] = ((CHAN_MAX - sample[ACOMP]) * span->red + \
((sample[ACOMP] + 1) * sample[RCOMP] << FIXED_SHIFT)) \
>> (FIXED_SHIFT + 8); \
dest[GCOMP] = ((CHAN_MAX - tmp_col[ACOMP]) * span->green + \
((tmp_col[ACOMP] + 1) * tmp_col[GCOMP] << FIXED_SHIFT)) \
dest[GCOMP] = ((CHAN_MAX - sample[ACOMP]) * span->green + \
((sample[ACOMP] + 1) * sample[GCOMP] << FIXED_SHIFT)) \
>> (FIXED_SHIFT + 8); \
dest[BCOMP] = ((CHAN_MAX - tmp_col[ACOMP]) * span->blue + \
((tmp_col[ACOMP] + 1) * tmp_col[BCOMP] << FIXED_SHIFT)) \
dest[BCOMP] = ((CHAN_MAX - sample[ACOMP]) * span->blue + \
((sample[ACOMP] + 1) * sample[BCOMP] << FIXED_SHIFT)) \
>> (FIXED_SHIFT + 8); \
dest[ACOMP] = FixedToInt(span->alpha)
#define BLEND \
dest[RCOMP] = ((CHAN_MAX - tmp_col[RCOMP]) * span->red \
+ (tmp_col[RCOMP] + 1) * info->er) >> (FIXED_SHIFT + 8); \
dest[GCOMP] = ((CHAN_MAX - tmp_col[GCOMP]) * span->green \
+ (tmp_col[GCOMP] + 1) * info->eg) >> (FIXED_SHIFT + 8); \
dest[BCOMP] = ((CHAN_MAX - tmp_col[BCOMP]) * span->blue \
+ (tmp_col[BCOMP] + 1) * info->eb) >> (FIXED_SHIFT + 8); \
dest[ACOMP] = span->alpha * (tmp_col[ACOMP] + 1) >> (FIXED_SHIFT + 8)
dest[RCOMP] = ((CHAN_MAX - sample[RCOMP]) * span->red \
+ (sample[RCOMP] + 1) * info->er) >> (FIXED_SHIFT + 8); \
dest[GCOMP] = ((CHAN_MAX - sample[GCOMP]) * span->green \
+ (sample[GCOMP] + 1) * info->eg) >> (FIXED_SHIFT + 8); \
dest[BCOMP] = ((CHAN_MAX - sample[BCOMP]) * span->blue \
+ (sample[BCOMP] + 1) * info->eb) >> (FIXED_SHIFT + 8); \
dest[ACOMP] = span->alpha * (sample[ACOMP] + 1) >> (FIXED_SHIFT + 8)
#define REPLACE COPY_CHAN4(dest, tmp_col)
#define I2CHAN_CLAMP(I) (GLchan) ((I) & CHAN_MAX)
/* equivalent to '(GLchan) MIN2((I),CHAN_MAX)' */
#define REPLACE COPY_CHAN4(dest, sample)
#define ADD \
dest[RCOMP] = MIN2(((span->red << 8) + \
(tmp_col[RCOMP] + 1) * info->er) \
>> (FIXED_SHIFT + 8), CHAN_MAX); \
dest[GCOMP] = MIN2(((span->green << 8) + \
(tmp_col[GCOMP] + 1) * info->eg) \
>> (FIXED_SHIFT + 8), CHAN_MAX); \
dest[RCOMP] = MIN2(((span->blue << 8) + \
(tmp_col[BCOMP] + 1) * info->eb) \
>> (FIXED_SHIFT + 8), CHAN_MAX); \
dest[ACOMP] = span->alpha * (tmp_col[ACOMP] + 1) >> (FIXED_SHIFT + 8)
{ \
GLint rSum = FixedToInt(span->red) + (GLint) sample[RCOMP]; \
GLint gSum = FixedToInt(span->green) + (GLint) sample[GCOMP]; \
GLint bSum = FixedToInt(span->blue) + (GLint) sample[BCOMP]; \
dest[RCOMP] = MIN2(rSum, CHAN_MAX); \
dest[GCOMP] = MIN2(gSum, CHAN_MAX); \
dest[BCOMP] = MIN2(bSum, CHAN_MAX); \
dest[ACOMP] = span->alpha * (sample[ACOMP] + 1) >> (FIXED_SHIFT + 8); \
}
/* shortcuts */
@ -687,7 +688,7 @@ struct persp_info
GLint smask, tmask;
GLint twidth_log2;
const GLchan *texture;
GLchan er, eg, eb, ea;
GLchan er, eg, eb, ea; /* texture env color */
GLint tbytesline, tsize;
GLint fixedToDepthShift;
};
@ -697,7 +698,7 @@ static void
fast_persp_span(GLcontext *ctx, struct triangle_span *span,
struct persp_info *info)
{
GLchan tmp_col[4];
GLchan sample[4]; /* the filtered texture sample */
/* Instead of defining a function for each mode, a test is done
* between the outer and inner loops. This is to reduce code size