case EOpAsin: return "asin";
case EOpAcos: return "acos";
case EOpAtan: return "atan";
+ case EOpSinh: return "sinh";
+ case EOpCosh: return "cosh";
+ case EOpTanh: return "tanh";
+ case EOpAsinh: return "asinh";
+ case EOpAcosh: return "acosh";
+ case EOpAtanh: return "atanh";
case EOpExp: return "exp";
case EOpLog: return "log";
case EOpExp2: return "exp2";
case EOpAbs: return "abs";
case EOpSign: return "sign";
case EOpFloor: return "floor";
+ case EOpTrunc: return "trunc";
+ case EOpRound: return "round";
+ case EOpRoundEven: return "roundEven";
case EOpCeil: return "ceil";
case EOpFract: return "fract";
case EOpLength: return "length";
case EOpFwidth: return "fwidth";
case EOpAny: return "any";
case EOpAll: return "all";
+ case EOpIsNan: return "isnan";
+ case EOpIsInf: return "isinf";
default: break;
}
case EOpAsin: if(visit == PostVisit) emit(sw::Shader::OPCODE_ASIN, result, arg); break;\r
case EOpAcos: if(visit == PostVisit) emit(sw::Shader::OPCODE_ACOS, result, arg); break;\r
case EOpAtan: if(visit == PostVisit) emit(sw::Shader::OPCODE_ATAN, result, arg); break;\r
+ case EOpSinh: if(visit == PostVisit) emit(sw::Shader::OPCODE_SINH, result, arg); break;\r
+ case EOpCosh: if(visit == PostVisit) emit(sw::Shader::OPCODE_COSH, result, arg); break;\r
+ case EOpTanh: if(visit == PostVisit) emit(sw::Shader::OPCODE_TANH, result, arg); break;\r
+ case EOpAsinh: if(visit == PostVisit) emit(sw::Shader::OPCODE_ASINH, result, arg); break;\r
+ case EOpAcosh: if(visit == PostVisit) emit(sw::Shader::OPCODE_ACOSH, result, arg); break;\r
+ case EOpAtanh: if(visit == PostVisit) emit(sw::Shader::OPCODE_ATANH, result, arg); break;\r
case EOpExp: if(visit == PostVisit) emit(sw::Shader::OPCODE_EXP, result, arg); break;\r
case EOpLog: if(visit == PostVisit) emit(sw::Shader::OPCODE_LOG, result, arg); break;\r
case EOpExp2: if(visit == PostVisit) emit(sw::Shader::OPCODE_EXP2, result, arg); break;\r
case EOpAbs: if(visit == PostVisit) emit(sw::Shader::OPCODE_ABS, result, arg); break;\r
case EOpSign: if(visit == PostVisit) emit(sw::Shader::OPCODE_SGN, result, arg); break;\r
case EOpFloor: if(visit == PostVisit) emit(sw::Shader::OPCODE_FLOOR, result, arg); break;\r
+ case EOpTrunc: if(visit == PostVisit) emit(sw::Shader::OPCODE_TRUNC, result, arg); break;\r
+ case EOpRound: if(visit == PostVisit) emit(sw::Shader::OPCODE_ROUND, result, arg); break;\r
+ case EOpRoundEven: if(visit == PostVisit) emit(sw::Shader::OPCODE_ROUNDEVEN, result, arg); break;\r
case EOpCeil: if(visit == PostVisit) emit(sw::Shader::OPCODE_CEIL, result, arg, result); break;\r
case EOpFract: if(visit == PostVisit) emit(sw::Shader::OPCODE_FRC, result, arg); break;\r
+ case EOpIsNan: if(visit == PostVisit) emit(sw::Shader::OPCODE_ISNAN, result, arg); break;\r
+ case EOpIsInf: if(visit == PostVisit) emit(sw::Shader::OPCODE_ISINF, result, arg); break;\r
case EOpLength: if(visit == PostVisit) emit(sw::Shader::OPCODE_LEN(dim(arg)), result, arg); break;\r
case EOpNormalize: if(visit == PostVisit) emit(sw::Shader::OPCODE_NRM(dim(arg)), result, arg); break;\r
case EOpDFdx: if(visit == PostVisit) emit(sw::Shader::OPCODE_DFDX, result, arg); break;\r
case EOpMix: if(visit == PostVisit) emit(sw::Shader::OPCODE_LRP, result, arg[2], arg[1], arg[0]); break;\r
case EOpStep: if(visit == PostVisit) emit(sw::Shader::OPCODE_STEP, result, arg[0], arg[1]); break;\r
case EOpSmoothStep: if(visit == PostVisit) emit(sw::Shader::OPCODE_SMOOTH, result, arg[0], arg[1], arg[2]); break;\r
+ case EOpFloatBitsToInt: if(visit == PostVisit) emit(sw::Shader::OPCODE_FLOATBITSTOINT, result, arg[0]); break;\r
+ case EOpFloatBitsToUint: if(visit == PostVisit) emit(sw::Shader::OPCODE_FLOATBITSTOUINT, result, arg[0]); break;\r
+ case EOpIntBitsToFloat: if(visit == PostVisit) emit(sw::Shader::OPCODE_INTBITSTOFLOAT, result, arg[0]); break;\r
+ case EOpUintBitsToFloat: if(visit == PostVisit) emit(sw::Shader::OPCODE_UINTBITSTOFLOAT, result, arg[0]); break;\r
+ case EOpPackSnorm2x16: if(visit == PostVisit) emit(sw::Shader::OPCODE_PACKSNORM2x16, result, arg[0]); break;\r
+ case EOpPackUnorm2x16: if(visit == PostVisit) emit(sw::Shader::OPCODE_PACKUNORM2x16, result, arg[0]); break;\r
+ case EOpPackHalf2x16: if(visit == PostVisit) emit(sw::Shader::OPCODE_PACKHALF2x16, result, arg[0]); break;\r
+ case EOpUnpackSnorm2x16: if(visit == PostVisit) emit(sw::Shader::OPCODE_UNPACKSNORM2x16, result, arg[0]); break;\r
+ case EOpUnpackUnorm2x16: if(visit == PostVisit) emit(sw::Shader::OPCODE_UNPACKUNORM2x16, result, arg[0]); break;\r
+ case EOpUnpackHalf2x16: if(visit == PostVisit) emit(sw::Shader::OPCODE_UNPACKHALF2x16, result, arg[0]); break;\r
case EOpDistance: if(visit == PostVisit) emit(sw::Shader::OPCODE_DIST(dim(arg[0])), result, arg[0], arg[1]); break;\r
case EOpDot: if(visit == PostVisit) emit(sw::Shader::OPCODE_DP(dim(arg[0])), result, arg[0], arg[1]); break;\r
case EOpCross: if(visit == PostVisit) emit(sw::Shader::OPCODE_CRS, result, arg[0], arg[1]); break;\r
case EOpAsin: out << "arc sine"; break;
case EOpAcos: out << "arc cosine"; break;
case EOpAtan: out << "arc tangent"; break;
+ case EOpSinh: out << "hyperbolic sine"; break;
+ case EOpCosh: out << "hyperbolic cosine"; break;
+ case EOpTanh: out << "hyperbolic tangent"; break;
+ case EOpAsinh: out << "arc hyperbolic sine"; break;
+ case EOpAcosh: out << "arc hyperbolic cosine"; break;
+ case EOpAtanh: out << "arc hyperbolic tangent"; break;
case EOpExp: out << "exp"; break;
case EOpLog: out << "log"; break;
case EOpAbs: out << "Absolute value"; break;
case EOpSign: out << "Sign"; break;
case EOpFloor: out << "Floor"; break;
+ case EOpTrunc: out << "Trunc"; break;
+ case EOpRound: out << "Round"; break;
+ case EOpRoundEven: out << "RoundEven"; break;
case EOpCeil: out << "Ceiling"; break;
case EOpFract: out << "Fraction"; break;
+ case EOpIsNan: out << "Is not a number"; break;
+ case EOpIsInf: out << "Is infinity"; break;
+
+ case EOpFloatBitsToInt: out << "float bits to int"; break;
+ case EOpFloatBitsToUint: out << "float bits to uint"; break;
+ case EOpIntBitsToFloat: out << "int bits to float"; break;
+ case EOpUintBitsToFloat: out << "uint bits to float"; break;
+
+ case EOpPackSnorm2x16: out << "pack Snorm 2x16"; break;
+ case EOpPackUnorm2x16: out << "pack Unorm 2x16"; break;
+ case EOpPackHalf2x16: out << "pack half 2x16"; break;
+
+ case EOpUnpackSnorm2x16: out << "unpack Snorm 2x16"; break;
+ case EOpUnpackUnorm2x16: out << "unpack Unorm 2x16"; break;
+ case EOpUnpackHalf2x16: out << "unpack half 2x16"; break;
case EOpLength: out << "length"; break;
case EOpNormalize: out << "normalize"; break;
// case EOpDPdy: out << "dPdy"; break;
// case EOpFwidth: out << "fwidth"; break;
+ case EOpDeterminant: out << "determinant"; break;
+ case EOpTranspose: out << "transpose"; break;
+ case EOpInverse: out << "inverse"; break;
+
case EOpAny: out << "any"; break;
case EOpAll: out << "all"; break;
case EOpReflect: out << "reflect"; break;
case EOpRefract: out << "refract"; break;
case EOpMul: out << "component-wise multiply"; break;
+ case EOpOuterProduct: out << "outer product"; break;
default: out.message(EPrefixError, "Bad aggregation op");
}
case Shader::OPCODE_FRC: frc(d, s0); break;
case Shader::OPCODE_TRUNC: trunc(d, s0); break;
case Shader::OPCODE_FLOOR: floor(d, s0); break;
+ case Shader::OPCODE_ROUND: round(d, s0); break;
case Shader::OPCODE_CEIL: ceil(d, s0); break;
case Shader::OPCODE_EXP2X: exp2x(d, s0, pp); break;
case Shader::OPCODE_EXP2: exp2(d, s0, pp); break;
case Shader::OPCODE_ASIN: asin(d, s0, pp); break;
case Shader::OPCODE_ATAN: atan(d, s0, pp); break;
case Shader::OPCODE_ATAN2: atan2(d, s0, s1, pp); break;
+ case Shader::OPCODE_COSH: cosh(d, s0, pp); break;
+ case Shader::OPCODE_SINH: sinh(d, s0, pp); break;
+ case Shader::OPCODE_TANH: tanh(d, s0, pp); break;
+ case Shader::OPCODE_ACOSH: acosh(d, s0, pp); break;
+ case Shader::OPCODE_ASINH: asinh(d, s0, pp); break;
+ case Shader::OPCODE_ATANH: atanh(d, s0, pp); break;
case Shader::OPCODE_M4X4: M4X4(r, d, s0, src1); break;
case Shader::OPCODE_M4X3: M4X3(r, d, s0, src1); break;
case Shader::OPCODE_M3X4: M3X4(r, d, s0, src1); break;
case OPCODE_LRP: return "lrp";
case OPCODE_STEP: return "step";
case OPCODE_SMOOTH: return "smooth";
+ case OPCODE_FLOATBITSTOINT: return "floatBitsToInt";
+ case OPCODE_FLOATBITSTOUINT: return "floatBitsToUInt";
+ case OPCODE_INTBITSTOFLOAT: return "intBitsToFloat";
+ case OPCODE_UINTBITSTOFLOAT: return "uintBitsToFloat";
+ case OPCODE_PACKSNORM2x16: return "packSnorm2x16";
+ case OPCODE_PACKUNORM2x16: return "packUnorm2x16";
+ case OPCODE_PACKHALF2x16: return "packHalf2x16";
+ case OPCODE_UNPACKSNORM2x16: return "unpackSnorm2x16";
+ case OPCODE_UNPACKUNORM2x16: return "unpackUnorm2x16";
+ case OPCODE_UNPACKHALF2x16: return "unpackHalf2x16";
case OPCODE_FRC: return "frc";
case OPCODE_M4X4: return "m4x4";
case OPCODE_M4X3: return "m4x3";
case OPCODE_ASIN: return "asin";
case OPCODE_ATAN: return "atan";
case OPCODE_ATAN2: return "atan2";
+ case OPCODE_COSH: return "cosh";
+ case OPCODE_SINH: return "sinh";
+ case OPCODE_TANH: return "tanh";
+ case OPCODE_ACOSH: return "acosh";
+ case OPCODE_ASINH: return "asinh";
+ case OPCODE_ATANH: return "atanh";
case OPCODE_DP1: return "dp1";
case OPCODE_DP2: return "dp2";
case OPCODE_TRUNC: return "trunc";
case OPCODE_FLOOR: return "floor";
+ case OPCODE_ROUND: return "round";
+ case OPCODE_ROUNDEVEN: return "roundEven";
case OPCODE_CEIL: return "ceil";
case OPCODE_EXP2: return "exp2";
case OPCODE_LOG2: return "log2";
case OPCODE_B2F: return "b2f";
case OPCODE_ALL: return "all";
case OPCODE_ANY: return "any";
+ case OPCODE_ISNAN: return "isnan";
+ case OPCODE_ISINF: return "isinf";
case OPCODE_NOT: return "not";
case OPCODE_OR: return "or";
case OPCODE_XOR: return "xor";
OPCODE_ATT, // D3DSIO_DST\r
OPCODE_LRP,\r
OPCODE_FRC,\r
+ OPCODE_ISNAN,\r
+ OPCODE_ISINF,\r
OPCODE_M4X4,\r
OPCODE_M4X3,\r
OPCODE_M3X4,\r
OPCODE_ASIN,\r
OPCODE_ATAN,\r
OPCODE_ATAN2,\r
+ OPCODE_COSH,\r
+ OPCODE_SINH,\r
+ OPCODE_TANH,\r
+ OPCODE_ACOSH,\r
+ OPCODE_ASINH,\r
+ OPCODE_ATANH,\r
OPCODE_DP1,\r
OPCODE_DP2,\r
OPCODE_TRUNC,\r
OPCODE_FLOOR,\r
+ OPCODE_ROUND,\r
+ OPCODE_ROUNDEVEN,\r
OPCODE_CEIL,\r
OPCODE_SQRT,\r
OPCODE_RSQ,\r
OPCODE_AND,\r
OPCODE_STEP,\r
OPCODE_SMOOTH,\r
+ OPCODE_FLOATBITSTOINT,\r
+ OPCODE_FLOATBITSTOUINT,\r
+ OPCODE_INTBITSTOFLOAT,\r
+ OPCODE_UINTBITSTOFLOAT,\r
+ OPCODE_PACKSNORM2x16,\r
+ OPCODE_PACKUNORM2x16,\r
+ OPCODE_PACKHALF2x16,\r
+ OPCODE_UNPACKSNORM2x16,\r
+ OPCODE_UNPACKUNORM2x16,\r
+ OPCODE_UNPACKHALF2x16,\r
OPCODE_FORWARD1,\r
OPCODE_FORWARD2,\r
OPCODE_FORWARD3,\r
Vector4f s1;
Vector4f s2;
- if(src0.type != Shader::PARAMETER_VOID) s0 = reg(r, src0);
- if(src1.type != Shader::PARAMETER_VOID) s1 = reg(r, src1);
- if(src2.type != Shader::PARAMETER_VOID) s2 = reg(r, src2);
+ if(src0.type != Shader::PARAMETER_VOID) s0 = fetchRegisterF(r, src0);
+ if(src1.type != Shader::PARAMETER_VOID) s1 = fetchRegisterF(r, src1);
+ if(src2.type != Shader::PARAMETER_VOID) s2 = fetchRegisterF(r, src2);
switch(opcode)
{
case Shader::OPCODE_FRC: frc(d, s0); break;
case Shader::OPCODE_TRUNC: trunc(d, s0); break;
case Shader::OPCODE_FLOOR: floor(d, s0); break;
+ case Shader::OPCODE_ROUND: round(d, s0); break;
case Shader::OPCODE_CEIL: ceil(d, s0); break;
case Shader::OPCODE_LIT: lit(d, s0); break;
case Shader::OPCODE_LOG2X: log2x(d, s0, pp); break;
case Shader::OPCODE_ASIN: asin(d, s0); break;
case Shader::OPCODE_ATAN: atan(d, s0); break;
case Shader::OPCODE_ATAN2: atan2(d, s0, s1); break;
+ case Shader::OPCODE_COSH: cosh(d, s0, pp); break;
+ case Shader::OPCODE_SINH: sinh(d, s0, pp); break;
+ case Shader::OPCODE_TANH: tanh(d, s0, pp); break;
+ case Shader::OPCODE_ACOSH: acosh(d, s0, pp); break;
+ case Shader::OPCODE_ASINH: asinh(d, s0, pp); break;
+ case Shader::OPCODE_ATANH: atanh(d, s0, pp); break;
case Shader::OPCODE_SLT: slt(d, s0, s1); break;
case Shader::OPCODE_SUB: sub(d, s0, s1); break;
case Shader::OPCODE_BREAK: BREAK(r); break;
}
}
- Vector4f VertexProgram::reg(Registers &r, const Src &src, int offset)
+ Vector4f VertexProgram::fetchRegisterF(Registers &r, const Src &src, int offset)
{
int i = src.index + offset;
void VertexProgram::M3X2(Registers &r, Vector4f &dst, Vector4f &src0, Src &src1)
{
- Vector4f row0 = reg(r, src1, 0);
- Vector4f row1 = reg(r, src1, 1);
+ Vector4f row0 = fetchRegisterF(r, src1, 0);
+ Vector4f row1 = fetchRegisterF(r, src1, 1);
dst.x = dot3(src0, row0);
dst.y = dot3(src0, row1);
void VertexProgram::M3X3(Registers &r, Vector4f &dst, Vector4f &src0, Src &src1)
{
- Vector4f row0 = reg(r, src1, 0);
- Vector4f row1 = reg(r, src1, 1);
- Vector4f row2 = reg(r, src1, 2);
+ Vector4f row0 = fetchRegisterF(r, src1, 0);
+ Vector4f row1 = fetchRegisterF(r, src1, 1);
+ Vector4f row2 = fetchRegisterF(r, src1, 2);
dst.x = dot3(src0, row0);
dst.y = dot3(src0, row1);
void VertexProgram::M3X4(Registers &r, Vector4f &dst, Vector4f &src0, Src &src1)
{
- Vector4f row0 = reg(r, src1, 0);
- Vector4f row1 = reg(r, src1, 1);
- Vector4f row2 = reg(r, src1, 2);
- Vector4f row3 = reg(r, src1, 3);
+ Vector4f row0 = fetchRegisterF(r, src1, 0);
+ Vector4f row1 = fetchRegisterF(r, src1, 1);
+ Vector4f row2 = fetchRegisterF(r, src1, 2);
+ Vector4f row3 = fetchRegisterF(r, src1, 3);
dst.x = dot3(src0, row0);
dst.y = dot3(src0, row1);
void VertexProgram::M4X3(Registers &r, Vector4f &dst, Vector4f &src0, Src &src1)
{
- Vector4f row0 = reg(r, src1, 0);
- Vector4f row1 = reg(r, src1, 1);
- Vector4f row2 = reg(r, src1, 2);
+ Vector4f row0 = fetchRegisterF(r, src1, 0);
+ Vector4f row1 = fetchRegisterF(r, src1, 1);
+ Vector4f row2 = fetchRegisterF(r, src1, 2);
dst.x = dot4(src0, row0);
dst.y = dot4(src0, row1);
void VertexProgram::M4X4(Registers &r, Vector4f &dst, Vector4f &src0, Src &src1)
{
- Vector4f row0 = reg(r, src1, 0);
- Vector4f row1 = reg(r, src1, 1);
- Vector4f row2 = reg(r, src1, 2);
- Vector4f row3 = reg(r, src1, 3);
+ Vector4f row0 = fetchRegisterF(r, src1, 0);
+ Vector4f row1 = fetchRegisterF(r, src1, 1);
+ Vector4f row2 = fetchRegisterF(r, src1, 2);
+ Vector4f row3 = fetchRegisterF(r, src1, 3);
dst.x = dot4(src0, row0);
dst.y = dot4(src0, row1);
}
else
{
- Int4 condition = As<Int4>(reg(r, src).x);
+ Int4 condition = As<Int4>(fetchRegisterF(r, src).x);
IF(r, condition);
}
}
Nucleus::setInsertBlock(testBlock);
r.enableContinue = restoreContinue;
- const Vector4f &src = reg(r, temporaryRegister);
+ const Vector4f &src = fetchRegisterF(r, temporaryRegister);
Int4 condition = As<Int4>(src.x);
condition &= r.enableStack[r.enableIndex - 1];
r.enableStack[r.enableIndex] = condition;
}
else
{
- Int index = As<Int>(Float(reg(r, s).x.x));
+ Int index = As<Int>(Float(fetchRegisterF(r, s).x.x));
for(int i = 0; i < 16; i++)
{
void program(Registers &r);
void passThrough(Registers &r);
- Vector4f reg(Registers &r, const Src &src, int offset = 0);
+ Vector4f fetchRegisterF(Registers &r, const Src &src, int offset = 0);
Vector4f readConstant(Registers &r, const Src &src, int offset = 0);
Int relativeAddress(Registers &r, const Shader::Parameter &var);
Int4 enableMask(Registers &r, const Shader::Instruction *instruction);