Added new opcodes for ARB_fragment_program, like ABS, CMP, TXB, etc.
This commit is contained in:
@@ -75,12 +75,15 @@
|
|||||||
|
|
||||||
/* Fragment program instruction opcodes */
|
/* Fragment program instruction opcodes */
|
||||||
enum fp_opcode {
|
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_COS,
|
||||||
FP_OPCODE_DDX,
|
FP_OPCODE_DDX, /* NV_f_p only */
|
||||||
FP_OPCODE_DDY,
|
FP_OPCODE_DDY, /* NV_f_p only */
|
||||||
FP_OPCODE_DP3,
|
FP_OPCODE_DP3,
|
||||||
FP_OPCODE_DP4,
|
FP_OPCODE_DP4,
|
||||||
|
FP_OPCODE_DPH, /* ARB_f_p only */
|
||||||
FP_OPCODE_DST,
|
FP_OPCODE_DST,
|
||||||
FP_OPCODE_EX2,
|
FP_OPCODE_EX2,
|
||||||
FP_OPCODE_FLR,
|
FP_OPCODE_FLR,
|
||||||
@@ -94,32 +97,35 @@ enum fp_opcode {
|
|||||||
FP_OPCODE_MIN,
|
FP_OPCODE_MIN,
|
||||||
FP_OPCODE_MOV,
|
FP_OPCODE_MOV,
|
||||||
FP_OPCODE_MUL,
|
FP_OPCODE_MUL,
|
||||||
FP_OPCODE_PK2H,
|
FP_OPCODE_PK2H, /* NV_f_p only */
|
||||||
FP_OPCODE_PK2US,
|
FP_OPCODE_PK2US, /* NV_f_p only */
|
||||||
FP_OPCODE_PK4B,
|
FP_OPCODE_PK4B, /* NV_f_p only */
|
||||||
FP_OPCODE_PK4UB,
|
FP_OPCODE_PK4UB, /* NV_f_p only */
|
||||||
FP_OPCODE_POW,
|
FP_OPCODE_POW,
|
||||||
FP_OPCODE_RCP,
|
FP_OPCODE_RCP,
|
||||||
FP_OPCODE_RFL,
|
FP_OPCODE_RFL, /* NV_f_p only */
|
||||||
FP_OPCODE_RSQ,
|
FP_OPCODE_RSQ,
|
||||||
FP_OPCODE_SEQ,
|
FP_OPCODE_SCS, /* ARB_f_p only */
|
||||||
FP_OPCODE_SFL,
|
FP_OPCODE_SEQ, /* NV_f_p only */
|
||||||
FP_OPCODE_SGE,
|
FP_OPCODE_SFL, /* NV_f_p only */
|
||||||
FP_OPCODE_SGT,
|
FP_OPCODE_SGE, /* NV_f_p only */
|
||||||
|
FP_OPCODE_SGT, /* NV_f_p only */
|
||||||
FP_OPCODE_SIN,
|
FP_OPCODE_SIN,
|
||||||
FP_OPCODE_SLE,
|
FP_OPCODE_SLE, /* NV_f_p only */
|
||||||
FP_OPCODE_SLT,
|
FP_OPCODE_SLT,
|
||||||
FP_OPCODE_SNE,
|
FP_OPCODE_SNE, /* NV_f_p only */
|
||||||
FP_OPCODE_STR,
|
FP_OPCODE_STR, /* NV_f_p only */
|
||||||
FP_OPCODE_SUB,
|
FP_OPCODE_SUB,
|
||||||
|
FP_OPCODE_SWZ, /* ARB_f_p only */
|
||||||
FP_OPCODE_TEX,
|
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_TXP,
|
||||||
FP_OPCODE_UP2H,
|
FP_OPCODE_UP2H, /* NV_f_p only */
|
||||||
FP_OPCODE_UP2US,
|
FP_OPCODE_UP2US, /* NV_f_p only */
|
||||||
FP_OPCODE_UP4B,
|
FP_OPCODE_UP4B, /* NV_f_p only */
|
||||||
FP_OPCODE_UP4UB,
|
FP_OPCODE_UP4UB, /* NV_f_p only */
|
||||||
FP_OPCODE_X2D,
|
FP_OPCODE_X2D, /* XPD in ARB_f_p */
|
||||||
FP_OPCODE_END /* private opcode */
|
FP_OPCODE_END /* private opcode */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -595,6 +595,17 @@ execute_program( GLcontext *ctx,
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (inst->Opcode) {
|
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:
|
case FP_OPCODE_ADD:
|
||||||
{
|
{
|
||||||
GLfloat a[4], b[4], result[4];
|
GLfloat a[4], b[4], result[4];
|
||||||
@@ -607,6 +618,19 @@ execute_program( GLcontext *ctx,
|
|||||||
store_vector4( inst, machine, result );
|
store_vector4( inst, machine, result );
|
||||||
}
|
}
|
||||||
break;
|
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:
|
case FP_OPCODE_COS:
|
||||||
{
|
{
|
||||||
GLfloat a[4], result[4];
|
GLfloat a[4], result[4];
|
||||||
@@ -682,6 +706,16 @@ execute_program( GLcontext *ctx,
|
|||||||
store_vector4( inst, machine, result );
|
store_vector4( inst, machine, result );
|
||||||
}
|
}
|
||||||
break;
|
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 */
|
case FP_OPCODE_DST: /* Distance vector */
|
||||||
{
|
{
|
||||||
GLfloat a[4], b[4], result[4];
|
GLfloat a[4], b[4], result[4];
|
||||||
@@ -952,6 +986,17 @@ execute_program( GLcontext *ctx,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
break;
|
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 */
|
case FP_OPCODE_SEQ: /* set on equal */
|
||||||
{
|
{
|
||||||
GLfloat a[4], b[4], result[4];
|
GLfloat a[4], b[4], result[4];
|
||||||
@@ -1057,6 +1102,11 @@ execute_program( GLcontext *ctx,
|
|||||||
store_vector4( inst, machine, result );
|
store_vector4( inst, machine, result );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case FP_OPCODE_SWZ:
|
||||||
|
{
|
||||||
|
/* XXX to do: extended swizzle */
|
||||||
|
}
|
||||||
|
break;
|
||||||
case FP_OPCODE_TEX:
|
case FP_OPCODE_TEX:
|
||||||
/* Texel lookup */
|
/* Texel lookup */
|
||||||
{
|
{
|
||||||
@@ -1069,6 +1119,18 @@ execute_program( GLcontext *ctx,
|
|||||||
store_vector4( inst, machine, color );
|
store_vector4( inst, machine, color );
|
||||||
}
|
}
|
||||||
break;
|
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:
|
case FP_OPCODE_TXD:
|
||||||
/* Texture lookup w/ partial derivatives for LOD */
|
/* Texture lookup w/ partial derivatives for LOD */
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user