Commit 0c1726e6 by Arun Patole Committed by Olli Etuaho

Implement isnan/isinf

This change adds ANGLE support for isnan/isinf. BUG=angle:922 TEST=dEQP tests: dEQP-GLES3.functional.shaders.builtin_functions.common.isnan.* (high precision tests still fail) Tests passing 100% because of this change: dEQP-GLES3.functional.shaders.builtin_functions.common.isinf.* Reduced number of errors in tests: EQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common.isnan.* dEQP-GLES3.functional.shaders.constant_expressions.builtin_functions.common.isinf_* Change-Id: I52bf18b59365ea7031746ae840550162d7e6b96e Reviewed-on: https://chromium-review.googlesource.com/250761Reviewed-by: 's avatarOlli Etuaho <oetuaho@nvidia.com> Tested-by: 's avatarOlli Etuaho <oetuaho@nvidia.com> Reviewed-by: 's avatarNicolas Capens <capn@chromium.org>
parent 2b45573b
...@@ -280,6 +280,21 @@ void InsertBuiltInFunctions(sh::GLenum type, ShShaderSpec spec, const ShBuiltInR ...@@ -280,6 +280,21 @@ void InsertBuiltInFunctions(sh::GLenum type, ShShaderSpec spec, const ShBuiltInR
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "smoothstep", float1, float1, float3); symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "smoothstep", float1, float1, float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "smoothstep", float1, float1, float4); symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "smoothstep", float1, float1, float4);
TType *bool1 = new TType(EbtBool);
TType *bool2 = new TType(EbtBool, 2);
TType *bool3 = new TType(EbtBool, 3);
TType *bool4 = new TType(EbtBool, 4);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, bool1, "isnan", float1);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, bool2, "isnan", float2);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, bool3, "isnan", float3);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, bool4, "isnan", float4);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, bool1, "isinf", float1);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, bool2, "isinf", float2);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, bool3, "isinf", float3);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, bool4, "isinf", float4);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, int1, "floatBitsToInt", float1); symbolTable.insertBuiltIn(ESSL3_BUILTINS, int1, "floatBitsToInt", float1);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, int2, "floatBitsToInt", float2); symbolTable.insertBuiltIn(ESSL3_BUILTINS, int2, "floatBitsToInt", float2);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, int3, "floatBitsToInt", float3); symbolTable.insertBuiltIn(ESSL3_BUILTINS, int3, "floatBitsToInt", float3);
...@@ -397,11 +412,6 @@ void InsertBuiltInFunctions(sh::GLenum type, ShShaderSpec spec, const ShBuiltInR ...@@ -397,11 +412,6 @@ void InsertBuiltInFunctions(sh::GLenum type, ShShaderSpec spec, const ShBuiltInR
symbolTable.insertBuiltIn(ESSL3_BUILTINS, mat3, "inverse", mat3); symbolTable.insertBuiltIn(ESSL3_BUILTINS, mat3, "inverse", mat3);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, mat4, "inverse", mat4); symbolTable.insertBuiltIn(ESSL3_BUILTINS, mat4, "inverse", mat4);
TType *bool1 = new TType(EbtBool);
TType *bool2 = new TType(EbtBool, 2);
TType *bool3 = new TType(EbtBool, 3);
TType *bool4 = new TType(EbtBool, 4);
// //
// Vector relational functions. // Vector relational functions.
// //
...@@ -886,6 +896,8 @@ void IdentifyBuiltIns(sh::GLenum type, ShShaderSpec spec, ...@@ -886,6 +896,8 @@ void IdentifyBuiltIns(sh::GLenum type, ShShaderSpec spec,
symbolTable.relateToOperator(ESSL3_BUILTINS, "min", EOpMin); symbolTable.relateToOperator(ESSL3_BUILTINS, "min", EOpMin);
symbolTable.relateToOperator(ESSL3_BUILTINS, "max", EOpMax); symbolTable.relateToOperator(ESSL3_BUILTINS, "max", EOpMax);
symbolTable.relateToOperator(ESSL3_BUILTINS, "clamp", EOpClamp); symbolTable.relateToOperator(ESSL3_BUILTINS, "clamp", EOpClamp);
symbolTable.relateToOperator(ESSL3_BUILTINS, "isnan", EOpIsNan);
symbolTable.relateToOperator(ESSL3_BUILTINS, "isinf", EOpIsInf);
symbolTable.relateToOperator(ESSL3_BUILTINS, "floatBitsToInt", EOpFloatBitsToInt); symbolTable.relateToOperator(ESSL3_BUILTINS, "floatBitsToInt", EOpFloatBitsToInt);
symbolTable.relateToOperator(ESSL3_BUILTINS, "floatBitsToUint", EOpFloatBitsToUint); symbolTable.relateToOperator(ESSL3_BUILTINS, "floatBitsToUint", EOpFloatBitsToUint);
......
...@@ -100,6 +100,8 @@ const char *GetOperatorString(TOperator op) ...@@ -100,6 +100,8 @@ const char *GetOperatorString(TOperator op)
case EOpMix: return "mix"; case EOpMix: return "mix";
case EOpStep: return "step"; case EOpStep: return "step";
case EOpSmoothStep: return "smoothstep"; case EOpSmoothStep: return "smoothstep";
case EOpIsNan: return "isnan";
case EOpIsInf: return "isinf";
case EOpFloatBitsToInt: return "floatBitsToInt"; case EOpFloatBitsToInt: return "floatBitsToInt";
case EOpFloatBitsToUint: return "floatBitsToUint"; case EOpFloatBitsToUint: return "floatBitsToUint";
......
...@@ -120,6 +120,8 @@ enum TOperator ...@@ -120,6 +120,8 @@ enum TOperator
EOpMix, EOpMix,
EOpStep, EOpStep,
EOpSmoothStep, EOpSmoothStep,
EOpIsNan,
EOpIsInf,
EOpFloatBitsToInt, EOpFloatBitsToInt,
EOpFloatBitsToUint, EOpFloatBitsToUint,
......
...@@ -517,6 +517,12 @@ bool TOutputGLSLBase::visitUnary(Visit visit, TIntermUnary *node) ...@@ -517,6 +517,12 @@ bool TOutputGLSLBase::visitUnary(Visit visit, TIntermUnary *node)
case EOpFract: case EOpFract:
preString = "fract("; preString = "fract(";
break; break;
case EOpIsNan:
preString = "isnan(";
break;
case EOpIsInf:
preString = "isinf(";
break;
case EOpFloatBitsToInt: case EOpFloatBitsToInt:
preString = "floatBitsToInt("; preString = "floatBitsToInt(";
......
...@@ -1655,6 +1655,8 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node) ...@@ -1655,6 +1655,8 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node)
case EOpFloor: outputTriplet(visit, "floor(", "", ")"); break; case EOpFloor: outputTriplet(visit, "floor(", "", ")"); 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 EOpIsInf: outputTriplet(visit, "isinf(", "", ")"); break;
case EOpFloatBitsToInt: outputTriplet(visit, "asint(", "", ")"); break; case EOpFloatBitsToInt: outputTriplet(visit, "asint(", "", ")"); break;
case EOpFloatBitsToUint: outputTriplet(visit, "asuint(", "", ")"); break; case EOpFloatBitsToUint: outputTriplet(visit, "asuint(", "", ")"); break;
case EOpIntBitsToFloat: outputTriplet(visit, "asfloat(", "", ")"); break; case EOpIntBitsToFloat: outputTriplet(visit, "asfloat(", "", ")"); break;
......
...@@ -329,6 +329,8 @@ bool TOutputTraverser::visitUnary(Visit visit, TIntermUnary *node) ...@@ -329,6 +329,8 @@ bool TOutputTraverser::visitUnary(Visit visit, TIntermUnary *node)
case EOpFloor: out << "Floor"; break; case EOpFloor: out << "Floor"; 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 EOpIsInf: out << "Is infinity"; break;
case EOpFloatBitsToInt: out << "float bits to int"; break; case EOpFloatBitsToInt: out << "float bits to int"; break;
case EOpFloatBitsToUint: out << "float bits to uint"; break; case EOpFloatBitsToUint: out << "float bits to uint"; 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