Accomodate ARB_fp XPD opcode separately from NV_fp's X2D.
authorKeith Whitwell <keith@tungstengraphics.com>
Mon, 29 Mar 2004 16:01:18 +0000 (16:01 +0000)
committerKeith Whitwell <keith@tungstengraphics.com>
Mon, 29 Mar 2004 16:01:18 +0000 (16:01 +0000)
src/mesa/main/nvfragprog.h
src/mesa/shader/arbfragparse.c
src/mesa/shader/arbprogparse.c
src/mesa/shader/nvfragprog.h
src/mesa/swrast/s_nvfragprog.c

index fa817d4..85909c9 100644 (file)
@@ -112,7 +112,8 @@ enum fp_opcode {
    FP_OPCODE_UP2US,          /* NV_f_p only */
    FP_OPCODE_UP4B,           /* NV_f_p only */
    FP_OPCODE_UP4UB,          /* NV_f_p only */
-   FP_OPCODE_X2D,            /* XPD in ARB_f_p */
+   FP_OPCODE_XPD,            /* ARB_f_p only - cross product */
+   FP_OPCODE_X2D,            /* NV_f_p only - 2D matrix multiply */
    FP_OPCODE_END /* private opcode */
 };
 
index 46d80dd..d876946 100644 (file)
@@ -145,7 +145,7 @@ _mesa_debug_fp_inst(GLint num, struct fp_instruction *fp)
          case  FP_OPCODE_TXP:
             fprintf(stderr, "FP_OPCODE_TXP"); break;
 
-         case  FP_OPCODE_X2D:
+         case  FP_OPCODE_XPD:
             fprintf(stderr, "FP_OPCODE_XPD"); break;
 
          default:
index 7fa2569..c2365a2 100644 (file)
@@ -2903,7 +2903,7 @@ parse_fp_instruction (GLcontext * ctx, GLubyte ** inst,
             case OP_XPD_SAT:
                fp->Saturate = 1;
             case OP_XPD:
-               fp->Opcode = FP_OPCODE_X2D;
+               fp->Opcode = FP_OPCODE_XPD;
                break;
          }
 
index fa817d4..e83827d 100644 (file)
@@ -112,7 +112,8 @@ enum fp_opcode {
    FP_OPCODE_UP2US,          /* NV_f_p only */
    FP_OPCODE_UP4B,           /* NV_f_p only */
    FP_OPCODE_UP4UB,          /* NV_f_p only */
-   FP_OPCODE_X2D,            /* XPD in ARB_f_p */
+   FP_OPCODE_X2D,            /* NV_f_p only - 2d mat mul */
+   FP_OPCODE_XPD,            /* ARB_f_p only - cross product */
    FP_OPCODE_END /* private opcode */
 };
 
index 4083581..127cc4f 100644 (file)
@@ -1233,6 +1233,18 @@ execute_program( GLcontext *ctx,
                store_vector4( inst, machine, result );
             }
             break;
+         case FP_OPCODE_XPD: /* cross product */
+            {
+               GLfloat a[4], b[4], result[4];
+               fetch_vector4( ctx, &inst->SrcReg[0], machine, program, a );
+               fetch_vector4( ctx, &inst->SrcReg[1], machine, program, b );
+               result[0] = a[1] * b[2] - a[2] * b[1];
+               result[1] = a[2] * b[0] - a[0] * b[2];
+               result[2] = a[0] * b[1] - a[1] * b[0];
+               result[3] = 1.0;
+               store_vector4( inst, machine, result );
+            }
+            break;
          case FP_OPCODE_X2D: /* 2-D matrix transform */
             {
                GLfloat a[4], b[4], c[4], result[4];