Restore the negate() function.
Add Ben Skegg's ATI_texture_env_combine3 support.
This commit is contained in:
@@ -131,6 +131,12 @@ static struct ureg swizzle1( struct ureg reg, int x )
|
|||||||
return swizzle(reg, x, x, x, x);
|
return swizzle(reg, x, x, x, x);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct ureg negate( struct ureg reg )
|
||||||
|
{
|
||||||
|
reg.negatebase ^= 1;
|
||||||
|
return reg;
|
||||||
|
}
|
||||||
|
|
||||||
static GLboolean is_undef( struct ureg reg )
|
static GLboolean is_undef( struct ureg reg )
|
||||||
{
|
{
|
||||||
return reg.file == 0xf;
|
return reg.file == 0xf;
|
||||||
@@ -475,6 +481,10 @@ static struct ureg emit_combine_source( struct texenv_fragment_program *p,
|
|||||||
one = register_scalar_const(p, 1.0);
|
one = register_scalar_const(p, 1.0);
|
||||||
return emit_arith( p, FP_OPCODE_SUB, arg, mask, 0,
|
return emit_arith( p, FP_OPCODE_SUB, arg, mask, 0,
|
||||||
one, swizzle1(src, W), undef);
|
one, swizzle1(src, W), undef);
|
||||||
|
case GL_ZERO:
|
||||||
|
return register_scalar_const(p, 0.0);
|
||||||
|
case GL_ONE:
|
||||||
|
return register_scalar_const(p, 1.0);
|
||||||
case GL_SRC_COLOR:
|
case GL_SRC_COLOR:
|
||||||
default:
|
default:
|
||||||
return src;
|
return src;
|
||||||
@@ -496,6 +506,9 @@ static int nr_args( GLenum mode )
|
|||||||
case GL_DOT3_RGBA_EXT: return 2;
|
case GL_DOT3_RGBA_EXT: return 2;
|
||||||
case GL_DOT3_RGB: return 2;
|
case GL_DOT3_RGB: return 2;
|
||||||
case GL_DOT3_RGBA: return 2;
|
case GL_DOT3_RGBA: return 2;
|
||||||
|
case GL_MODULATE_ADD_ATI: return 3;
|
||||||
|
case GL_MODULATE_SUBTRACT_ATI: return 3;
|
||||||
|
case GL_MODULATE_SIGNED_ADD_ATI: return 3;
|
||||||
default: return 0;
|
default: return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -607,7 +620,22 @@ static struct ureg emit_combine( struct texenv_fragment_program *p,
|
|||||||
emit_arith( p, FP_OPCODE_DP3, dest, mask, saturate, tmp0, tmp1, undef);
|
emit_arith( p, FP_OPCODE_DP3, dest, mask, saturate, tmp0, tmp1, undef);
|
||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
case GL_MODULATE_ADD_ATI:
|
||||||
|
/* Arg0 * Arg2 + Arg1 */
|
||||||
|
return emit_arith( p, FP_OPCODE_MAD, dest, mask, saturate,
|
||||||
|
src[0], src[2], src[1] );
|
||||||
|
case GL_MODULATE_SIGNED_ADD_ATI: {
|
||||||
|
/* Arg0 * Arg2 + Arg1 - 0.5 */
|
||||||
|
struct ureg tmp0 = get_temp(p);
|
||||||
|
half = register_scalar_const(p, .5);
|
||||||
|
emit_arith( p, FP_OPCODE_MAD, tmp0, mask, 0, src[0], src[2], src[1] );
|
||||||
|
emit_arith( p, FP_OPCODE_SUB, dest, mask, saturate, tmp0, half, undef );
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
case GL_MODULATE_SUBTRACT_ATI:
|
||||||
|
/* Arg0 * Arg2 - Arg1 */
|
||||||
|
emit_arith( p, FP_OPCODE_MAD, dest, mask, 0, src[0], src[2], negate(src[1]) );
|
||||||
|
return dest;
|
||||||
default:
|
default:
|
||||||
return src[0];
|
return src[0];
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user