Implement ARB_f_p KIL correctly.
authorBrian Paul <brian.paul@tungstengraphics.com>
Fri, 2 Apr 2004 17:27:46 +0000 (17:27 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Fri, 2 Apr 2004 17:27:46 +0000 (17:27 +0000)
src/mesa/shader/nvfragparse.c
src/mesa/shader/nvfragprog.h
src/mesa/swrast/s_nvfragprog.c

index b742ff0a32da26f3f4bfb1b0e5c3ccd075541b5c..bdc2c7ef94ac7b10a69523f0917777b15b33d2ba 100644 (file)
@@ -95,7 +95,7 @@ static const struct instruction_pattern Instructions[] = {
    { "EX2", FP_OPCODE_DP4, INPUT_1S, OUTPUT_S, _R | _H |      _C | _S },
    { "FLR", FP_OPCODE_FLR, INPUT_1V, OUTPUT_V, _R | _H | _X | _C | _S },
    { "FRC", FP_OPCODE_FRC, INPUT_1V, OUTPUT_V, _R | _H | _X | _C | _S },
-   { "KIL", FP_OPCODE_KIL, INPUT_CC, OUTPUT_NONE, 0                   },
+   { "KIL", FP_OPCODE_KIL_NV, INPUT_CC, OUTPUT_NONE, 0                   },
    { "LG2", FP_OPCODE_LG2, INPUT_1S, OUTPUT_S, _R | _H |      _C | _S },
    { "LIT", FP_OPCODE_LIT, INPUT_1V, OUTPUT_V, _R | _H |      _C | _S },
    { "LRP", FP_OPCODE_LRP, INPUT_3V, OUTPUT_V, _R | _H | _X | _C | _S },
@@ -1291,7 +1291,7 @@ Parse_InstructionSequence(struct parse_state *parseState,
                RETURN_ERROR1("Expected ,");
          }
          else if (instMatch.outputs == OUTPUT_NONE) {
-            ASSERT(instMatch.opcode == FP_OPCODE_KIL);
+            ASSERT(instMatch.opcode == FP_OPCODE_KIL_NV);
             /* This is a little weird, the cond code info is in the dest register */
             if (!Parse_CondCodeMask(parseState, &inst->DstReg))
                RETURN_ERROR;
index e83827d1a16f773472b2c6357205765bd2da834f..53f4bf9905cd25c65219c15e8846a85e42100710 100644 (file)
@@ -75,7 +75,8 @@ enum fp_opcode {
    FP_OPCODE_EX2,
    FP_OPCODE_FLR,
    FP_OPCODE_FRC,
-   FP_OPCODE_KIL,
+   FP_OPCODE_KIL_NV,         /* NV_f_p only */
+   FP_OPCODE_KIL,            /* ARB_f_p only */
    FP_OPCODE_LG2,
    FP_OPCODE_LIT,
    FP_OPCODE_LRP,
index c262618dda02a5423a71ccb0e39824cf352c2ad8..036c1870d1f806191d46867443868527cf84413c 100644 (file)
@@ -763,7 +763,7 @@ execute_program( GLcontext *ctx,
                store_vector4( inst, machine, result );
             }
             break;
-         case FP_OPCODE_KIL:
+         case FP_OPCODE_KIL_NV: /* NV_f_p only */
             {
                const GLuint *swizzle = inst->DstReg.CondSwizzle;
                const GLuint condMask = inst->DstReg.CondMask;
@@ -775,6 +775,15 @@ execute_program( GLcontext *ctx,
                }
             }
             break;
+         case FP_OPCODE_KIL: /* ARB_f_p only */
+            {
+               GLfloat a[4];
+               fetch_vector4( ctx, &inst->SrcReg[0], machine, program, a );
+               if (a[0] < 0.0F || a[1] < 0.0F || a[2] < 0.0F || a[3] < 0.0F) {
+                  return GL_FALSE;
+               }
+            }
+            break;
          case FP_OPCODE_LG2:  /* log base 2 */
             {
                GLfloat a[4], result[4];