Make Saturate a 2-bit field again, renamed to SaturateMode with three

possible values: SATURATE_OFF, SATURATE_ZERO_ONE and SATURATE_PLUS_MINUS_ONE.
This commit is contained in:
Brian Paul
2005-11-20 17:52:40 +00:00
parent 22db535776
commit e31ac05223
8 changed files with 57 additions and 45 deletions

View File

@@ -177,7 +177,7 @@ static GLuint get_result_flags( const struct prog_instruction *inst )
{ {
GLuint flags = 0; GLuint flags = 0;
if (inst->Saturate) flags |= A0_DEST_SATURATE; if (inst->Saturate == SATURATE_ZERO_ONE) flags |= A0_DEST_SATURATE;
if (inst->DstReg.WriteMask & WRITEMASK_X) flags |= A0_DEST_CHANNEL_X; if (inst->DstReg.WriteMask & WRITEMASK_X) flags |= A0_DEST_CHANNEL_X;
if (inst->DstReg.WriteMask & WRITEMASK_Y) flags |= A0_DEST_CHANNEL_Y; if (inst->DstReg.WriteMask & WRITEMASK_Y) flags |= A0_DEST_CHANNEL_Y;
if (inst->DstReg.WriteMask & WRITEMASK_Z) flags |= A0_DEST_CHANNEL_Z; if (inst->DstReg.WriteMask & WRITEMASK_Z) flags |= A0_DEST_CHANNEL_Z;

View File

@@ -757,7 +757,7 @@ static GLboolean parse_program(struct r300_fragment_program *rp)
} }
for (fpi=mp->Base.Instructions; fpi->Opcode != OPCODE_END; fpi++) { for (fpi=mp->Base.Instructions; fpi->Opcode != OPCODE_END; fpi++) {
if (fpi->Saturate) { if (fpi->SaturateMode == SATURATE_ZERO_ONE) {
flags = PFS_FLAG_SAT; flags = PFS_FLAG_SAT;
} }

View File

@@ -486,7 +486,7 @@ emit_op(struct texenv_fragment_program *p,
emit_arg( &inst->SrcReg[1], src1 ); emit_arg( &inst->SrcReg[1], src1 );
emit_arg( &inst->SrcReg[2], src2 ); emit_arg( &inst->SrcReg[2], src2 );
inst->Saturate = saturate; inst->SaturateMode = saturate ? SATURATE_ZERO_ONE : SATURATE_OFF;
emit_dst( &inst->DstReg, dest, mask ); emit_dst( &inst->DstReg, dest, mask );

View File

@@ -2730,31 +2730,31 @@ parse_fp_instruction (GLcontext * ctx, GLubyte ** inst,
case OP_ALU_VECTOR: case OP_ALU_VECTOR:
switch (code) { switch (code) {
case OP_ABS_SAT: case OP_ABS_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_ABS: case OP_ABS:
fp->Opcode = OPCODE_ABS; fp->Opcode = OPCODE_ABS;
break; break;
case OP_FLR_SAT: case OP_FLR_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_FLR: case OP_FLR:
fp->Opcode = OPCODE_FLR; fp->Opcode = OPCODE_FLR;
break; break;
case OP_FRC_SAT: case OP_FRC_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_FRC: case OP_FRC:
fp->Opcode = OPCODE_FRC; fp->Opcode = OPCODE_FRC;
break; break;
case OP_LIT_SAT: case OP_LIT_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_LIT: case OP_LIT:
fp->Opcode = OPCODE_LIT; fp->Opcode = OPCODE_LIT;
break; break;
case OP_MOV_SAT: case OP_MOV_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_MOV: case OP_MOV:
fp->Opcode = OPCODE_MOV; fp->Opcode = OPCODE_MOV;
break; break;
@@ -2770,43 +2770,43 @@ parse_fp_instruction (GLcontext * ctx, GLubyte ** inst,
case OP_ALU_SCALAR: case OP_ALU_SCALAR:
switch (code) { switch (code) {
case OP_COS_SAT: case OP_COS_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_COS: case OP_COS:
fp->Opcode = OPCODE_COS; fp->Opcode = OPCODE_COS;
break; break;
case OP_EX2_SAT: case OP_EX2_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_EX2: case OP_EX2:
fp->Opcode = OPCODE_EX2; fp->Opcode = OPCODE_EX2;
break; break;
case OP_LG2_SAT: case OP_LG2_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_LG2: case OP_LG2:
fp->Opcode = OPCODE_LG2; fp->Opcode = OPCODE_LG2;
break; break;
case OP_RCP_SAT: case OP_RCP_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_RCP: case OP_RCP:
fp->Opcode = OPCODE_RCP; fp->Opcode = OPCODE_RCP;
break; break;
case OP_RSQ_SAT: case OP_RSQ_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_RSQ: case OP_RSQ:
fp->Opcode = OPCODE_RSQ; fp->Opcode = OPCODE_RSQ;
break; break;
case OP_SIN_SAT: case OP_SIN_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_SIN: case OP_SIN:
fp->Opcode = OPCODE_SIN; fp->Opcode = OPCODE_SIN;
break; break;
case OP_SCS_SAT: case OP_SCS_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_SCS: case OP_SCS:
fp->Opcode = OPCODE_SCS; fp->Opcode = OPCODE_SCS;
@@ -2823,7 +2823,7 @@ parse_fp_instruction (GLcontext * ctx, GLubyte ** inst,
case OP_ALU_BINSC: case OP_ALU_BINSC:
switch (code) { switch (code) {
case OP_POW_SAT: case OP_POW_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_POW: case OP_POW:
fp->Opcode = OPCODE_POW; fp->Opcode = OPCODE_POW;
break; break;
@@ -2842,73 +2842,73 @@ parse_fp_instruction (GLcontext * ctx, GLubyte ** inst,
case OP_ALU_BIN: case OP_ALU_BIN:
switch (code) { switch (code) {
case OP_ADD_SAT: case OP_ADD_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_ADD: case OP_ADD:
fp->Opcode = OPCODE_ADD; fp->Opcode = OPCODE_ADD;
break; break;
case OP_DP3_SAT: case OP_DP3_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_DP3: case OP_DP3:
fp->Opcode = OPCODE_DP3; fp->Opcode = OPCODE_DP3;
break; break;
case OP_DP4_SAT: case OP_DP4_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_DP4: case OP_DP4:
fp->Opcode = OPCODE_DP4; fp->Opcode = OPCODE_DP4;
break; break;
case OP_DPH_SAT: case OP_DPH_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_DPH: case OP_DPH:
fp->Opcode = OPCODE_DPH; fp->Opcode = OPCODE_DPH;
break; break;
case OP_DST_SAT: case OP_DST_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_DST: case OP_DST:
fp->Opcode = OPCODE_DST; fp->Opcode = OPCODE_DST;
break; break;
case OP_MAX_SAT: case OP_MAX_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_MAX: case OP_MAX:
fp->Opcode = OPCODE_MAX; fp->Opcode = OPCODE_MAX;
break; break;
case OP_MIN_SAT: case OP_MIN_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_MIN: case OP_MIN:
fp->Opcode = OPCODE_MIN; fp->Opcode = OPCODE_MIN;
break; break;
case OP_MUL_SAT: case OP_MUL_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_MUL: case OP_MUL:
fp->Opcode = OPCODE_MUL; fp->Opcode = OPCODE_MUL;
break; break;
case OP_SGE_SAT: case OP_SGE_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_SGE: case OP_SGE:
fp->Opcode = OPCODE_SGE; fp->Opcode = OPCODE_SGE;
break; break;
case OP_SLT_SAT: case OP_SLT_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_SLT: case OP_SLT:
fp->Opcode = OPCODE_SLT; fp->Opcode = OPCODE_SLT;
break; break;
case OP_SUB_SAT: case OP_SUB_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_SUB: case OP_SUB:
fp->Opcode = OPCODE_SUB; fp->Opcode = OPCODE_SUB;
break; break;
case OP_XPD_SAT: case OP_XPD_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_XPD: case OP_XPD:
fp->Opcode = OPCODE_XPD; fp->Opcode = OPCODE_XPD;
break; break;
@@ -2925,19 +2925,19 @@ parse_fp_instruction (GLcontext * ctx, GLubyte ** inst,
case OP_ALU_TRI: case OP_ALU_TRI:
switch (code) { switch (code) {
case OP_CMP_SAT: case OP_CMP_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_CMP: case OP_CMP:
fp->Opcode = OPCODE_CMP; fp->Opcode = OPCODE_CMP;
break; break;
case OP_LRP_SAT: case OP_LRP_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_LRP: case OP_LRP:
fp->Opcode = OPCODE_LRP; fp->Opcode = OPCODE_LRP;
break; break;
case OP_MAD_SAT: case OP_MAD_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_MAD: case OP_MAD:
fp->Opcode = OPCODE_MAD; fp->Opcode = OPCODE_MAD;
break; break;
@@ -2955,7 +2955,7 @@ parse_fp_instruction (GLcontext * ctx, GLubyte ** inst,
case OP_ALU_SWZ: case OP_ALU_SWZ:
switch (code) { switch (code) {
case OP_SWZ_SAT: case OP_SWZ_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_SWZ: case OP_SWZ:
fp->Opcode = OPCODE_SWZ; fp->Opcode = OPCODE_SWZ;
break; break;
@@ -2985,19 +2985,19 @@ parse_fp_instruction (GLcontext * ctx, GLubyte ** inst,
case OP_TEX_SAMPLE: case OP_TEX_SAMPLE:
switch (code) { switch (code) {
case OP_TEX_SAT: case OP_TEX_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_TEX: case OP_TEX:
fp->Opcode = OPCODE_TEX; fp->Opcode = OPCODE_TEX;
break; break;
case OP_TXP_SAT: case OP_TXP_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_TXP: case OP_TXP:
fp->Opcode = OPCODE_TXP; fp->Opcode = OPCODE_TXP;
break; break;
case OP_TXB_SAT: case OP_TXB_SAT:
fp->Saturate = 1; fp->SaturateMode = SATURATE_ZERO_ONE;
case OP_TXB: case OP_TXB:
fp->Opcode = OPCODE_TXB; fp->Opcode = OPCODE_TXB;
break; break;

View File

@@ -1327,7 +1327,8 @@ Parse_InstructionSequence(struct parse_state *parseState,
inst->Opcode = instMatch.opcode; inst->Opcode = instMatch.opcode;
inst->Precision = instMatch.suffixes & (_R | _H | _X); inst->Precision = instMatch.suffixes & (_R | _H | _X);
inst->Saturate = (instMatch.suffixes & (_S)) ? GL_TRUE : GL_FALSE; inst->SaturateMode = (instMatch.suffixes & (_S))
? SATURATE_ZERO_ONE : SATURATE_OFF;
inst->CondUpdate = (instMatch.suffixes & (_C)) ? GL_TRUE : GL_FALSE; inst->CondUpdate = (instMatch.suffixes & (_C)) ? GL_TRUE : GL_FALSE;
inst->StringPos = parseState->curLine - parseState->start; inst->StringPos = parseState->curLine - parseState->start;
assert(inst->StringPos >= 0); assert(inst->StringPos >= 0);
@@ -1745,7 +1746,7 @@ _mesa_print_nv_fragment_program(const struct fragment_program *program)
_mesa_printf("X"); _mesa_printf("X");
if (inst->CondUpdate) if (inst->CondUpdate)
_mesa_printf("C"); _mesa_printf("C");
if (inst->Saturate) if (inst->SaturateMode == SATURATE_ZERO_ONE)
_mesa_printf("_SAT"); _mesa_printf("_SAT");
_mesa_printf(" "); _mesa_printf(" ");

View File

@@ -1458,7 +1458,7 @@ _mesa_print_instruction(const struct prog_instruction *inst)
break; break;
case OPCODE_SWZ: case OPCODE_SWZ:
_mesa_printf("SWZ"); _mesa_printf("SWZ");
if (inst->Saturate) if (inst->SaturateMode == SATURATE_ZERO_ONE)
_mesa_printf("_SAT"); _mesa_printf("_SAT");
print_dst_reg(&inst->DstReg); print_dst_reg(&inst->DstReg);
_mesa_printf("%s[%d], %s;\n", _mesa_printf("%s[%d], %s;\n",
@@ -1471,7 +1471,7 @@ _mesa_print_instruction(const struct prog_instruction *inst)
case OPCODE_TXP: case OPCODE_TXP:
case OPCODE_TXB: case OPCODE_TXB:
_mesa_printf("%s", _mesa_opcode_string(inst->Opcode)); _mesa_printf("%s", _mesa_opcode_string(inst->Opcode));
if (inst->Saturate) if (inst->SaturateMode == SATURATE_ZERO_ONE)
_mesa_printf("_SAT"); _mesa_printf("_SAT");
_mesa_printf(" "); _mesa_printf(" ");
print_dst_reg(&inst->DstReg); print_dst_reg(&inst->DstReg);
@@ -1504,7 +1504,7 @@ _mesa_print_instruction(const struct prog_instruction *inst)
_mesa_printf("%s", _mesa_opcode_string(inst->Opcode)); _mesa_printf("%s", _mesa_opcode_string(inst->Opcode));
/* frag prog only */ /* frag prog only */
if (inst->Saturate) if (inst->SaturateMode == SATURATE_ZERO_ONE)
_mesa_printf("_SAT"); _mesa_printf("_SAT");
if (inst->DstReg.File != PROGRAM_UNDEFINED) { if (inst->DstReg.File != PROGRAM_UNDEFINED) {

View File

@@ -54,7 +54,7 @@
/*@}*/ /*@}*/
/* /**
* Instruction precision for GL_NV_fragment_program * Instruction precision for GL_NV_fragment_program
*/ */
/*@{*/ /*@{*/
@@ -64,6 +64,16 @@
/*@}*/ /*@}*/
/**
* Saturation modes when storing values.
*/
/*@{*/
#define SATURATE_OFF 0
#define SATURATE_ZERO_ONE 1
#define SATURATE_PLUS_MINUS_ONE 2
/*@}*/
/** /**
* Program instruction opcodes, for both vertex and fragment programs. * Program instruction opcodes, for both vertex and fragment programs.
* \note changes to this opcode list must be reflected in t_vb_arbprogram.c * \note changes to this opcode list must be reflected in t_vb_arbprogram.c
@@ -267,8 +277,8 @@ struct prog_instruction
* condition code register that is to be updated. * condition code register that is to be updated.
* *
* In GL_NV_fragment_program or GL_NV_vertex_program2 mode, only condition * In GL_NV_fragment_program or GL_NV_vertex_program2 mode, only condition
* code register 0 is available. In GL_NV_vertex_program3 mode, condition code registers * code register 0 is available. In GL_NV_vertex_program3 mode, condition
* 0 and 1 are available. * code registers 0 and 1 are available.
* *
* \since * \since
* NV_fragment_program, NV_fragment_program_option, NV_vertex_program2, * NV_fragment_program, NV_fragment_program_option, NV_vertex_program2,
@@ -280,11 +290,12 @@ struct prog_instruction
* Saturate each value of the vectored result to the range [0,1] or the * Saturate each value of the vectored result to the range [0,1] or the
* range [-1,1]. \c SSAT mode (i.e., saturation to the range [-1,1]) is * range [-1,1]. \c SSAT mode (i.e., saturation to the range [-1,1]) is
* only available in NV_fragment_program2 mode. * only available in NV_fragment_program2 mode.
* Value is one of the SATURATE_* tokens.
* *
* \since * \since
* NV_fragment_program, NV_fragment_program_option, NV_vertex_program3. * NV_fragment_program, NV_fragment_program_option, NV_vertex_program3.
*/ */
GLuint Saturate:1; GLuint SaturateMode:2;
/** /**
* Per-instruction selectable precision. * Per-instruction selectable precision.

View File

@@ -390,7 +390,7 @@ store_vector4( const struct prog_instruction *inst,
const GLfloat value[4] ) const GLfloat value[4] )
{ {
const struct prog_dst_register *dest = &(inst->DstReg); const struct prog_dst_register *dest = &(inst->DstReg);
const GLboolean clamp = inst->Saturate; const GLboolean clamp = inst->SaturateMode == SATURATE_ZERO_ONE;
const GLboolean updateCC = inst->CondUpdate; const GLboolean updateCC = inst->CondUpdate;
GLfloat *dstReg; GLfloat *dstReg;
GLfloat dummyReg[4]; GLfloat dummyReg[4];