swrast: general clean-up of texture combine code

This commit is contained in:
Brian Paul
2009-03-08 14:38:37 -06:00
parent de2afd8688
commit 933f3b13c3
+161 -246
View File
@@ -62,19 +62,16 @@ texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
GLchan (*rgbaChan)[4] )
{
const struct gl_texture_unit *textureUnit = &(ctx->Texture.Unit[unit]);
const struct gl_tex_env_combine_state *combine = textureUnit->_CurrentCombine;
const GLfloat (*argRGB [MAX_COMBINER_TERMS])[4];
const GLfloat (*argA [MAX_COMBINER_TERMS])[4];
const GLint RGBshift = textureUnit->_CurrentCombine->ScaleShiftRGB;
const GLuint Ashift = textureUnit->_CurrentCombine->ScaleShiftA;
const GLfloat RGBmult = (GLfloat) (1 << RGBshift);
const GLfloat Amult = (GLfloat) (1 << Ashift);
static const GLfloat one[4] = { 1, 1, 1, 1 };
static const GLfloat zero[4] = { 0, 0, 0, 0 };
const GLuint numColorArgs = textureUnit->_CurrentCombine->_NumArgsRGB;
const GLuint numAlphaArgs = textureUnit->_CurrentCombine->_NumArgsA;
const GLfloat RGBmult = (GLfloat) (1 << combine->ScaleShiftRGB);
const GLfloat Amult = (GLfloat) (1 << combine->ScaleShiftA);
const GLuint numColorArgs = combine->_NumArgsRGB;
const GLuint numAlphaArgs = combine->_NumArgsA;
GLfloat ccolor[MAX_COMBINER_TERMS][MAX_WIDTH][4]; /* temp color buffers */
GLfloat rgba[MAX_WIDTH][4];
GLuint i, j;
GLuint i, term;
ASSERT(ctx->Extensions.EXT_texture_env_combine ||
ctx->Extensions.ARB_texture_env_combine);
@@ -89,34 +86,35 @@ texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
/*
printf("modeRGB 0x%x modeA 0x%x srcRGB1 0x%x srcA1 0x%x srcRGB2 0x%x srcA2 0x%x\n",
textureUnit->_CurrentCombine->ModeRGB,
textureUnit->_CurrentCombine->ModeA,
textureUnit->_CurrentCombine->SourceRGB[0],
textureUnit->_CurrentCombine->SourceA[0],
textureUnit->_CurrentCombine->SourceRGB[1],
textureUnit->_CurrentCombine->SourceA[1]);
combine->ModeRGB,
combine->ModeA,
combine->SourceRGB[0],
combine->SourceA[0],
combine->SourceRGB[1],
combine->SourceA[1]);
*/
/*
* Do operand setup for up to 4 operands. Loop over the terms.
*/
for (j = 0; j < numColorArgs; j++) {
const GLenum srcRGB = textureUnit->_CurrentCombine->SourceRGB[j];
for (term = 0; term < numColorArgs; term++) {
const GLenum srcRGB = combine->SourceRGB[term];
const GLenum operandRGB = combine->OperandRGB[term];
switch (srcRGB) {
case GL_TEXTURE:
argRGB[j] = (const GLfloat (*)[4])
argRGB[term] = (const GLfloat (*)[4])
(texelBuffer + unit * (n * 4 * sizeof(GLfloat)));
break;
case GL_PRIMARY_COLOR:
argRGB[j] = primary_rgba;
argRGB[term] = primary_rgba;
break;
case GL_PREVIOUS:
argRGB[j] = (const GLfloat (*)[4]) rgba;
argRGB[term] = (const GLfloat (*)[4]) rgba;
break;
case GL_CONSTANT:
{
GLfloat (*c)[4] = ccolor[j];
GLfloat (*c)[4] = ccolor[term];
GLfloat red = textureUnit->EnvColor[0];
GLfloat green = textureUnit->EnvColor[1];
GLfloat blue = textureUnit->EnvColor[2];
@@ -124,27 +122,27 @@ texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
for (i = 0; i < n; i++) {
ASSIGN_4V(c[i], red, green, blue, alpha);
}
argRGB[j] = (const GLfloat (*)[4]) ccolor[j];
argRGB[term] = (const GLfloat (*)[4]) ccolor[term];
}
break;
/* GL_ATI_texture_env_combine3 allows GL_ZERO & GL_ONE as sources.
*/
case GL_ZERO:
{
GLfloat (*c)[4] = ccolor[j];
GLfloat (*c)[4] = ccolor[term];
for (i = 0; i < n; i++) {
ASSIGN_4V(c[i], 0.0F, 0.0F, 0.0F, 0.0F);
}
argRGB[j] = (const GLfloat (*)[4]) ccolor[j];
argRGB[term] = (const GLfloat (*)[4]) ccolor[term];
}
break;
case GL_ONE:
{
GLfloat (*c)[4] = ccolor[j];
GLfloat (*c)[4] = ccolor[term];
for (i = 0; i < n; i++) {
ASSIGN_4V(c[i], 1.0F, 1.0F, 1.0F, 1.0F);
}
argRGB[j] = (const GLfloat (*)[4]) ccolor[j];
argRGB[term] = (const GLfloat (*)[4]) ccolor[term];
}
break;
default:
@@ -154,39 +152,42 @@ texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
ASSERT(srcUnit < ctx->Const.MaxTextureUnits);
if (!ctx->Texture.Unit[srcUnit]._ReallyEnabled)
return;
argRGB[j] = (const GLfloat (*)[4])
argRGB[term] = (const GLfloat (*)[4])
(texelBuffer + srcUnit * (n * 4 * sizeof(GLfloat)));
}
}
if (textureUnit->_CurrentCombine->OperandRGB[j] != GL_SRC_COLOR) {
const GLfloat (*src)[4] = argRGB[j];
GLfloat (*dst)[4] = ccolor[j];
if (operandRGB != GL_SRC_COLOR) {
const GLfloat (*src)[4] = argRGB[term];
GLfloat (*dst)[4] = ccolor[term];
/* point to new arg[j] storage */
argRGB[j] = (const GLfloat (*)[4]) ccolor[j];
/* point to new arg[term] storage */
argRGB[term] = (const GLfloat (*)[4]) ccolor[term];
if (textureUnit->_CurrentCombine->OperandRGB[j] == GL_ONE_MINUS_SRC_COLOR) {
switch (operandRGB) {
case GL_ONE_MINUS_SRC_COLOR:
for (i = 0; i < n; i++) {
dst[i][RCOMP] = 1.0F - src[i][RCOMP];
dst[i][GCOMP] = 1.0F - src[i][GCOMP];
dst[i][BCOMP] = 1.0F - src[i][BCOMP];
}
}
else if (textureUnit->_CurrentCombine->OperandRGB[j] == GL_SRC_ALPHA) {
break;
case GL_SRC_ALPHA:
for (i = 0; i < n; i++) {
dst[i][RCOMP] = src[i][ACOMP];
dst[i][GCOMP] = src[i][ACOMP];
dst[i][BCOMP] = src[i][ACOMP];
}
}
else {
ASSERT(textureUnit->_CurrentCombine->OperandRGB[j] ==GL_ONE_MINUS_SRC_ALPHA);
break;
case GL_ONE_MINUS_SRC_ALPHA:
for (i = 0; i < n; i++) {
dst[i][RCOMP] = 1.0F - src[i][ACOMP];
dst[i][GCOMP] = 1.0F - src[i][ACOMP];
dst[i][BCOMP] = 1.0F - src[i][ACOMP];
}
break;
default:
_mesa_problem(ctx, "Bad operandRGB");
}
}
}
@@ -194,36 +195,47 @@ texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
/*
* Set up the argA[i] pointers
*/
for (j = 0; j < numAlphaArgs; j++) {
const GLenum srcA = textureUnit->_CurrentCombine->SourceA[j];
for (term = 0; term < numAlphaArgs; term++) {
const GLenum srcA = combine->SourceA[term];
const GLenum operandA = combine->OperandA[term];
switch (srcA) {
case GL_TEXTURE:
argA[j] = (const GLfloat (*)[4])
argA[term] = (const GLfloat (*)[4])
(texelBuffer + unit * (n * 4 * sizeof(GLfloat)));
break;
case GL_PRIMARY_COLOR:
argA[j] = primary_rgba;
argA[term] = primary_rgba;
break;
case GL_PREVIOUS:
argA[j] = (const GLfloat (*)[4]) rgba;
argA[term] = (const GLfloat (*)[4]) rgba;
break;
case GL_CONSTANT:
{
GLfloat alpha, (*c)[4] = ccolor[j];
alpha = textureUnit->EnvColor[3];
GLfloat (*c)[4] = ccolor[term];
GLfloat alpha = textureUnit->EnvColor[3];
for (i = 0; i < n; i++)
c[i][ACOMP] = alpha;
argA[j] = (const GLfloat (*)[4]) ccolor[j];
argA[term] = (const GLfloat (*)[4]) ccolor[term];
}
break;
/* GL_ATI_texture_env_combine3 allows GL_ZERO & GL_ONE as sources.
*/
case GL_ZERO:
argA[j] = & zero;
{
GLfloat (*c)[4] = ccolor[term];
for (i = 0; i < n; i++)
c[i][ACOMP] = 0.0F;
argA[term] = (const GLfloat (*)[4]) ccolor[term];
}
break;
case GL_ONE:
argA[j] = & one;
{
GLfloat (*c)[4] = ccolor[term];
for (i = 0; i < n; i++)
c[i][ACOMP] = 1.0F;
argA[term] = (const GLfloat (*)[4]) ccolor[term];
}
break;
default:
/* ARB_texture_env_crossbar source */
@@ -232,62 +244,46 @@ texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
ASSERT(srcUnit < ctx->Const.MaxTextureUnits);
if (!ctx->Texture.Unit[srcUnit]._ReallyEnabled)
return;
argA[j] = (const GLfloat (*)[4])
argA[term] = (const GLfloat (*)[4])
(texelBuffer + srcUnit * (n * 4 * sizeof(GLfloat)));
}
}
if (textureUnit->_CurrentCombine->OperandA[j] == GL_ONE_MINUS_SRC_ALPHA) {
const GLfloat (*src)[4] = argA[j];
GLfloat (*dst)[4] = ccolor[j];
argA[j] = (const GLfloat (*)[4]) ccolor[j];
if (operandA == GL_ONE_MINUS_SRC_ALPHA) {
const GLfloat (*src)[4] = argA[term];
GLfloat (*dst)[4] = ccolor[term];
argA[term] = (const GLfloat (*)[4]) ccolor[term];
for (i = 0; i < n; i++) {
dst[i][ACOMP] = 1.0F - src[i][ACOMP];
}
}
}
/*
* Do the texture combine.
*/
switch (textureUnit->_CurrentCombine->ModeRGB) {
/* RGB channel combine */
{
const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argRGB[0];
const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argRGB[1];
const GLfloat (*arg2)[4] = (const GLfloat (*)[4]) argRGB[2];
const GLfloat (*arg3)[4] = (const GLfloat (*)[4]) argRGB[3];
switch (combine->ModeRGB) {
case GL_REPLACE:
{
const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argRGB[0];
if (RGBshift) {
for (i = 0; i < n; i++) {
rgba[i][RCOMP] = arg0[i][RCOMP] * RGBmult;
rgba[i][GCOMP] = arg0[i][GCOMP] * RGBmult;
rgba[i][BCOMP] = arg0[i][BCOMP] * RGBmult;
}
}
else {
for (i = 0; i < n; i++) {
rgba[i][RCOMP] = arg0[i][RCOMP];
rgba[i][GCOMP] = arg0[i][GCOMP];
rgba[i][BCOMP] = arg0[i][BCOMP];
}
}
for (i = 0; i < n; i++) {
rgba[i][RCOMP] = arg0[i][RCOMP] * RGBmult;
rgba[i][GCOMP] = arg0[i][GCOMP] * RGBmult;
rgba[i][BCOMP] = arg0[i][BCOMP] * RGBmult;
}
break;
case GL_MODULATE:
{
const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argRGB[0];
const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argRGB[1];
for (i = 0; i < n; i++) {
rgba[i][RCOMP] = arg0[i][RCOMP] * arg1[i][RCOMP] * RGBmult;
rgba[i][GCOMP] = arg0[i][GCOMP] * arg1[i][GCOMP] * RGBmult;
rgba[i][BCOMP] = arg0[i][BCOMP] * arg1[i][BCOMP] * RGBmult;
}
for (i = 0; i < n; i++) {
rgba[i][RCOMP] = arg0[i][RCOMP] * arg1[i][RCOMP] * RGBmult;
rgba[i][GCOMP] = arg0[i][GCOMP] * arg1[i][GCOMP] * RGBmult;
rgba[i][BCOMP] = arg0[i][BCOMP] * arg1[i][BCOMP] * RGBmult;
}
break;
case GL_ADD:
if (textureUnit->EnvMode == GL_COMBINE4_NV) {
/* (a * b) + (c * d) */
const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argRGB[0];
const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argRGB[1];
const GLfloat (*arg2)[4] = (const GLfloat (*)[4]) argRGB[2];
const GLfloat (*arg3)[4] = (const GLfloat (*)[4]) argRGB[3];
for (i = 0; i < n; i++) {
rgba[i][RCOMP] = (arg0[i][RCOMP] * arg1[i][RCOMP] +
arg2[i][RCOMP] * arg3[i][RCOMP]) * RGBmult;
@@ -299,8 +295,6 @@ texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
}
else {
/* 2-term addition */
const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argRGB[0];
const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argRGB[1];
for (i = 0; i < n; i++) {
rgba[i][RCOMP] = (arg0[i][RCOMP] + arg1[i][RCOMP]) * RGBmult;
rgba[i][GCOMP] = (arg0[i][GCOMP] + arg1[i][GCOMP]) * RGBmult;
@@ -311,10 +305,6 @@ texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
case GL_ADD_SIGNED:
if (textureUnit->EnvMode == GL_COMBINE4_NV) {
/* (a * b) + (c * d) - 0.5 */
const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argRGB[0];
const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argRGB[1];
const GLfloat (*arg2)[4] = (const GLfloat (*)[4]) argRGB[2];
const GLfloat (*arg3)[4] = (const GLfloat (*)[4]) argRGB[3];
for (i = 0; i < n; i++) {
rgba[i][RCOMP] = (arg0[i][RCOMP] + arg1[i][RCOMP] *
arg2[i][RCOMP] + arg3[i][RCOMP] - 0.5) * RGBmult;
@@ -325,8 +315,6 @@ texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
}
}
else {
const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argRGB[0];
const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argRGB[1];
for (i = 0; i < n; i++) {
rgba[i][RCOMP] = (arg0[i][RCOMP] + arg1[i][RCOMP] - 0.5) * RGBmult;
rgba[i][GCOMP] = (arg0[i][GCOMP] + arg1[i][GCOMP] - 0.5) * RGBmult;
@@ -335,106 +323,74 @@ texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
}
break;
case GL_INTERPOLATE:
{
const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argRGB[0];
const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argRGB[1];
const GLfloat (*arg2)[4] = (const GLfloat (*)[4]) argRGB[2];
for (i = 0; i < n; i++) {
rgba[i][RCOMP] = (arg0[i][RCOMP] * arg2[i][RCOMP] +
arg1[i][RCOMP] * (1.0F - arg2[i][RCOMP])) * RGBmult;
rgba[i][GCOMP] = (arg0[i][GCOMP] * arg2[i][GCOMP] +
arg1[i][GCOMP] * (1.0F - arg2[i][GCOMP])) * RGBmult;
rgba[i][BCOMP] = (arg0[i][BCOMP] * arg2[i][BCOMP] +
arg1[i][BCOMP] * (1.0F - arg2[i][BCOMP])) * RGBmult;
}
for (i = 0; i < n; i++) {
rgba[i][RCOMP] = (arg0[i][RCOMP] * arg2[i][RCOMP] +
arg1[i][RCOMP] * (1.0F - arg2[i][RCOMP])) * RGBmult;
rgba[i][GCOMP] = (arg0[i][GCOMP] * arg2[i][GCOMP] +
arg1[i][GCOMP] * (1.0F - arg2[i][GCOMP])) * RGBmult;
rgba[i][BCOMP] = (arg0[i][BCOMP] * arg2[i][BCOMP] +
arg1[i][BCOMP] * (1.0F - arg2[i][BCOMP])) * RGBmult;
}
break;
case GL_SUBTRACT:
{
const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argRGB[0];
const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argRGB[1];
for (i = 0; i < n; i++) {
rgba[i][RCOMP] = (arg0[i][RCOMP] - arg1[i][RCOMP]) * RGBmult;
rgba[i][GCOMP] = (arg0[i][GCOMP] - arg1[i][GCOMP]) * RGBmult;
rgba[i][BCOMP] = (arg0[i][BCOMP] - arg1[i][BCOMP]) * RGBmult;
}
for (i = 0; i < n; i++) {
rgba[i][RCOMP] = (arg0[i][RCOMP] - arg1[i][RCOMP]) * RGBmult;
rgba[i][GCOMP] = (arg0[i][GCOMP] - arg1[i][GCOMP]) * RGBmult;
rgba[i][BCOMP] = (arg0[i][BCOMP] - arg1[i][BCOMP]) * RGBmult;
}
break;
case GL_DOT3_RGB_EXT:
case GL_DOT3_RGBA_EXT:
{
/* Do not scale the result by 1 2 or 4 */
const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argRGB[0];
const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argRGB[1];
for (i = 0; i < n; i++) {
GLfloat dot = ((arg0[i][RCOMP]-0.5F) * (arg1[i][RCOMP]-0.5F) +
(arg0[i][GCOMP]-0.5F) * (arg1[i][GCOMP]-0.5F) +
(arg0[i][BCOMP]-0.5F) * (arg1[i][BCOMP]-0.5F))
* 4.0F;
dot = CLAMP(dot, 0.0F, 1.0F);
rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = (GLfloat) dot;
}
/* Do not scale the result by 1 2 or 4 */
for (i = 0; i < n; i++) {
GLfloat dot = ((arg0[i][RCOMP]-0.5F) * (arg1[i][RCOMP]-0.5F) +
(arg0[i][GCOMP]-0.5F) * (arg1[i][GCOMP]-0.5F) +
(arg0[i][BCOMP]-0.5F) * (arg1[i][BCOMP]-0.5F))
* 4.0F;
dot = CLAMP(dot, 0.0F, 1.0F);
rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = (GLfloat) dot;
}
break;
case GL_DOT3_RGB:
case GL_DOT3_RGBA:
{
/* DO scale the result by 1 2 or 4 */
const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argRGB[0];
const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argRGB[1];
for (i = 0; i < n; i++) {
GLfloat dot = ((arg0[i][RCOMP]-0.5F) * (arg1[i][RCOMP]-0.5F) +
(arg0[i][GCOMP]-0.5F) * (arg1[i][GCOMP]-0.5F) +
(arg0[i][BCOMP]-0.5F) * (arg1[i][BCOMP]-0.5F))
* 4.0F * RGBmult;
dot = CLAMP(dot, 0.0, 1.0F);
rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = (GLfloat) dot;
}
/* DO scale the result by 1 2 or 4 */
for (i = 0; i < n; i++) {
GLfloat dot = ((arg0[i][RCOMP]-0.5F) * (arg1[i][RCOMP]-0.5F) +
(arg0[i][GCOMP]-0.5F) * (arg1[i][GCOMP]-0.5F) +
(arg0[i][BCOMP]-0.5F) * (arg1[i][BCOMP]-0.5F))
* 4.0F * RGBmult;
dot = CLAMP(dot, 0.0, 1.0F);
rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = (GLfloat) dot;
}
break;
case GL_MODULATE_ADD_ATI:
{
const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argRGB[0];
const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argRGB[1];
const GLfloat (*arg2)[4] = (const GLfloat (*)[4]) argRGB[2];
for (i = 0; i < n; i++) {
rgba[i][RCOMP] = ((arg0[i][RCOMP] * arg2[i][RCOMP]) +
arg1[i][RCOMP]) * RGBmult;
rgba[i][GCOMP] = ((arg0[i][GCOMP] * arg2[i][GCOMP]) +
arg1[i][GCOMP]) * RGBmult;
rgba[i][BCOMP] = ((arg0[i][BCOMP] * arg2[i][BCOMP]) +
arg1[i][BCOMP]) * RGBmult;
}
for (i = 0; i < n; i++) {
rgba[i][RCOMP] = ((arg0[i][RCOMP] * arg2[i][RCOMP]) +
arg1[i][RCOMP]) * RGBmult;
rgba[i][GCOMP] = ((arg0[i][GCOMP] * arg2[i][GCOMP]) +
arg1[i][GCOMP]) * RGBmult;
rgba[i][BCOMP] = ((arg0[i][BCOMP] * arg2[i][BCOMP]) +
arg1[i][BCOMP]) * RGBmult;
}
break;
case GL_MODULATE_SIGNED_ADD_ATI:
{
const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argRGB[0];
const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argRGB[1];
const GLfloat (*arg2)[4] = (const GLfloat (*)[4]) argRGB[2];
for (i = 0; i < n; i++) {
rgba[i][RCOMP] = ((arg0[i][RCOMP] * arg2[i][RCOMP]) +
arg1[i][RCOMP] - 0.5) * RGBmult;
rgba[i][GCOMP] = ((arg0[i][GCOMP] * arg2[i][GCOMP]) +
arg1[i][GCOMP] - 0.5) * RGBmult;
rgba[i][BCOMP] = ((arg0[i][BCOMP] * arg2[i][BCOMP]) +
arg1[i][BCOMP] - 0.5) * RGBmult;
}
for (i = 0; i < n; i++) {
rgba[i][RCOMP] = ((arg0[i][RCOMP] * arg2[i][RCOMP]) +
arg1[i][RCOMP] - 0.5) * RGBmult;
rgba[i][GCOMP] = ((arg0[i][GCOMP] * arg2[i][GCOMP]) +
arg1[i][GCOMP] - 0.5) * RGBmult;
rgba[i][BCOMP] = ((arg0[i][BCOMP] * arg2[i][BCOMP]) +
arg1[i][BCOMP] - 0.5) * RGBmult;
}
break;
case GL_MODULATE_SUBTRACT_ATI:
{
const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argRGB[0];
const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argRGB[1];
const GLfloat (*arg2)[4] = (const GLfloat (*)[4]) argRGB[2];
for (i = 0; i < n; i++) {
rgba[i][RCOMP] = ((arg0[i][RCOMP] * arg2[i][RCOMP]) -
arg1[i][RCOMP]) * RGBmult;
rgba[i][GCOMP] = ((arg0[i][GCOMP] * arg2[i][GCOMP]) -
arg1[i][GCOMP]) * RGBmult;
rgba[i][BCOMP] = ((arg0[i][BCOMP] * arg2[i][BCOMP]) -
arg1[i][BCOMP]) * RGBmult;
}
for (i = 0; i < n; i++) {
rgba[i][RCOMP] = ((arg0[i][RCOMP] * arg2[i][RCOMP]) -
arg1[i][RCOMP]) * RGBmult;
rgba[i][GCOMP] = ((arg0[i][GCOMP] * arg2[i][GCOMP]) -
arg1[i][GCOMP]) * RGBmult;
rgba[i][BCOMP] = ((arg0[i][BCOMP] * arg2[i][BCOMP]) -
arg1[i][BCOMP]) * RGBmult;
}
break;
case GL_BUMP_ENVMAP_ATI:
@@ -458,41 +414,31 @@ texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
return; /* no alpha processing */
default:
_mesa_problem(ctx, "invalid combine mode");
}
}
switch (textureUnit->_CurrentCombine->ModeA) {
/* Alpha channel combine */
{
const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argA[0];
const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argA[1];
const GLfloat (*arg2)[4] = (const GLfloat (*)[4]) argA[2];
const GLfloat (*arg3)[4] = (const GLfloat (*)[4]) argA[3];
switch (combine->ModeA) {
case GL_REPLACE:
{
const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argA[0];
if (Ashift) {
for (i = 0; i < n; i++) {
GLfloat a = arg0[i][ACOMP] * Amult;
rgba[i][ACOMP] = (GLfloat) MIN2(a, 1.0F);
}
}
else {
for (i = 0; i < n; i++) {
rgba[i][ACOMP] = arg0[i][ACOMP];
}
}
for (i = 0; i < n; i++) {
GLfloat a = arg0[i][ACOMP] * Amult;
rgba[i][ACOMP] = (GLfloat) MIN2(a, 1.0F);
}
break;
case GL_MODULATE:
{
const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argA[0];
const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argA[1];
for (i = 0; i < n; i++) {
rgba[i][ACOMP] = arg0[i][ACOMP] * arg1[i][ACOMP] * Amult;
}
for (i = 0; i < n; i++) {
rgba[i][ACOMP] = arg0[i][ACOMP] * arg1[i][ACOMP] * Amult;
}
break;
case GL_ADD:
if (textureUnit->EnvMode == GL_COMBINE4_NV) {
/* (a * b) + (c * d) */
const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argA[0];
const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argA[1];
const GLfloat (*arg2)[4] = (const GLfloat (*)[4]) argA[2];
const GLfloat (*arg3)[4] = (const GLfloat (*)[4]) argA[3];
for (i = 0; i < n; i++) {
rgba[i][ACOMP] = (arg0[i][ACOMP] * arg1[i][ACOMP] +
arg2[i][ACOMP] * arg3[i][ACOMP]) * Amult;
@@ -500,8 +446,6 @@ texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
}
else {
/* two-term add */
const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argA[0];
const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argA[1];
for (i = 0; i < n; i++) {
rgba[i][ACOMP] = (arg0[i][ACOMP] + arg1[i][ACOMP]) * Amult;
}
@@ -510,10 +454,6 @@ texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
case GL_ADD_SIGNED:
if (textureUnit->EnvMode == GL_COMBINE4_NV) {
/* (a * b) + (c * d) - 0.5 */
const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argA[0];
const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argA[1];
const GLfloat (*arg2)[4] = (const GLfloat (*)[4]) argA[2];
const GLfloat (*arg3)[4] = (const GLfloat (*)[4]) argA[3];
for (i = 0; i < n; i++) {
rgba[i][ACOMP] = (arg0[i][ACOMP] * arg1[i][ACOMP] +
arg2[i][ACOMP] * arg3[i][ACOMP] -
@@ -522,69 +462,44 @@ texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
}
else {
/* a + b - 0.5 */
const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argA[0];
const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argA[1];
for (i = 0; i < n; i++) {
rgba[i][ACOMP] = (arg0[i][ACOMP] + arg1[i][ACOMP] - 0.5F) * Amult;
}
}
break;
case GL_INTERPOLATE:
{
const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argA[0];
const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argA[1];
const GLfloat (*arg2)[4] = (const GLfloat (*)[4]) argA[2];
for (i=0; i<n; i++) {
rgba[i][ACOMP] = (arg0[i][ACOMP] * arg2[i][ACOMP] +
arg1[i][ACOMP] * (1.0F - arg2[i][ACOMP]))
* Amult;
}
for (i=0; i<n; i++) {
rgba[i][ACOMP] = (arg0[i][ACOMP] * arg2[i][ACOMP] +
arg1[i][ACOMP] * (1.0F - arg2[i][ACOMP]))
* Amult;
}
break;
case GL_SUBTRACT:
{
const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argA[0];
const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argA[1];
for (i = 0; i < n; i++) {
rgba[i][ACOMP] = (arg0[i][ACOMP] - arg1[i][ACOMP]) * Amult;
}
for (i = 0; i < n; i++) {
rgba[i][ACOMP] = (arg0[i][ACOMP] - arg1[i][ACOMP]) * Amult;
}
break;
case GL_MODULATE_ADD_ATI:
{
const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argA[0];
const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argA[1];
const GLfloat (*arg2)[4] = (const GLfloat (*)[4]) argA[2];
for (i = 0; i < n; i++) {
rgba[i][ACOMP] = ((arg0[i][ACOMP] * arg2[i][ACOMP])
+ arg1[i][ACOMP]) * Amult;
}
for (i = 0; i < n; i++) {
rgba[i][ACOMP] = ((arg0[i][ACOMP] * arg2[i][ACOMP])
+ arg1[i][ACOMP]) * Amult;
}
break;
case GL_MODULATE_SIGNED_ADD_ATI:
{
const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argA[0];
const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argA[1];
const GLfloat (*arg2)[4] = (const GLfloat (*)[4]) argA[2];
for (i = 0; i < n; i++) {
rgba[i][ACOMP] = ((arg0[i][ACOMP] * arg2[i][ACOMP]) +
arg1[i][ACOMP] - 0.5F) * Amult;
}
for (i = 0; i < n; i++) {
rgba[i][ACOMP] = ((arg0[i][ACOMP] * arg2[i][ACOMP]) +
arg1[i][ACOMP] - 0.5F) * Amult;
}
break;
case GL_MODULATE_SUBTRACT_ATI:
{
const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argA[0];
const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argA[1];
const GLfloat (*arg2)[4] = (const GLfloat (*)[4]) argA[2];
for (i = 0; i < n; i++) {
rgba[i][ACOMP] = ((arg0[i][ACOMP] * arg2[i][ACOMP])
- arg1[i][ACOMP]) * Amult;
}
for (i = 0; i < n; i++) {
rgba[i][ACOMP] = ((arg0[i][ACOMP] * arg2[i][ACOMP])
- arg1[i][ACOMP]) * Amult;
}
break;
default:
_mesa_problem(ctx, "invalid combine mode");
}
}
/* Fix the alpha component for GL_DOT3_RGBA_EXT/ARB combining.
@@ -592,8 +507,8 @@ texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
* were written such that the GL_COMBINE_ALPHA value could be set to
* GL_DOT3.
*/
if (textureUnit->_CurrentCombine->ModeRGB == GL_DOT3_RGBA_EXT ||
textureUnit->_CurrentCombine->ModeRGB == GL_DOT3_RGBA) {
if (combine->ModeRGB == GL_DOT3_RGBA_EXT ||
combine->ModeRGB == GL_DOT3_RGBA) {
for (i = 0; i < n; i++) {
rgba[i][ACOMP] = rgba[i][RCOMP];
}