Commit 7d6b34d2 by Alexis Hetu Committed by Alexis Hétu

modf implementation

Implemented modf as trunc + sub Passes all related dEQP tests Change-Id: I43656c51a670d235153e5fac390a8db311b14f8d Reviewed-on: https://swiftshader-review.googlesource.com/5280Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 2ce222c5
...@@ -100,6 +100,16 @@ void InsertBuiltInFunctions(GLenum type, const ShBuiltInResources &resources, TS ...@@ -100,6 +100,16 @@ void InsertBuiltInFunctions(GLenum type, const ShBuiltInResources &resources, TS
symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpSmoothStep, genType, "smoothstep", genType, genType, genType); symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpSmoothStep, genType, "smoothstep", genType, genType, genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpSmoothStep, genType, "smoothstep", float1, float1, genType); symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpSmoothStep, genType, "smoothstep", float1, float1, genType);
TType *outFloat1 = new TType(EbtFloat, EbpUndefined, EvqOut);
TType *outFloat2 = new TType(EbtFloat, EbpUndefined, EvqOut, 2);
TType *outFloat3 = new TType(EbtFloat, EbpUndefined, EvqOut, 3);
TType *outFloat4 = new TType(EbtFloat, EbpUndefined, EvqOut, 4);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpModf, float1, "modf", float1, outFloat1);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpModf, float2, "modf", float2, outFloat2);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpModf, float3, "modf", float3, outFloat3);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpModf, float4, "modf", float4, outFloat4);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpIsNan, genBType, "isnan", genType); symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpIsNan, genBType, "isnan", genType);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpIsInf, genBType, "isinf", genType); symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpIsInf, genBType, "isinf", genType);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpFloatBitsToInt, genIType, "floatBitsToInt", genType); symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpFloatBitsToInt, genIType, "floatBitsToInt", genType);
......
...@@ -1474,6 +1474,15 @@ namespace glsl ...@@ -1474,6 +1474,15 @@ namespace glsl
case EOpVectorEqual: if(visit == PostVisit) emitCmp(sw::Shader::CONTROL_EQ, result, arg[0], arg[1]); break; case EOpVectorEqual: if(visit == PostVisit) emitCmp(sw::Shader::CONTROL_EQ, result, arg[0], arg[1]); break;
case EOpVectorNotEqual: if(visit == PostVisit) emitCmp(sw::Shader::CONTROL_NE, result, arg[0], arg[1]); break; case EOpVectorNotEqual: if(visit == PostVisit) emitCmp(sw::Shader::CONTROL_NE, result, arg[0], arg[1]); break;
case EOpMod: if(visit == PostVisit) emit(sw::Shader::OPCODE_MOD, result, arg[0], arg[1]); break; case EOpMod: if(visit == PostVisit) emit(sw::Shader::OPCODE_MOD, result, arg[0], arg[1]); break;
case EOpModf:
if(visit == PostVisit)
{
TIntermTyped* arg1 = arg[1]->getAsTyped();
emit(sw::Shader::OPCODE_TRUNC, arg1, arg[0]);
assignLvalue(arg1, arg1);
emitBinary(sw::Shader::OPCODE_SUB, result, arg[0], arg1);
}
break;
case EOpPow: if(visit == PostVisit) emit(sw::Shader::OPCODE_POW, result, arg[0], arg[1]); break; case EOpPow: if(visit == PostVisit) emit(sw::Shader::OPCODE_POW, result, arg[0], arg[1]); break;
case EOpAtan: if(visit == PostVisit) emit(sw::Shader::OPCODE_ATAN2, result, arg[0], arg[1]); break; case EOpAtan: if(visit == PostVisit) emit(sw::Shader::OPCODE_ATAN2, result, arg[0], arg[1]); break;
case EOpMin: if(visit == PostVisit) emit(getOpcode(sw::Shader::OPCODE_MIN, result), result, arg[0], arg[1]); break; case EOpMin: if(visit == PostVisit) emit(getOpcode(sw::Shader::OPCODE_MIN, result), result, arg[0], arg[1]); break;
...@@ -2196,7 +2205,7 @@ namespace glsl ...@@ -2196,7 +2205,7 @@ namespace glsl
void OutputASM::assignLvalue(TIntermTyped *dst, TIntermTyped *src) void OutputASM::assignLvalue(TIntermTyped *dst, TIntermTyped *src)
{ {
if(src && if(src &&
((src->isVector() && (!dst->isVector() || (dst->getNominalSize() != dst->getNominalSize()))) || ((src->isVector() && (!dst->isVector() || (src->getNominalSize() != dst->getNominalSize()))) ||
(src->isMatrix() && (!dst->isMatrix() || (src->getNominalSize() != dst->getNominalSize()) || (src->getSecondarySize() != dst->getSecondarySize()))))) (src->isMatrix() && (!dst->isMatrix() || (src->getNominalSize() != dst->getNominalSize()) || (src->getSecondarySize() != dst->getSecondarySize())))))
{ {
return mContext.error(src->getLine(), "Result type should match the l-value type in compound assignment", src->isVector() ? "vector" : "matrix"); return mContext.error(src->getLine(), "Result type should match the l-value type in compound assignment", src->isVector() ? "vector" : "matrix");
......
...@@ -281,6 +281,7 @@ bool TOutputTraverser::visitAggregate(Visit visit, TIntermAggregate* node) ...@@ -281,6 +281,7 @@ bool TOutputTraverser::visitAggregate(Visit visit, TIntermAggregate* node)
case EOpVectorNotEqual: out << "NotEqual"; break; case EOpVectorNotEqual: out << "NotEqual"; break;
case EOpMod: out << "mod"; break; case EOpMod: out << "mod"; break;
case EOpModf: out << "modf"; break;
case EOpPow: out << "pow"; break; case EOpPow: out << "pow"; break;
case EOpAtan: out << "arc tangent"; break; case EOpAtan: out << "arc tangent"; break;
......
...@@ -130,6 +130,7 @@ enum TOperator { ...@@ -130,6 +130,7 @@ enum TOperator {
EOpCeil, EOpCeil,
EOpFract, EOpFract,
EOpMod, EOpMod,
EOpModf,
EOpMin, EOpMin,
EOpMax, EOpMax,
EOpClamp, EOpClamp,
......
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