|
|
@@ -151,127 +151,79 @@ _swrast_span_default_texcoords( GLcontext *ctx, SWspan *span ) |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* Interpolate colors to fill in the span->array->color array. |
|
|
|
* \param specular if true, interpolate specular, else interpolate rgba. |
|
|
|
* Interpolate primary colors to fill in the span->array->color array. |
|
|
|
*/ |
|
|
|
static void |
|
|
|
interpolate_colors(GLcontext *ctx, SWspan *span, GLboolean specular) |
|
|
|
interpolate_colors(SWspan *span) |
|
|
|
{ |
|
|
|
const GLuint n = span->end; |
|
|
|
GLuint i; |
|
|
|
(void) ctx; |
|
|
|
|
|
|
|
if (!specular) { |
|
|
|
ASSERT((span->interpMask & SPAN_RGBA) && |
|
|
|
!(span->arrayMask & SPAN_RGBA)); |
|
|
|
} |
|
|
|
ASSERT((span->interpMask & SPAN_RGBA) && |
|
|
|
!(span->arrayMask & SPAN_RGBA)); |
|
|
|
|
|
|
|
if (span->interpMask & SPAN_FLAT) { |
|
|
|
/* constant color */ |
|
|
|
switch (span->array->ChanType) { |
|
|
|
switch (span->array->ChanType) { |
|
|
|
#if CHAN_BITS != 32 |
|
|
|
case GL_UNSIGNED_BYTE: |
|
|
|
{ |
|
|
|
GLubyte (*rgba)[4] = specular |
|
|
|
? span->array->color.sz1.spec : span->array->color.sz1.rgba; |
|
|
|
case GL_UNSIGNED_BYTE: |
|
|
|
{ |
|
|
|
GLubyte (*rgba)[4] = span->array->color.sz1.rgba; |
|
|
|
if (span->interpMask & SPAN_FLAT) { |
|
|
|
GLubyte color[4]; |
|
|
|
if (specular) { |
|
|
|
color[RCOMP] = FixedToInt(span->specRed); |
|
|
|
color[GCOMP] = FixedToInt(span->specGreen); |
|
|
|
color[BCOMP] = FixedToInt(span->specBlue); |
|
|
|
color[ACOMP] = 0; |
|
|
|
} |
|
|
|
else { |
|
|
|
color[RCOMP] = FixedToInt(span->red); |
|
|
|
color[GCOMP] = FixedToInt(span->green); |
|
|
|
color[BCOMP] = FixedToInt(span->blue); |
|
|
|
color[ACOMP] = FixedToInt(span->alpha); |
|
|
|
} |
|
|
|
color[RCOMP] = FixedToInt(span->red); |
|
|
|
color[GCOMP] = FixedToInt(span->green); |
|
|
|
color[BCOMP] = FixedToInt(span->blue); |
|
|
|
color[ACOMP] = FixedToInt(span->alpha); |
|
|
|
for (i = 0; i < n; i++) { |
|
|
|
COPY_4UBV(rgba[i], color); |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
case GL_UNSIGNED_SHORT: |
|
|
|
{ |
|
|
|
GLushort (*rgba)[4] = specular |
|
|
|
? span->array->color.sz2.spec : span->array->color.sz2.rgba; |
|
|
|
GLushort color[4]; |
|
|
|
if (specular) { |
|
|
|
color[RCOMP] = FixedToInt(span->specRed); |
|
|
|
color[GCOMP] = FixedToInt(span->specGreen); |
|
|
|
color[BCOMP] = FixedToInt(span->specBlue); |
|
|
|
color[ACOMP] = 0; |
|
|
|
} |
|
|
|
else { |
|
|
|
color[RCOMP] = FixedToInt(span->red); |
|
|
|
color[GCOMP] = FixedToInt(span->green); |
|
|
|
color[BCOMP] = FixedToInt(span->blue); |
|
|
|
color[ACOMP] = FixedToInt(span->alpha); |
|
|
|
} |
|
|
|
else { |
|
|
|
GLfixed r = span->red; |
|
|
|
GLfixed g = span->green; |
|
|
|
GLfixed b = span->blue; |
|
|
|
GLfixed a = span->alpha; |
|
|
|
GLint dr = span->redStep; |
|
|
|
GLint dg = span->greenStep; |
|
|
|
GLint db = span->blueStep; |
|
|
|
GLint da = span->alphaStep; |
|
|
|
for (i = 0; i < n; i++) { |
|
|
|
COPY_4V(rgba[i], color); |
|
|
|
rgba[i][RCOMP] = FixedToChan(r); |
|
|
|
rgba[i][GCOMP] = FixedToChan(g); |
|
|
|
rgba[i][BCOMP] = FixedToChan(b); |
|
|
|
rgba[i][ACOMP] = FixedToChan(a); |
|
|
|
r += dr; |
|
|
|
g += dg; |
|
|
|
b += db; |
|
|
|
a += da; |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
#endif |
|
|
|
case GL_FLOAT: |
|
|
|
{ |
|
|
|
GLfloat (*rgba)[4] = specular ? |
|
|
|
span->array->color.sz4.spec : span->array->color.sz4.rgba; |
|
|
|
GLfloat color[4]; |
|
|
|
ASSERT(CHAN_TYPE == GL_FLOAT); |
|
|
|
if (specular) { |
|
|
|
color[RCOMP] = span->specRed; |
|
|
|
color[GCOMP] = span->specGreen; |
|
|
|
color[BCOMP] = span->specBlue; |
|
|
|
color[ACOMP] = 0.0F; |
|
|
|
} |
|
|
|
else { |
|
|
|
color[RCOMP] = span->red; |
|
|
|
color[GCOMP] = span->green; |
|
|
|
color[BCOMP] = span->blue; |
|
|
|
color[ACOMP] = span->alpha; |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
case GL_UNSIGNED_SHORT: |
|
|
|
{ |
|
|
|
GLushort (*rgba)[4] = span->array->color.sz2.rgba; |
|
|
|
if (span->interpMask & SPAN_FLAT) { |
|
|
|
GLushort color[4]; |
|
|
|
color[RCOMP] = FixedToInt(span->red); |
|
|
|
color[GCOMP] = FixedToInt(span->green); |
|
|
|
color[BCOMP] = FixedToInt(span->blue); |
|
|
|
color[ACOMP] = FixedToInt(span->alpha); |
|
|
|
for (i = 0; i < n; i++) { |
|
|
|
COPY_4V(rgba[i], color); |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
default: |
|
|
|
_mesa_problem(ctx, "bad datatype in interpolate_colors"); |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
/* interpolate */ |
|
|
|
switch (span->array->ChanType) { |
|
|
|
#if CHAN_BITS != 32 |
|
|
|
case GL_UNSIGNED_BYTE: |
|
|
|
{ |
|
|
|
GLubyte (*rgba)[4] = specular |
|
|
|
? span->array->color.sz1.spec : span->array->color.sz1.rgba; |
|
|
|
else { |
|
|
|
GLushort (*rgba)[4] = span->array->color.sz2.rgba; |
|
|
|
GLfixed r, g, b, a; |
|
|
|
GLint dr, dg, db, da; |
|
|
|
if (specular) { |
|
|
|
r = span->specRed; |
|
|
|
g = span->specGreen; |
|
|
|
b = span->specBlue; |
|
|
|
a = 0; |
|
|
|
dr = span->specRedStep; |
|
|
|
dg = span->specGreenStep; |
|
|
|
db = span->specBlueStep; |
|
|
|
da = 0; |
|
|
|
} |
|
|
|
else { |
|
|
|
r = span->red; |
|
|
|
g = span->green; |
|
|
|
b = span->blue; |
|
|
|
a = span->alpha; |
|
|
|
dr = span->redStep; |
|
|
|
dg = span->greenStep; |
|
|
|
db = span->blueStep; |
|
|
|
da = span->alphaStep; |
|
|
|
} |
|
|
|
r = span->red; |
|
|
|
g = span->green; |
|
|
|
b = span->blue; |
|
|
|
a = span->alpha; |
|
|
|
dr = span->redStep; |
|
|
|
dg = span->greenStep; |
|
|
|
db = span->blueStep; |
|
|
|
da = span->alphaStep; |
|
|
|
for (i = 0; i < n; i++) { |
|
|
|
rgba[i][RCOMP] = FixedToChan(r); |
|
|
|
rgba[i][GCOMP] = FixedToChan(g); |
|
|
@@ -283,91 +235,155 @@ interpolate_colors(GLcontext *ctx, SWspan *span, GLboolean specular) |
|
|
|
a += da; |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
case GL_UNSIGNED_SHORT: |
|
|
|
{ |
|
|
|
GLushort (*rgba)[4] = specular |
|
|
|
? span->array->color.sz2.spec : span->array->color.sz2.rgba; |
|
|
|
GLfixed r, g, b, a; |
|
|
|
GLint dr, dg, db, da; |
|
|
|
if (specular) { |
|
|
|
r = span->specRed; |
|
|
|
g = span->specGreen; |
|
|
|
b = span->specBlue; |
|
|
|
a = 0; |
|
|
|
dr = span->specRedStep; |
|
|
|
dg = span->specGreenStep; |
|
|
|
db = span->specBlueStep; |
|
|
|
da = 0; |
|
|
|
} |
|
|
|
else { |
|
|
|
r = span->red; |
|
|
|
g = span->green; |
|
|
|
b = span->blue; |
|
|
|
a = span->alpha; |
|
|
|
dr = span->redStep; |
|
|
|
dg = span->greenStep; |
|
|
|
db = span->blueStep; |
|
|
|
da = span->alphaStep; |
|
|
|
} |
|
|
|
break; |
|
|
|
#endif |
|
|
|
case GL_FLOAT: |
|
|
|
{ |
|
|
|
GLfloat (*rgba)[4] = span->array->color.sz4.rgba; |
|
|
|
GLfloat r, g, b, a, dr, dg, db, da; |
|
|
|
r = span->red; |
|
|
|
g = span->green; |
|
|
|
b = span->blue; |
|
|
|
a = span->alpha; |
|
|
|
if (span->interpMask & SPAN_FLAT) { |
|
|
|
dr = dg = db = da = 0.0; |
|
|
|
} |
|
|
|
else { |
|
|
|
dr = span->redStep; |
|
|
|
dg = span->greenStep; |
|
|
|
db = span->blueStep; |
|
|
|
da = span->alphaStep; |
|
|
|
} |
|
|
|
for (i = 0; i < n; i++) { |
|
|
|
rgba[i][RCOMP] = r; |
|
|
|
rgba[i][GCOMP] = g; |
|
|
|
rgba[i][BCOMP] = b; |
|
|
|
rgba[i][ACOMP] = a; |
|
|
|
r += dr; |
|
|
|
g += dg; |
|
|
|
b += db; |
|
|
|
a += da; |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
default: |
|
|
|
_mesa_problem(NULL, "bad datatype in interpolate_colors"); |
|
|
|
} |
|
|
|
span->arrayMask |= SPAN_RGBA; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* Interpolate specular/secondary colors. |
|
|
|
*/ |
|
|
|
static void |
|
|
|
interpolate_specular(SWspan *span) |
|
|
|
{ |
|
|
|
const GLuint n = span->end; |
|
|
|
GLuint i; |
|
|
|
|
|
|
|
switch (span->array->ChanType) { |
|
|
|
case GL_UNSIGNED_BYTE: |
|
|
|
{ |
|
|
|
GLubyte (*spec)[4] = span->array->color.sz1.spec; |
|
|
|
if (span->interpMask & SPAN_FLAT) { |
|
|
|
GLubyte color[4]; |
|
|
|
color[RCOMP] = FixedToInt(span->specRed); |
|
|
|
color[GCOMP] = FixedToInt(span->specGreen); |
|
|
|
color[BCOMP] = FixedToInt(span->specBlue); |
|
|
|
color[ACOMP] = 0; |
|
|
|
for (i = 0; i < n; i++) { |
|
|
|
COPY_4UBV(spec[i], color); |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
GLfixed r = span->specRed; |
|
|
|
GLfixed g = span->specGreen; |
|
|
|
GLfixed b = span->specBlue; |
|
|
|
GLint dr = span->specRedStep; |
|
|
|
GLint dg = span->specGreenStep; |
|
|
|
GLint db = span->specBlueStep; |
|
|
|
for (i = 0; i < n; i++) { |
|
|
|
rgba[i][RCOMP] = FixedToChan(r); |
|
|
|
rgba[i][GCOMP] = FixedToChan(g); |
|
|
|
rgba[i][BCOMP] = FixedToChan(b); |
|
|
|
rgba[i][ACOMP] = FixedToChan(a); |
|
|
|
spec[i][RCOMP] = CLAMP(FixedToChan(r), 0, 255); |
|
|
|
spec[i][GCOMP] = CLAMP(FixedToChan(g), 0, 255); |
|
|
|
spec[i][BCOMP] = CLAMP(FixedToChan(b), 0, 255); |
|
|
|
spec[i][ACOMP] = 0; |
|
|
|
r += dr; |
|
|
|
g += dg; |
|
|
|
b += db; |
|
|
|
a += da; |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
#endif |
|
|
|
case GL_FLOAT: |
|
|
|
{ |
|
|
|
GLfloat (*rgba)[4] = specular ? |
|
|
|
span->array->color.sz4.spec : span->array->color.sz4.rgba; |
|
|
|
GLfloat r, g, b, a, dr, dg, db, da; |
|
|
|
if (specular) { |
|
|
|
r = span->specRed; |
|
|
|
g = span->specGreen; |
|
|
|
b = span->specBlue; |
|
|
|
a = 0.0F; |
|
|
|
dr = span->specRedStep; |
|
|
|
dg = span->specGreenStep; |
|
|
|
db = span->specBlueStep; |
|
|
|
da = 0.0F; |
|
|
|
} |
|
|
|
break; |
|
|
|
case GL_UNSIGNED_SHORT: |
|
|
|
{ |
|
|
|
GLushort (*spec)[4] = span->array->color.sz2.spec; |
|
|
|
if (span->interpMask & SPAN_FLAT) { |
|
|
|
GLushort color[4]; |
|
|
|
color[RCOMP] = FixedToInt(span->specRed); |
|
|
|
color[GCOMP] = FixedToInt(span->specGreen); |
|
|
|
color[BCOMP] = FixedToInt(span->specBlue); |
|
|
|
color[ACOMP] = 0; |
|
|
|
for (i = 0; i < n; i++) { |
|
|
|
COPY_4V(spec[i], color); |
|
|
|
} |
|
|
|
else { |
|
|
|
r = span->red; |
|
|
|
g = span->green; |
|
|
|
b = span->blue; |
|
|
|
a = span->alpha; |
|
|
|
dr = span->redStep; |
|
|
|
dg = span->greenStep; |
|
|
|
db = span->blueStep; |
|
|
|
da = span->alphaStep; |
|
|
|
} |
|
|
|
else { |
|
|
|
GLfixed r = FloatToFixed(span->specRed); |
|
|
|
GLfixed g = FloatToFixed(span->specGreen); |
|
|
|
GLfixed b = FloatToFixed(span->specBlue); |
|
|
|
GLint dr = FloatToFixed(span->specRedStep); |
|
|
|
GLint dg = FloatToFixed(span->specGreenStep); |
|
|
|
GLint db = FloatToFixed(span->specBlueStep); |
|
|
|
for (i = 0; i < n; i++) { |
|
|
|
spec[i][RCOMP] = FixedToInt(r); |
|
|
|
spec[i][GCOMP] = FixedToInt(g); |
|
|
|
spec[i][BCOMP] = FixedToInt(b); |
|
|
|
spec[i][ACOMP] = 0; |
|
|
|
r += dr; |
|
|
|
g += dg; |
|
|
|
b += db; |
|
|
|
} |
|
|
|
/* |
|
|
|
ASSERT(CHAN_TYPE == GL_FLOAT); |
|
|
|
*/ |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
case GL_FLOAT: |
|
|
|
{ |
|
|
|
GLfloat (*spec)[4] = span->array->color.sz4.spec; |
|
|
|
if (span->interpMask & SPAN_FLAT) { |
|
|
|
GLfloat color[4]; |
|
|
|
color[RCOMP] = span->specRed; |
|
|
|
color[GCOMP] = span->specGreen; |
|
|
|
color[BCOMP] = span->specBlue; |
|
|
|
color[ACOMP] = 0.0F; |
|
|
|
for (i = 0; i < n; i++) { |
|
|
|
rgba[i][RCOMP] = r; |
|
|
|
rgba[i][GCOMP] = g; |
|
|
|
rgba[i][BCOMP] = b; |
|
|
|
rgba[i][ACOMP] = a; |
|
|
|
COPY_4V(spec[i], color); |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
GLfloat r = span->specRed; |
|
|
|
GLfloat g = span->specGreen; |
|
|
|
GLfloat b = span->specBlue; |
|
|
|
GLfloat dr = span->specRedStep; |
|
|
|
GLfloat dg = span->specGreenStep; |
|
|
|
GLfloat db = span->specBlueStep; |
|
|
|
for (i = 0; i < n; i++) { |
|
|
|
spec[i][RCOMP] = r; |
|
|
|
spec[i][GCOMP] = g; |
|
|
|
spec[i][BCOMP] = b; |
|
|
|
spec[i][ACOMP] = 0.0F; |
|
|
|
r += dr; |
|
|
|
g += dg; |
|
|
|
b += db; |
|
|
|
a += da; |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
default: |
|
|
|
_mesa_problem(ctx, "bad datatype in interpolate_colors"); |
|
|
|
} |
|
|
|
break; |
|
|
|
default: |
|
|
|
_mesa_problem(NULL, "bad datatype in interpolate_specular"); |
|
|
|
} |
|
|
|
span->arrayMask |= (specular ? SPAN_SPEC : SPAN_RGBA); |
|
|
|
span->arrayMask |= SPAN_SPEC; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@@ -1228,15 +1244,17 @@ apply_aa_coverage(SWspan *span) |
|
|
|
if (span->array->ChanType == GL_UNSIGNED_BYTE) { |
|
|
|
GLubyte (*rgba)[4] = span->array->color.sz1.rgba; |
|
|
|
for (i = 0; i < span->end; i++) { |
|
|
|
const GLfloat a = rgba[i][ACOMP] * coverage[i]; |
|
|
|
rgba[i][ACOMP] = (GLubyte) CLAMP(a, 0.0, 255.0); |
|
|
|
ASSERT(coverage[i] >= 0.0); |
|
|
|
ASSERT(coverage[i] <= 1.0); |
|
|
|
UNCLAMPED_FLOAT_TO_UBYTE(rgba[i][ACOMP], rgba[i][ACOMP] * coverage[i]); |
|
|
|
} |
|
|
|
} |
|
|
|
else if (span->array->ChanType == GL_UNSIGNED_SHORT) { |
|
|
|
GLushort (*rgba)[4] = span->array->color.sz2.rgba; |
|
|
|
for (i = 0; i < span->end; i++) { |
|
|
|
UNCLAMPED_FLOAT_TO_USHORT(rgba[i][ACOMP], rgba[i][ACOMP] * coverage[i]); |
|
|
|
const GLfloat a = rgba[i][ACOMP] * coverage[i]; |
|
|
|
rgba[i][ACOMP] = (GLushort) CLAMP(a, 0.0, 65535.0); |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
@@ -1367,10 +1385,10 @@ _swrast_write_rgba_span( GLcontext *ctx, SWspan *span) |
|
|
|
if (!deferredTexture) { |
|
|
|
/* Now we need the rgba array, fill it in if needed */ |
|
|
|
if ((span->interpMask & SPAN_RGBA) && (span->arrayMask & SPAN_RGBA) == 0) |
|
|
|
interpolate_colors(ctx, span, GL_FALSE); |
|
|
|
interpolate_colors(span); |
|
|
|
|
|
|
|
if (span->interpMask & SPAN_SPEC) |
|
|
|
interpolate_colors(ctx, span, GL_TRUE); |
|
|
|
interpolate_specular(span); |
|
|
|
|
|
|
|
if (span->interpMask & SPAN_FOG) |
|
|
|
interpolate_fog(ctx, span); |
|
|
@@ -1455,10 +1473,10 @@ _swrast_write_rgba_span( GLcontext *ctx, SWspan *span) |
|
|
|
if (deferredTexture) { |
|
|
|
/* Now we need the rgba array, fill it in if needed */ |
|
|
|
if ((span->interpMask & SPAN_RGBA) && (span->arrayMask & SPAN_RGBA) == 0) |
|
|
|
interpolate_colors(ctx, span, GL_FALSE); |
|
|
|
interpolate_colors(span); |
|
|
|
|
|
|
|
if (span->interpMask & SPAN_SPEC) |
|
|
|
interpolate_colors(ctx, span, GL_TRUE); |
|
|
|
interpolate_specular(span); |
|
|
|
|
|
|
|
if (span->interpMask & SPAN_FOG) |
|
|
|
interpolate_fog(ctx, span); |
|
|
@@ -1487,7 +1505,7 @@ _swrast_write_rgba_span( GLcontext *ctx, SWspan *span) |
|
|
|
(ctx->Light.Enabled && |
|
|
|
ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR)) { |
|
|
|
if (span->interpMask & SPAN_SPEC) { |
|
|
|
interpolate_colors(ctx, span, GL_TRUE); |
|
|
|
interpolate_specular(span); |
|
|
|
} |
|
|
|
if (span->arrayMask & SPAN_SPEC) { |
|
|
|
add_specular(ctx, span); |