Commit 5dbece59 by Qingqing Deng Committed by Olli Etuaho

Implement trunc, round, roundEven (Emulated roundEven)

BUG=angle:934 Change-Id: If33256bf3707f3f0202147276c71f08c65518205 Reviewed-on: https://chromium-review.googlesource.com/254842Reviewed-by: 's avatarOlli Etuaho <oetuaho@nvidia.com> Tested-by: 's avatarOlli Etuaho <oetuaho@nvidia.com>
parent f84398d5
...@@ -194,6 +194,35 @@ BuiltInFunctionEmulatorHLSL::BuiltInFunctionEmulatorHLSL() ...@@ -194,6 +194,35 @@ BuiltInFunctionEmulatorHLSL::BuiltInFunctionEmulatorHLSL()
" return 0.5 * log((1.0 + x) / (1.0 - x));\n" " return 0.5 * log((1.0 + x) / (1.0 - x));\n"
"}\n"); "}\n");
AddEmulatedFunction(EOpRoundEven, float1,
"float webgl_roundEven_emu(in float x) {\n"
" return (frac(x) == 0.5 && trunc(x) % 2.0 == 0.0) ? trunc(x) : round(x);\n"
"}\n");
AddEmulatedFunction(EOpRoundEven, float2,
"float2 webgl_roundEven_emu(in float2 x) {\n"
" float2 v;\n"
" v[0] = (frac(x[0]) == 0.5 && trunc(x[0]) % 2.0 == 0.0) ? trunc(x[0]) : round(x[0]);\n"
" v[1] = (frac(x[1]) == 0.5 && trunc(x[1]) % 2.0 == 0.0) ? trunc(x[1]) : round(x[1]);\n"
" return v;\n"
"}\n");
AddEmulatedFunction(EOpRoundEven, float3,
"float3 webgl_roundEven_emu(in float3 x) {\n"
" float3 v;\n"
" v[0] = (frac(x[0]) == 0.5 && trunc(x[0]) % 2.0 == 0.0) ? trunc(x[0]) : round(x[0]);\n"
" v[1] = (frac(x[1]) == 0.5 && trunc(x[1]) % 2.0 == 0.0) ? trunc(x[1]) : round(x[1]);\n"
" v[2] = (frac(x[2]) == 0.5 && trunc(x[2]) % 2.0 == 0.0) ? trunc(x[2]) : round(x[2]);\n"
" return v;\n"
"}\n");
AddEmulatedFunction(EOpRoundEven, float4,
"float4 webgl_roundEven_emu(in float4 x) {\n"
" float4 v;\n"
" v[0] = (frac(x[0]) == 0.5 && trunc(x[0]) % 2.0 == 0.0) ? trunc(x[0]) : round(x[0]);\n"
" v[1] = (frac(x[1]) == 0.5 && trunc(x[1]) % 2.0 == 0.0) ? trunc(x[1]) : round(x[1]);\n"
" v[2] = (frac(x[2]) == 0.5 && trunc(x[2]) % 2.0 == 0.0) ? trunc(x[2]) : round(x[2]);\n"
" v[3] = (frac(x[3]) == 0.5 && trunc(x[3]) % 2.0 == 0.0) ? trunc(x[3]) : round(x[3]);\n"
" return v;\n"
"}\n");
AddEmulatedFunction(EOpPackSnorm2x16, float2, AddEmulatedFunction(EOpPackSnorm2x16, float2,
"int webgl_toSnorm(in float x) {\n" "int webgl_toSnorm(in float x) {\n"
" return int(round(clamp(x, -1.0, 1.0) * 32767.0));\n" " return int(round(clamp(x, -1.0, 1.0) * 32767.0));\n"
......
...@@ -69,6 +69,9 @@ void InsertBuiltInFunctions(sh::GLenum type, ShShaderSpec spec, const ShBuiltInR ...@@ -69,6 +69,9 @@ void InsertBuiltInFunctions(sh::GLenum type, ShShaderSpec spec, const ShBuiltInR
symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpSign, genType, "sign", genType); symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpSign, genType, "sign", genType);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpSign, genIType, "sign", genIType); symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpSign, genIType, "sign", genIType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpFloor, genType, "floor", genType); symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpFloor, genType, "floor", genType);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpTrunc, genType, "trunc", genType);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpRound, genType, "round", genType);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpRoundEven, genType, "roundEven", genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpCeil, genType, "ceil", genType); symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpCeil, genType, "ceil", genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpFract, genType, "fract", genType); symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpFract, genType, "fract", genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpMod, genType, "mod", genType, float1); symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpMod, genType, "mod", genType, float1);
......
...@@ -91,6 +91,9 @@ const char *GetOperatorString(TOperator op) ...@@ -91,6 +91,9 @@ const char *GetOperatorString(TOperator op)
case EOpAbs: return "abs"; case EOpAbs: return "abs";
case EOpSign: return "sign"; case EOpSign: return "sign";
case EOpFloor: return "floor"; case EOpFloor: return "floor";
case EOpTrunc: return "trunc";
case EOpRound: return "round";
case EOpRoundEven: return "roundEven";
case EOpCeil: return "ceil"; case EOpCeil: return "ceil";
case EOpFract: return "fract"; case EOpFract: return "fract";
case EOpMod: return "mod"; case EOpMod: return "mod";
......
...@@ -111,6 +111,9 @@ enum TOperator ...@@ -111,6 +111,9 @@ enum TOperator
EOpAbs, EOpAbs,
EOpSign, EOpSign,
EOpFloor, EOpFloor,
EOpTrunc,
EOpRound,
EOpRoundEven,
EOpCeil, EOpCeil,
EOpFract, EOpFract,
EOpMod, EOpMod,
......
...@@ -549,6 +549,15 @@ bool TOutputGLSLBase::visitUnary(Visit visit, TIntermUnary *node) ...@@ -549,6 +549,15 @@ bool TOutputGLSLBase::visitUnary(Visit visit, TIntermUnary *node)
case EOpFloor: case EOpFloor:
preString = "floor("; preString = "floor(";
break; break;
case EOpTrunc:
preString = "trunc(";
break;
case EOpRound:
preString = "round(";
break;
case EOpRoundEven:
preString = "roundEven(";
break;
case EOpCeil: case EOpCeil:
preString = "ceil("; preString = "ceil(";
break; break;
......
...@@ -1680,6 +1680,12 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node) ...@@ -1680,6 +1680,12 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node)
case EOpAbs: outputTriplet(visit, "abs(", "", ")"); break; case EOpAbs: outputTriplet(visit, "abs(", "", ")"); break;
case EOpSign: outputTriplet(visit, "sign(", "", ")"); break; case EOpSign: outputTriplet(visit, "sign(", "", ")"); break;
case EOpFloor: outputTriplet(visit, "floor(", "", ")"); break; case EOpFloor: outputTriplet(visit, "floor(", "", ")"); break;
case EOpTrunc: outputTriplet(visit, "trunc(", "", ")"); break;
case EOpRound: outputTriplet(visit, "round(", "", ")"); break;
case EOpRoundEven:
ASSERT(node->getUseEmulatedFunction());
writeEmulatedFunctionTriplet(visit, "roundEven(");
break;
case EOpCeil: outputTriplet(visit, "ceil(", "", ")"); break; case EOpCeil: outputTriplet(visit, "ceil(", "", ")"); break;
case EOpFract: outputTriplet(visit, "frac(", "", ")"); break; case EOpFract: outputTriplet(visit, "frac(", "", ")"); break;
case EOpIsNan: outputTriplet(visit, "isnan(", "", ")"); break; case EOpIsNan: outputTriplet(visit, "isnan(", "", ")"); break;
......
...@@ -327,6 +327,9 @@ bool TOutputTraverser::visitUnary(Visit visit, TIntermUnary *node) ...@@ -327,6 +327,9 @@ bool TOutputTraverser::visitUnary(Visit visit, TIntermUnary *node)
case EOpAbs: out << "Absolute value"; break; case EOpAbs: out << "Absolute value"; break;
case EOpSign: out << "Sign"; break; case EOpSign: out << "Sign"; break;
case EOpFloor: out << "Floor"; break; case EOpFloor: out << "Floor"; break;
case EOpTrunc: out << "Truncate"; break;
case EOpRound: out << "Round"; break;
case EOpRoundEven: out << "Round half even"; break;
case EOpCeil: out << "Ceiling"; break; case EOpCeil: out << "Ceiling"; break;
case EOpFract: out << "Fraction"; break; case EOpFract: out << "Fraction"; break;
case EOpIsNan: out << "Is not a number"; break; case EOpIsNan: out << "Is not a number"; break;
......
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