Commit 8fa9d23d by Nicolas Capens

Use generic types to compact the symbol table initialization.

Bug 19331817 Change-Id: I6ec0f8c6f2ef61f3d0d5adb627eab4a29dffc8ac Reviewed-on: https://swiftshader-review.googlesource.com/2380Tested-by: 's avatarNicolas Capens <capn@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 7322195e
...@@ -7,6 +7,8 @@ ...@@ -7,6 +7,8 @@
#ifndef _BASICTYPES_INCLUDED_ #ifndef _BASICTYPES_INCLUDED_
#define _BASICTYPES_INCLUDED_ #define _BASICTYPES_INCLUDED_
#include "debug.h"
// //
// Precision qualifiers // Precision qualifiers
// //
...@@ -19,9 +21,9 @@ enum TPrecision : unsigned char ...@@ -19,9 +21,9 @@ enum TPrecision : unsigned char
EbpHigh EbpHigh
}; };
inline const char* getPrecisionString(TPrecision p) inline const char *getPrecisionString(TPrecision precision)
{ {
switch(p) switch(precision)
{ {
case EbpHigh: return "highp"; break; case EbpHigh: return "highp"; break;
case EbpMedium: return "mediump"; break; case EbpMedium: return "mediump"; break;
...@@ -40,7 +42,15 @@ enum TBasicType : unsigned char ...@@ -40,7 +42,15 @@ enum TBasicType : unsigned char
EbtInt, EbtInt,
EbtUInt, EbtUInt,
EbtBool, EbtBool,
EbtGVec4, // non type: represents vec4, ivec4 and uvec4 EbtGVec4, // non type: represents vec4, ivec4, and uvec4
EbtGenType, // non type: represents float, vec2, vec3, and vec4
EbtGenIType, // non type: represents int, ivec2, ivec3, and ivec4
EbtGenUType, // non type: represents uint, uvec2, uvec3, and uvec4
EbtGenBType, // non type: represents bool, bvec2, bvec3, and bvec4
EbtVec, // non type: represents vec2, vec3, and vec4
EbtIVec, // non type: represents ivec2, ivec3, and ivec4
EbtUVec, // non type: represents uvec2, uvec3, and uvec4
EbtBVec, // non type: represents bvec2, bvec3, and bvec4
EbtGuardSamplerBegin, // non type: see implementation of IsSampler() EbtGuardSamplerBegin, // non type: see implementation of IsSampler()
EbtSampler2D, EbtSampler2D,
EbtSampler3D, EbtSampler3D,
...@@ -59,18 +69,18 @@ enum TBasicType : unsigned char ...@@ -59,18 +69,18 @@ enum TBasicType : unsigned char
EbtSamplerCubeShadow, EbtSamplerCubeShadow,
EbtSampler2DArrayShadow, EbtSampler2DArrayShadow,
EbtGuardSamplerEnd, // non type: see implementation of IsSampler() EbtGuardSamplerEnd, // non type: see implementation of IsSampler()
EbtGSampler2D, // non type: represents sampler2D, isampler2D and usampler2D EbtGSampler2D, // non type: represents sampler2D, isampler2D, and usampler2D
EbtGSampler3D, // non type: represents sampler3D, isampler3D and usampler3D EbtGSampler3D, // non type: represents sampler3D, isampler3D, and usampler3D
EbtGSamplerCube, // non type: represents samplerCube, isamplerCube and usamplerCube EbtGSamplerCube, // non type: represents samplerCube, isamplerCube, and usamplerCube
EbtGSampler2DArray, // non type: represents sampler2DArray, isampler2DArray and usampler2DArray EbtGSampler2DArray, // non type: represents sampler2DArray, isampler2DArray, and usampler2DArray
EbtStruct, EbtStruct,
EbtAddress, // should be deprecated?? EbtAddress, // should be deprecated??
EbtInvariant // used as a type when qualifying a previously declared variable as being invariant EbtInvariant // used as a type when qualifying a previously declared variable as being invariant
}; };
inline const char* getBasicString(TBasicType t) inline const char *getBasicString(TBasicType type)
{ {
switch (t) switch(type)
{ {
case EbtVoid: return "void"; case EbtVoid: return "void";
case EbtFloat: return "float"; case EbtFloat: return "float";
...@@ -82,7 +92,7 @@ inline const char* getBasicString(TBasicType t) ...@@ -82,7 +92,7 @@ inline const char* getBasicString(TBasicType t)
case EbtSamplerExternalOES: return "samplerExternalOES"; case EbtSamplerExternalOES: return "samplerExternalOES";
case EbtSampler3D: return "sampler3D"; case EbtSampler3D: return "sampler3D";
case EbtStruct: return "structure"; case EbtStruct: return "structure";
default: return "unknown type"; default: UNREACHABLE(); return "unknown type";
} }
} }
...@@ -158,9 +168,9 @@ struct TLayoutQualifier ...@@ -158,9 +168,9 @@ struct TLayoutQualifier
// //
// This is just for debug print out, carried along with the definitions above. // This is just for debug print out, carried along with the definitions above.
// //
inline const char* getQualifierString(TQualifier q) inline const char *getQualifierString(TQualifier qualifier)
{ {
switch(q) switch(qualifier)
{ {
case EvqTemporary: return "Temporary"; break; case EvqTemporary: return "Temporary"; break;
case EvqGlobal: return "Global"; break; case EvqGlobal: return "Global"; break;
...@@ -183,7 +193,7 @@ inline const char* getQualifierString(TQualifier q) ...@@ -183,7 +193,7 @@ inline const char* getQualifierString(TQualifier q)
case EvqFrontFacing: return "FrontFacing"; break; case EvqFrontFacing: return "FrontFacing"; break;
case EvqFragColor: return "FragColor"; break; case EvqFragColor: return "FragColor"; break;
case EvqFragData: return "FragData"; break; case EvqFragData: return "FragData"; break;
default: return "unknown qualifier"; default: UNREACHABLE(); return "unknown qualifier";
} }
} }
......
...@@ -20,219 +20,66 @@ void InsertBuiltInFunctions(GLenum type, const ShBuiltInResources &resources, TS ...@@ -20,219 +20,66 @@ void InsertBuiltInFunctions(GLenum type, const ShBuiltInResources &resources, TS
TType *float2 = new TType(EbtFloat, 2); TType *float2 = new TType(EbtFloat, 2);
TType *float3 = new TType(EbtFloat, 3); TType *float3 = new TType(EbtFloat, 3);
TType *float4 = new TType(EbtFloat, 4); TType *float4 = new TType(EbtFloat, 4);
TType *genType = new TType(EbtGenType);
TType *int2 = new TType(EbtInt, 2);
TType *int3 = new TType(EbtInt, 3);
TType *int4 = new TType(EbtInt, 4);
// //
// Angle and Trigonometric Functions. // Angle and Trigonometric Functions.
// //
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "radians", float1); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "radians", genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "radians", float2); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "degrees", genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "radians", float3); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "sin", genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "radians", float4); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "cos", genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "tan", genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "degrees", float1); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "asin", genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "degrees", float2); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "acos", genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "degrees", float3); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "atan", genType, genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "degrees", float4); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "atan", genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "sin", float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "sin", float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "sin", float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "sin", float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "cos", float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "cos", float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "cos", float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "cos", float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "tan", float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "tan", float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "tan", float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "tan", float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "asin", float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "asin", float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "asin", float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "asin", float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "acos", float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "acos", float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "acos", float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "acos", float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "atan", float1, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "atan", float2, float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "atan", float3, float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "atan", float4, float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "atan", float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "atan", float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "atan", float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "atan", float4);
// //
// Exponential Functions. // Exponential Functions.
// //
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "pow", float1, float1); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "pow", genType, genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "pow", float2, float2); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "exp", genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "pow", float3, float3); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "log", genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "pow", float4, float4); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "exp2", genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "log2", genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "exp", float1); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "sqrt", genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "exp", float2); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "inversesqrt", genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "exp", float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "exp", float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "log", float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "log", float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "log", float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "log", float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "exp2", float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "exp2", float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "exp2", float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "exp2", float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "log2", float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "log2", float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "log2", float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "log2", float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "sqrt", float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "sqrt", float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "sqrt", float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "sqrt", float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "inversesqrt", float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "inversesqrt", float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "inversesqrt", float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "inversesqrt", float4);
// //
// Common Functions. // Common Functions.
// //
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "abs", float1); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "abs", genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "abs", float2); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "sign", genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "abs", float3); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "floor", genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "abs", float4); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "ceil", genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "fract", genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "sign", float1); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "mod", genType, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "sign", float2); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "mod", genType, genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "sign", float3); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "min", genType, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "sign", float4); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "min", genType, genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "max", genType, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "floor", float1); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "max", genType, genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "floor", float2); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "clamp", genType, float1, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "floor", float3); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "clamp", genType, genType, genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "floor", float4); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "mix", genType, genType, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "mix", genType, genType, genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "ceil", float1); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "step", genType, genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "ceil", float2); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "step", float1, genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "ceil", float3); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "smoothstep", genType, genType, genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "ceil", float4); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "smoothstep", float1, float1, genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "fract", float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "fract", float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "fract", float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "fract", float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "mod", float1, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "mod", float2, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "mod", float3, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "mod", float4, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "mod", float2, float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "mod", float3, float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "mod", float4, float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "min", float1, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "min", float2, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "min", float3, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "min", float4, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "min", float2, float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "min", float3, float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "min", float4, float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "max", float1, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "max", float2, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "max", float3, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "max", float4, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "max", float2, float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "max", float3, float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "max", float4, float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "clamp", float1, float1, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "clamp", float2, float1, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "clamp", float3, float1, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "clamp", float4, float1, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "clamp", float2, float2, float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "clamp", float3, float3, float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "clamp", float4, float4, float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "mix", float1, float1, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "mix", float2, float2, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "mix", float3, float3, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "mix", float4, float4, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "mix", float2, float2, float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "mix", float3, float3, float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "mix", float4, float4, float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "step", float1, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "step", float2, float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "step", float3, float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "step", float4, float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "step", float1, float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "step", float1, float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "step", float1, float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "smoothstep", float1, float1, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "smoothstep", float2, float2, float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "smoothstep", float3, float3, float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "smoothstep", float4, float4, float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "smoothstep", float1, float1, float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "smoothstep", float1, float1, float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "smoothstep", float1, float1, float4);
// //
// Geometric Functions. // Geometric Functions.
// //
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "length", float1); symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "length", genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "length", float2); symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "distance", genType, genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "length", float3); symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "dot", genType, genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "length", float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "distance", float1, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "distance", float2, float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "distance", float3, float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "distance", float4, float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "dot", float1, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "dot", float2, float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "dot", float3, float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "dot", float4, float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "cross", float3, float3); symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "cross", float3, float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "normalize", float1); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "normalize", genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "normalize", float2); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "faceforward", genType, genType, genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "normalize", float3); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "reflect", genType, genType);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "normalize", float4); symbolTable.insertBuiltIn(COMMON_BUILTINS, genType, "refract", genType, genType, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "faceforward", float1, float1, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "faceforward", float2, float2, float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "faceforward", float3, float3, float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "faceforward", float4, float4, float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "reflect", float1, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "reflect", float2, float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "reflect", float3, float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "reflect", float4, float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float1, "refract", float1, float1, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float2, "refract", float2, float2, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float3, "refract", float3, float3, float1);
symbolTable.insertBuiltIn(COMMON_BUILTINS, float4, "refract", float4, float4, float1);
TType *mat2 = new TType(EbtFloat, 2, true); TType *mat2 = new TType(EbtFloat, 2, true);
TType *mat3 = new TType(EbtFloat, 3, true); TType *mat3 = new TType(EbtFloat, 3, true);
...@@ -246,80 +93,30 @@ void InsertBuiltInFunctions(GLenum type, const ShBuiltInResources &resources, TS ...@@ -246,80 +93,30 @@ void InsertBuiltInFunctions(GLenum type, const ShBuiltInResources &resources, TS
symbolTable.insertBuiltIn(COMMON_BUILTINS, mat4, "matrixCompMult", mat4, mat4); symbolTable.insertBuiltIn(COMMON_BUILTINS, mat4, "matrixCompMult", mat4, mat4);
TType *bool1 = new TType(EbtBool); TType *bool1 = new TType(EbtBool);
TType *bool2 = new TType(EbtBool, 2); TType *vec = new TType(EbtVec);
TType *bool3 = new TType(EbtBool, 3); TType *ivec = new TType(EbtIVec);
TType *bool4 = new TType(EbtBool, 4); TType *bvec = new TType(EbtBVec);
// //
// Vector relational functions. // Vector relational functions.
// //
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "lessThan", float2, float2); symbolTable.insertBuiltIn(COMMON_BUILTINS, bvec, "lessThan", vec, vec);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "lessThan", float3, float3); symbolTable.insertBuiltIn(COMMON_BUILTINS, bvec, "lessThan", ivec, ivec);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "lessThan", float4, float4); symbolTable.insertBuiltIn(COMMON_BUILTINS, bvec, "lessThanEqual", vec, vec);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bvec, "lessThanEqual", ivec, ivec);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "lessThan", int2, int2); symbolTable.insertBuiltIn(COMMON_BUILTINS, bvec, "greaterThan", vec, vec);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "lessThan", int3, int3); symbolTable.insertBuiltIn(COMMON_BUILTINS, bvec, "greaterThan", ivec, ivec);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "lessThan", int4, int4); symbolTable.insertBuiltIn(COMMON_BUILTINS, bvec, "greaterThanEqual", vec, vec);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bvec, "greaterThanEqual", ivec, ivec);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "lessThanEqual", float2, float2); symbolTable.insertBuiltIn(COMMON_BUILTINS, bvec, "equal", vec, vec);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "lessThanEqual", float3, float3); symbolTable.insertBuiltIn(COMMON_BUILTINS, bvec, "equal", ivec, ivec);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "lessThanEqual", float4, float4); symbolTable.insertBuiltIn(COMMON_BUILTINS, bvec, "equal", bvec, bvec);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bvec, "notEqual", vec, vec);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "lessThanEqual", int2, int2); symbolTable.insertBuiltIn(COMMON_BUILTINS, bvec, "notEqual", ivec, ivec);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "lessThanEqual", int3, int3); symbolTable.insertBuiltIn(COMMON_BUILTINS, bvec, "notEqual", bvec, bvec);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "lessThanEqual", int4, int4); symbolTable.insertBuiltIn(COMMON_BUILTINS, bool1, "any", bvec);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool1, "all", bvec);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "greaterThan", float2, float2); symbolTable.insertBuiltIn(COMMON_BUILTINS, bvec, "not", bvec);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "greaterThan", float3, float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "greaterThan", float4, float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "greaterThan", int2, int2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "greaterThan", int3, int3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "greaterThan", int4, int4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "greaterThanEqual", float2, float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "greaterThanEqual", float3, float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "greaterThanEqual", float4, float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "greaterThanEqual", int2, int2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "greaterThanEqual", int3, int3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "greaterThanEqual", int4, int4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "equal", float2, float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "equal", float3, float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "equal", float4, float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "equal", int2, int2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "equal", int3, int3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "equal", int4, int4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "equal", bool2, bool2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "equal", bool3, bool3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "equal", bool4, bool4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "notEqual", float2, float2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "notEqual", float3, float3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "notEqual", float4, float4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "notEqual", int2, int2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "notEqual", int3, int3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "notEqual", int4, int4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "notEqual", bool2, bool2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "notEqual", bool3, bool3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "notEqual", bool4, bool4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool1, "any", bool2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool1, "any", bool3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool1, "any", bool4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool1, "all", bool2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool1, "all", bool3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool1, "all", bool4);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool2, "not", bool2);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool3, "not", bool3);
symbolTable.insertBuiltIn(COMMON_BUILTINS, bool4, "not", bool4);
TType *sampler2D = new TType(EbtSampler2D); TType *sampler2D = new TType(EbtSampler2D);
TType *samplerCube = new TType(EbtSamplerCube); TType *samplerCube = new TType(EbtSamplerCube);
...@@ -353,20 +150,9 @@ void InsertBuiltInFunctions(GLenum type, const ShBuiltInResources &resources, TS ...@@ -353,20 +150,9 @@ void InsertBuiltInFunctions(GLenum type, const ShBuiltInResources &resources, TS
if(resources.OES_standard_derivatives) if(resources.OES_standard_derivatives)
{ {
symbolTable.insertBuiltIn(ESSL1_BUILTINS, float1, "dFdx", float1); symbolTable.insertBuiltIn(ESSL1_BUILTINS, genType, "dFdx", genType);
symbolTable.insertBuiltIn(ESSL1_BUILTINS, float2, "dFdx", float2); symbolTable.insertBuiltIn(ESSL1_BUILTINS, genType, "dFdy", genType);
symbolTable.insertBuiltIn(ESSL1_BUILTINS, float3, "dFdx", float3); symbolTable.insertBuiltIn(ESSL1_BUILTINS, genType, "fwidth", genType);
symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "dFdx", float4);
symbolTable.insertBuiltIn(ESSL1_BUILTINS, float1, "dFdy", float1);
symbolTable.insertBuiltIn(ESSL1_BUILTINS, float2, "dFdy", float2);
symbolTable.insertBuiltIn(ESSL1_BUILTINS, float3, "dFdy", float3);
symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "dFdy", float4);
symbolTable.insertBuiltIn(ESSL1_BUILTINS, float1, "fwidth", float1);
symbolTable.insertBuiltIn(ESSL1_BUILTINS, float2, "fwidth", float2);
symbolTable.insertBuiltIn(ESSL1_BUILTINS, float3, "fwidth", float3);
symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "fwidth", float4);
} }
} }
......
...@@ -228,6 +228,70 @@ enum ESymbolLevel ...@@ -228,6 +228,70 @@ enum ESymbolLevel
GLOBAL_LEVEL GLOBAL_LEVEL
}; };
inline bool IsGenType(const TType *type)
{
if(type)
{
TBasicType basicType = type->getBasicType();
return basicType == EbtGenType || basicType == EbtGenIType || basicType == EbtGenUType || basicType == EbtGenBType;
}
return false;
}
inline bool IsVecType(const TType *type)
{
if(type)
{
TBasicType basicType = type->getBasicType();
return basicType == EbtVec || basicType == EbtIVec || basicType == EbtUVec || basicType == EbtBVec;
}
return false;
}
inline TType *GenType(TType *type, int size)
{
ASSERT(size >= 1 && size <= 4);
if(!type)
{
return nullptr;
}
ASSERT(!IsVecType(type));
switch(type->getBasicType())
{
case EbtGenType: return new TType(EbtFloat, size);
case EbtGenIType: return new TType(EbtInt, size);
case EbtGenUType: return new TType(EbtUInt, size);
case EbtGenBType: return new TType(EbtBool, size);
default: return type;
}
}
inline TType *VecType(TType *type, int size)
{
ASSERT(size >= 2 && size <= 4);
if(!type)
{
return nullptr;
}
ASSERT(!IsGenType(type));
switch(type->getBasicType())
{
case EbtVec: return new TType(EbtFloat, size);
case EbtIVec: return new TType(EbtInt, size);
case EbtUVec: return new TType(EbtUInt, size);
case EbtBVec: return new TType(EbtBool, size);
default: return type;
}
}
class TSymbolTable class TSymbolTable
{ {
public: public:
...@@ -315,6 +379,29 @@ public: ...@@ -315,6 +379,29 @@ public:
insertBuiltIn(level, gvec4 ? new TType(EbtUInt, 4) : rvalue, name, new TType(EbtUSampler2DArray), ptype2, ptype3, ptype4); insertBuiltIn(level, gvec4 ? new TType(EbtUInt, 4) : rvalue, name, new TType(EbtUSampler2DArray), ptype2, ptype3, ptype4);
return; return;
} }
else if(IsGenType(rvalue) ||
IsGenType(ptype1) ||
IsGenType(ptype2) ||
IsGenType(ptype3) ||
IsGenType(ptype4))
{
insertBuiltIn(level, GenType(rvalue, 1), name, GenType(ptype1, 1), GenType(ptype2, 1), GenType(ptype3, 1), GenType(ptype4, 1));
insertBuiltIn(level, GenType(rvalue, 2), name, GenType(ptype1, 2), GenType(ptype2, 2), GenType(ptype3, 2), GenType(ptype4, 2));
insertBuiltIn(level, GenType(rvalue, 3), name, GenType(ptype1, 3), GenType(ptype2, 3), GenType(ptype3, 3), GenType(ptype4, 3));
insertBuiltIn(level, GenType(rvalue, 4), name, GenType(ptype1, 4), GenType(ptype2, 4), GenType(ptype3, 4), GenType(ptype4, 4));
return;
}
else if(IsVecType(rvalue) ||
IsVecType(ptype1) ||
IsVecType(ptype2) ||
IsVecType(ptype3) ||
IsVecType(ptype4))
{
insertBuiltIn(level, VecType(rvalue, 2), name, VecType(ptype1, 2), VecType(ptype2, 2), VecType(ptype3, 2), VecType(ptype4, 2));
insertBuiltIn(level, VecType(rvalue, 3), name, VecType(ptype1, 3), VecType(ptype2, 3), VecType(ptype3, 3), VecType(ptype4, 3));
insertBuiltIn(level, VecType(rvalue, 4), name, VecType(ptype1, 4), VecType(ptype2, 4), VecType(ptype3, 4), VecType(ptype4, 4));
return;
}
TFunction *function = new TFunction(NewPoolTString(name), *rvalue); TFunction *function = new TFunction(NewPoolTString(name), *rvalue);
...@@ -333,6 +420,12 @@ public: ...@@ -333,6 +420,12 @@ public:
function->addParameter(param3); function->addParameter(param3);
} }
if(ptype4)
{
TParameter param4 = {0, ptype4};
function->addParameter(param4);
}
insert(level, *function); insert(level, *function);
} }
......
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