Commit af1970ce by Alexis Hetu Committed by Alexis Hétu

Connecting the dots for some built-in functions

- Completed implementation of round and hyperbolic trigonometry operations - Added a few more cases in op to string functions Change-Id: Ic09d228de8e4446a66152b70edc6a6bba511288a Reviewed-on: https://swiftshader-review.googlesource.com/2891Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 9ec919a6
......@@ -80,6 +80,12 @@ const char* getOperatorString(TOperator op) {
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";
......@@ -89,6 +95,9 @@ const char* getOperatorString(TOperator op) {
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";
......@@ -98,6 +107,8 @@ const char* getOperatorString(TOperator op) {
case EOpFwidth: return "fwidth";
case EOpAny: return "any";
case EOpAll: return "all";
case EOpIsNan: return "isnan";
case EOpIsInf: return "isinf";
default: break;
}
......
......@@ -624,6 +624,12 @@ namespace glsl
case EOpAsin: if(visit == PostVisit) emit(sw::Shader::OPCODE_ASIN, result, arg); break;
case EOpAcos: if(visit == PostVisit) emit(sw::Shader::OPCODE_ACOS, result, arg); break;
case EOpAtan: if(visit == PostVisit) emit(sw::Shader::OPCODE_ATAN, result, arg); break;
case EOpSinh: if(visit == PostVisit) emit(sw::Shader::OPCODE_SINH, result, arg); break;
case EOpCosh: if(visit == PostVisit) emit(sw::Shader::OPCODE_COSH, result, arg); break;
case EOpTanh: if(visit == PostVisit) emit(sw::Shader::OPCODE_TANH, result, arg); break;
case EOpAsinh: if(visit == PostVisit) emit(sw::Shader::OPCODE_ASINH, result, arg); break;
case EOpAcosh: if(visit == PostVisit) emit(sw::Shader::OPCODE_ACOSH, result, arg); break;
case EOpAtanh: if(visit == PostVisit) emit(sw::Shader::OPCODE_ATANH, result, arg); break;
case EOpExp: if(visit == PostVisit) emit(sw::Shader::OPCODE_EXP, result, arg); break;
case EOpLog: if(visit == PostVisit) emit(sw::Shader::OPCODE_LOG, result, arg); break;
case EOpExp2: if(visit == PostVisit) emit(sw::Shader::OPCODE_EXP2, result, arg); break;
......@@ -633,8 +639,13 @@ namespace glsl
case EOpAbs: if(visit == PostVisit) emit(sw::Shader::OPCODE_ABS, result, arg); break;
case EOpSign: if(visit == PostVisit) emit(sw::Shader::OPCODE_SGN, result, arg); break;
case EOpFloor: if(visit == PostVisit) emit(sw::Shader::OPCODE_FLOOR, result, arg); break;
case EOpTrunc: if(visit == PostVisit) emit(sw::Shader::OPCODE_TRUNC, result, arg); break;
case EOpRound: if(visit == PostVisit) emit(sw::Shader::OPCODE_ROUND, result, arg); break;
case EOpRoundEven: if(visit == PostVisit) emit(sw::Shader::OPCODE_ROUNDEVEN, result, arg); break;
case EOpCeil: if(visit == PostVisit) emit(sw::Shader::OPCODE_CEIL, result, arg, result); break;
case EOpFract: if(visit == PostVisit) emit(sw::Shader::OPCODE_FRC, result, arg); break;
case EOpIsNan: if(visit == PostVisit) emit(sw::Shader::OPCODE_ISNAN, result, arg); break;
case EOpIsInf: if(visit == PostVisit) emit(sw::Shader::OPCODE_ISINF, result, arg); break;
case EOpLength: if(visit == PostVisit) emit(sw::Shader::OPCODE_LEN(dim(arg)), result, arg); break;
case EOpNormalize: if(visit == PostVisit) emit(sw::Shader::OPCODE_NRM(dim(arg)), result, arg); break;
case EOpDFdx: if(visit == PostVisit) emit(sw::Shader::OPCODE_DFDX, result, arg); break;
......@@ -1024,6 +1035,16 @@ namespace glsl
case EOpMix: if(visit == PostVisit) emit(sw::Shader::OPCODE_LRP, result, arg[2], arg[1], arg[0]); break;
case EOpStep: if(visit == PostVisit) emit(sw::Shader::OPCODE_STEP, result, arg[0], arg[1]); break;
case EOpSmoothStep: if(visit == PostVisit) emit(sw::Shader::OPCODE_SMOOTH, result, arg[0], arg[1], arg[2]); break;
case EOpFloatBitsToInt: if(visit == PostVisit) emit(sw::Shader::OPCODE_FLOATBITSTOINT, result, arg[0]); break;
case EOpFloatBitsToUint: if(visit == PostVisit) emit(sw::Shader::OPCODE_FLOATBITSTOUINT, result, arg[0]); break;
case EOpIntBitsToFloat: if(visit == PostVisit) emit(sw::Shader::OPCODE_INTBITSTOFLOAT, result, arg[0]); break;
case EOpUintBitsToFloat: if(visit == PostVisit) emit(sw::Shader::OPCODE_UINTBITSTOFLOAT, result, arg[0]); break;
case EOpPackSnorm2x16: if(visit == PostVisit) emit(sw::Shader::OPCODE_PACKSNORM2x16, result, arg[0]); break;
case EOpPackUnorm2x16: if(visit == PostVisit) emit(sw::Shader::OPCODE_PACKUNORM2x16, result, arg[0]); break;
case EOpPackHalf2x16: if(visit == PostVisit) emit(sw::Shader::OPCODE_PACKHALF2x16, result, arg[0]); break;
case EOpUnpackSnorm2x16: if(visit == PostVisit) emit(sw::Shader::OPCODE_UNPACKSNORM2x16, result, arg[0]); break;
case EOpUnpackUnorm2x16: if(visit == PostVisit) emit(sw::Shader::OPCODE_UNPACKUNORM2x16, result, arg[0]); break;
case EOpUnpackHalf2x16: if(visit == PostVisit) emit(sw::Shader::OPCODE_UNPACKHALF2x16, result, arg[0]); break;
case EOpDistance: if(visit == PostVisit) emit(sw::Shader::OPCODE_DIST(dim(arg[0])), result, arg[0], arg[1]); break;
case EOpDot: if(visit == PostVisit) emit(sw::Shader::OPCODE_DP(dim(arg[0])), result, arg[0], arg[1]); break;
case EOpCross: if(visit == PostVisit) emit(sw::Shader::OPCODE_CRS, result, arg[0], arg[1]); break;
......
......@@ -160,6 +160,12 @@ bool TOutputTraverser::visitUnary(Visit visit, TIntermUnary* node)
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;
......@@ -171,8 +177,26 @@ bool TOutputTraverser::visitUnary(Visit visit, TIntermUnary* node)
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;
......@@ -180,6 +204,10 @@ bool TOutputTraverser::visitUnary(Visit visit, TIntermUnary* node)
// 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;
......@@ -258,6 +286,7 @@ bool TOutputTraverser::visitAggregate(Visit visit, TIntermAggregate* node)
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");
}
......
......@@ -4042,6 +4042,7 @@ namespace sw
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;
......@@ -4095,6 +4096,12 @@ namespace sw
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;
......
......@@ -764,6 +764,16 @@ namespace sw
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";
......@@ -864,10 +874,18 @@ namespace sw
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";
......@@ -878,6 +896,8 @@ namespace sw
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";
......
......@@ -52,6 +52,8 @@ namespace sw
OPCODE_ATT, // D3DSIO_DST
OPCODE_LRP,
OPCODE_FRC,
OPCODE_ISNAN,
OPCODE_ISINF,
OPCODE_M4X4,
OPCODE_M4X3,
OPCODE_M3X4,
......@@ -147,10 +149,18 @@ namespace sw
OPCODE_ASIN,
OPCODE_ATAN,
OPCODE_ATAN2,
OPCODE_COSH,
OPCODE_SINH,
OPCODE_TANH,
OPCODE_ACOSH,
OPCODE_ASINH,
OPCODE_ATANH,
OPCODE_DP1,
OPCODE_DP2,
OPCODE_TRUNC,
OPCODE_FLOOR,
OPCODE_ROUND,
OPCODE_ROUNDEVEN,
OPCODE_CEIL,
OPCODE_SQRT,
OPCODE_RSQ,
......@@ -180,6 +190,16 @@ namespace sw
OPCODE_AND,
OPCODE_STEP,
OPCODE_SMOOTH,
OPCODE_FLOATBITSTOINT,
OPCODE_FLOATBITSTOUINT,
OPCODE_INTBITSTOFLOAT,
OPCODE_UINTBITSTOFLOAT,
OPCODE_PACKSNORM2x16,
OPCODE_PACKUNORM2x16,
OPCODE_PACKHALF2x16,
OPCODE_UNPACKSNORM2x16,
OPCODE_UNPACKUNORM2x16,
OPCODE_UNPACKHALF2x16,
OPCODE_FORWARD1,
OPCODE_FORWARD2,
OPCODE_FORWARD3,
......
......@@ -118,9 +118,9 @@ namespace sw
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)
{
......@@ -163,6 +163,7 @@ namespace sw
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;
......@@ -213,6 +214,12 @@ namespace sw
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;
......@@ -596,7 +603,7 @@ namespace sw
}
}
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;
......@@ -859,8 +866,8 @@ namespace sw
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);
......@@ -868,9 +875,9 @@ namespace sw
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);
......@@ -879,10 +886,10 @@ namespace sw
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);
......@@ -892,9 +899,9 @@ namespace sw
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);
......@@ -903,10 +910,10 @@ namespace sw
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);
......@@ -1188,7 +1195,7 @@ namespace sw
}
else
{
Int4 condition = As<Int4>(reg(r, src).x);
Int4 condition = As<Int4>(fetchRegisterF(r, src).x);
IF(r, condition);
}
}
......@@ -1358,7 +1365,7 @@ namespace sw
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;
......@@ -1453,7 +1460,7 @@ namespace sw
}
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++)
{
......
......@@ -41,7 +41,7 @@ namespace sw
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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment