Added new opcodes for ARB_fragment_program, like ABS, CMP, TXB, etc.
authorBrian Paul <brian.paul@tungstengraphics.com>
Thu, 4 Sep 2003 15:18:22 +0000 (15:18 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Thu, 4 Sep 2003 15:18:22 +0000 (15:18 +0000)
src/mesa/main/nvfragprog.h
src/mesa/swrast/s_nvfragprog.c

index cf5253b2457f040e9611e2ced848cb3d268c1470..772edd6be44e6a57ba077e7a71a7d28c8b2c79d5 100644 (file)
 
 /* Fragment program instruction opcodes */
 enum fp_opcode {
-   FP_OPCODE_ADD = 1000,
+   FP_OPCODE_ABS = 1000,     /* ARB_f_p only */
+   FP_OPCODE_ADD,
+   FP_OPCODE_CMP,            /* ARB_f_p only */
    FP_OPCODE_COS,
-   FP_OPCODE_DDX,
-   FP_OPCODE_DDY,
+   FP_OPCODE_DDX,            /* NV_f_p only */
+   FP_OPCODE_DDY,            /* NV_f_p only */
    FP_OPCODE_DP3,
    FP_OPCODE_DP4,
+   FP_OPCODE_DPH,            /* ARB_f_p only */
    FP_OPCODE_DST,
    FP_OPCODE_EX2,
    FP_OPCODE_FLR,
@@ -94,32 +97,35 @@ enum fp_opcode {
    FP_OPCODE_MIN,
    FP_OPCODE_MOV,
    FP_OPCODE_MUL,
-   FP_OPCODE_PK2H,
-   FP_OPCODE_PK2US,
-   FP_OPCODE_PK4B,
-   FP_OPCODE_PK4UB,
+   FP_OPCODE_PK2H,           /* NV_f_p only */
+   FP_OPCODE_PK2US,          /* NV_f_p only */
+   FP_OPCODE_PK4B,           /* NV_f_p only */
+   FP_OPCODE_PK4UB,          /* NV_f_p only */
    FP_OPCODE_POW,
    FP_OPCODE_RCP,
-   FP_OPCODE_RFL,
+   FP_OPCODE_RFL,            /* NV_f_p only */
    FP_OPCODE_RSQ,
-   FP_OPCODE_SEQ,
-   FP_OPCODE_SFL,
-   FP_OPCODE_SGE,
-   FP_OPCODE_SGT,
+   FP_OPCODE_SCS,            /* ARB_f_p only */
+   FP_OPCODE_SEQ,            /* NV_f_p only */
+   FP_OPCODE_SFL,            /* NV_f_p only */
+   FP_OPCODE_SGE,            /* NV_f_p only */
+   FP_OPCODE_SGT,            /* NV_f_p only */
    FP_OPCODE_SIN,
-   FP_OPCODE_SLE,
+   FP_OPCODE_SLE,            /* NV_f_p only */
    FP_OPCODE_SLT,
-   FP_OPCODE_SNE,
-   FP_OPCODE_STR,
+   FP_OPCODE_SNE,            /* NV_f_p only */
+   FP_OPCODE_STR,            /* NV_f_p only */
    FP_OPCODE_SUB,
+   FP_OPCODE_SWZ,            /* ARB_f_p only */
    FP_OPCODE_TEX,
-   FP_OPCODE_TXD,
+   FP_OPCODE_TXB,            /* ARB_f_p only */
+   FP_OPCODE_TXD,            /* NV_f_p only */
    FP_OPCODE_TXP,
-   FP_OPCODE_UP2H,
-   FP_OPCODE_UP2US,
-   FP_OPCODE_UP4B,
-   FP_OPCODE_UP4UB,
-   FP_OPCODE_X2D,
+   FP_OPCODE_UP2H,           /* NV_f_p only */
+   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_END /* private opcode */
 };
 
index 92fc6ed45281cae7cc08ac9d86ec519459e63b8d..c230ff38de82ad55029948979c4a106ac2e6dee8 100644 (file)
@@ -595,6 +595,17 @@ execute_program( GLcontext *ctx,
       }
 
       switch (inst->Opcode) {
+         case FP_OPCODE_ABS:
+            {
+               GLfloat a[4], result[4];
+               fetch_vector4( ctx, &inst->SrcReg[0], machine, program, a );
+               result[0] = FABSF(a[0]);
+               result[1] = FABSF(a[1]);
+               result[2] = FABSF(a[2]);
+               result[3] = FABSF(a[3]);
+               store_vector4( inst, machine, result );
+            }
+            break;
          case FP_OPCODE_ADD:
             {
                GLfloat a[4], b[4], result[4];
@@ -607,6 +618,19 @@ execute_program( GLcontext *ctx,
                store_vector4( inst, machine, result );
             }
             break;
+         case FP_OPCODE_CMP:
+            {
+               GLfloat a[4], b[4], c[4], result[4];
+               fetch_vector4( ctx, &inst->SrcReg[0], machine, program, a );
+               fetch_vector4( ctx, &inst->SrcReg[1], machine, program, b );
+               fetch_vector4( ctx, &inst->SrcReg[2], machine, program, c );
+               result[0] = a[0] < 0.0F ? b[0] : c[0];
+               result[1] = a[1] < 0.0F ? b[1] : c[1];
+               result[2] = a[2] < 0.0F ? b[2] : c[2];
+               result[3] = a[3] < 0.0F ? b[3] : c[3];
+               store_vector4( inst, machine, result );
+            }
+            break;
          case FP_OPCODE_COS:
             {
                GLfloat a[4], result[4];
@@ -682,6 +706,16 @@ execute_program( GLcontext *ctx,
                store_vector4( inst, machine, result );
             }
             break;
+         case FP_OPCODE_DPH:
+            {
+               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] = result[1] = result[2] = result[3] = 
+                  a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + b[3];
+               store_vector4( inst, machine, result );
+            }
+            break;
          case FP_OPCODE_DST: /* Distance vector */
             {
                GLfloat a[4], b[4], result[4];
@@ -952,6 +986,17 @@ execute_program( GLcontext *ctx,
 #endif
             }
             break;
+         case FP_OPCODE_SCS: /* sine and cos */
+            {
+               GLfloat a[4], result[4];
+               fetch_vector1( ctx, &inst->SrcReg[0], machine, program, a );
+               result[0] = cos(a[0]);
+               result[1] = sin(a[0]);
+               result[2] = 0.0;  /* undefined! */
+               result[3] = 0.0;  /* undefined! */
+               store_vector4( inst, machine, result );
+            }
+            break;
          case FP_OPCODE_SEQ: /* set on equal */
             {
                GLfloat a[4], b[4], result[4];
@@ -1057,6 +1102,11 @@ execute_program( GLcontext *ctx,
                store_vector4( inst, machine, result );
             }
             break;
+         case FP_OPCODE_SWZ:
+            {
+               /* XXX to do: extended swizzle */
+            }
+            break;
          case FP_OPCODE_TEX:
             /* Texel lookup */
             {
@@ -1069,6 +1119,18 @@ execute_program( GLcontext *ctx,
                store_vector4( inst, machine, color );
             }
             break;
+         case FP_OPCODE_TXB:
+            /* Texel lookup with LOD bias */
+            {
+               GLfloat texcoord[4], color[4];
+               fetch_vector4( ctx, &inst->SrcReg[0], machine, program, texcoord );
+               /* XXX: apply bias from texcoord[3]!!! */
+               fetch_texel( ctx, texcoord,
+                            span->array->lambda[inst->TexSrcUnit][column],
+                            inst->TexSrcUnit, color );
+               store_vector4( inst, machine, color );
+            }
+            break;
          case FP_OPCODE_TXD:
             /* Texture lookup w/ partial derivatives for LOD */
             {