Commit e8d2c072 by Olli Etuaho

Implement float-integer conversions for ESSL 3.00

The implementation uses asint, asuint and asfloat in the HLSL output. BUG=angle:865 Change-Id: I6b48298e18c7b3b0bdeac522b375ebc4eab7cf4e Reviewed-on: https://chromium-review.googlesource.com/239520Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Tested-by: 's avatarOlli Etuaho <oetuaho@nvidia.com>
parent d2cf3ad3
...@@ -197,6 +197,31 @@ void InsertBuiltInFunctions(sh::GLenum type, ShShaderSpec spec, const ShBuiltInR ...@@ -197,6 +197,31 @@ 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 *uint1 = new TType(EbtUInt);
TType *uint2 = new TType(EbtUInt, 2);
TType *uint3 = new TType(EbtUInt, 3);
TType *uint4 = new TType(EbtUInt, 4);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, int1, "floatBitsToInt", float1);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, int2, "floatBitsToInt", float2);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, int3, "floatBitsToInt", float3);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, int4, "floatBitsToInt", float4);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, uint1, "floatBitsToUint", float1);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, uint2, "floatBitsToUint", float2);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, uint3, "floatBitsToUint", float3);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, uint4, "floatBitsToUint", float4);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "intBitsToFloat", int1);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, float2, "intBitsToFloat", int2);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, float3, "intBitsToFloat", int3);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, float4, "intBitsToFloat", int4);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "uintBitsToFloat", uint1);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, float2, "uintBitsToFloat", uint2);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, float3, "uintBitsToFloat", uint3);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, float4, "uintBitsToFloat", uint4);
// //
// Geometric Functions. // Geometric Functions.
// //
...@@ -693,6 +718,11 @@ void IdentifyBuiltIns(sh::GLenum type, ShShaderSpec spec, ...@@ -693,6 +718,11 @@ void IdentifyBuiltIns(sh::GLenum type, ShShaderSpec spec,
symbolTable.relateToOperator(COMMON_BUILTINS, "step", EOpStep); symbolTable.relateToOperator(COMMON_BUILTINS, "step", EOpStep);
symbolTable.relateToOperator(COMMON_BUILTINS, "smoothstep", EOpSmoothStep); symbolTable.relateToOperator(COMMON_BUILTINS, "smoothstep", EOpSmoothStep);
symbolTable.relateToOperator(ESSL3_BUILTINS, "floatBitsToInt", EOpFloatBitsToInt);
symbolTable.relateToOperator(ESSL3_BUILTINS, "floatBitsToUint", EOpFloatBitsToUint);
symbolTable.relateToOperator(ESSL3_BUILTINS, "intBitsToFloat", EOpIntBitsToFloat);
symbolTable.relateToOperator(ESSL3_BUILTINS, "uintBitsToFloat", EOpUintBitsToFloat);
symbolTable.relateToOperator(COMMON_BUILTINS, "length", EOpLength); symbolTable.relateToOperator(COMMON_BUILTINS, "length", EOpLength);
symbolTable.relateToOperator(COMMON_BUILTINS, "distance", EOpDistance); symbolTable.relateToOperator(COMMON_BUILTINS, "distance", EOpDistance);
symbolTable.relateToOperator(COMMON_BUILTINS, "dot", EOpDot); symbolTable.relateToOperator(COMMON_BUILTINS, "dot", EOpDot);
......
...@@ -332,6 +332,8 @@ bool TIntermUnary::promote(TInfoSink &) ...@@ -332,6 +332,8 @@ bool TIntermUnary::promote(TInfoSink &)
case EOpAny: case EOpAny:
case EOpAll: case EOpAll:
case EOpVectorLogicalNot: case EOpVectorLogicalNot:
case EOpIntBitsToFloat:
case EOpUintBitsToFloat:
return true; return true;
default: default:
......
...@@ -123,6 +123,11 @@ enum TOperator ...@@ -123,6 +123,11 @@ enum TOperator
EOpStep, EOpStep,
EOpSmoothStep, EOpSmoothStep,
EOpFloatBitsToInt,
EOpFloatBitsToUint,
EOpIntBitsToFloat,
EOpUintBitsToFloat,
EOpLength, EOpLength,
EOpDistance, EOpDistance,
EOpDot, EOpDot,
......
...@@ -467,6 +467,19 @@ bool TOutputGLSLBase::visitUnary(Visit visit, TIntermUnary *node) ...@@ -467,6 +467,19 @@ bool TOutputGLSLBase::visitUnary(Visit visit, TIntermUnary *node)
preString = "fract("; preString = "fract(";
break; break;
case EOpFloatBitsToInt:
preString = "floatBitsToInt(";
break;
case EOpFloatBitsToUint:
preString = "floatBitsToUint(";
break;
case EOpIntBitsToFloat:
preString = "intBitsToFloat(";
break;
case EOpUintBitsToFloat:
preString = "uintBitsToFloat(";
break;
case EOpLength: case EOpLength:
preString = "length("; preString = "length(";
break; break;
......
...@@ -1792,6 +1792,10 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node) ...@@ -1792,6 +1792,10 @@ 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 EOpFloatBitsToInt: outputTriplet(visit, "asint(", "", ")"); break;
case EOpFloatBitsToUint: outputTriplet(visit, "asuint(", "", ")"); break;
case EOpIntBitsToFloat: outputTriplet(visit, "asfloat(", "", ")"); break;
case EOpUintBitsToFloat: outputTriplet(visit, "asfloat(", "", ")"); break;
case EOpLength: outputTriplet(visit, "length(", "", ")"); break; case EOpLength: outputTriplet(visit, "length(", "", ")"); break;
case EOpNormalize: outputTriplet(visit, "normalize(", "", ")"); break; case EOpNormalize: outputTriplet(visit, "normalize(", "", ")"); break;
case EOpDFdx: case EOpDFdx:
......
...@@ -290,6 +290,11 @@ bool TOutputTraverser::visitUnary(Visit visit, TIntermUnary *node) ...@@ -290,6 +290,11 @@ bool TOutputTraverser::visitUnary(Visit visit, TIntermUnary *node)
case EOpCeil: out << "Ceiling"; break; case EOpCeil: out << "Ceiling"; break;
case EOpFract: out << "Fraction"; break; case EOpFract: out << "Fraction"; 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 EOpLength: out << "length"; break; case EOpLength: out << "length"; break;
case EOpNormalize: out << "normalize"; break; case EOpNormalize: out << "normalize"; break;
// case EOpDPdx: out << "dPdx"; break; // case EOpDPdx: out << "dPdx"; 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