aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/mesa/main/nvfragprog.h3
-rw-r--r--src/mesa/shader/arbfragparse.c2
-rw-r--r--src/mesa/shader/arbprogparse.c2
-rw-r--r--src/mesa/shader/nvfragprog.h3
-rw-r--r--src/mesa/swrast/s_nvfragprog.c12
5 files changed, 18 insertions, 4 deletions
diff --git a/src/mesa/main/nvfragprog.h b/src/mesa/main/nvfragprog.h
index fa817d4b9cc..85909c9a280 100644
--- a/src/mesa/main/nvfragprog.h
+++ b/src/mesa/main/nvfragprog.h
@@ -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 */
};
diff --git a/src/mesa/shader/arbfragparse.c b/src/mesa/shader/arbfragparse.c
index 46d80dd2e28..d876946a251 100644
--- a/src/mesa/shader/arbfragparse.c
+++ b/src/mesa/shader/arbfragparse.c
@@ -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:
diff --git a/src/mesa/shader/arbprogparse.c b/src/mesa/shader/arbprogparse.c
index 7fa2569c64b..c2365a281c1 100644
--- a/src/mesa/shader/arbprogparse.c
+++ b/src/mesa/shader/arbprogparse.c
@@ -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;
}
diff --git a/src/mesa/shader/nvfragprog.h b/src/mesa/shader/nvfragprog.h
index fa817d4b9cc..e83827d1a16 100644
--- a/src/mesa/shader/nvfragprog.h
+++ b/src/mesa/shader/nvfragprog.h
@@ -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 */
};
diff --git a/src/mesa/swrast/s_nvfragprog.c b/src/mesa/swrast/s_nvfragprog.c
index 4083581ab05..127cc4f0b4d 100644
--- a/src/mesa/swrast/s_nvfragprog.c
+++ b/src/mesa/swrast/s_nvfragprog.c
@@ -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];