diff options
Diffstat (limited to 'src/3rdparty/angle/src/compiler/Compiler.cpp')
-rw-r--r-- | src/3rdparty/angle/src/compiler/Compiler.cpp | 43 |
1 files changed, 39 insertions, 4 deletions
diff --git a/src/3rdparty/angle/src/compiler/Compiler.cpp b/src/3rdparty/angle/src/compiler/Compiler.cpp index 9e7f75c33a..c8c79e7147 100644 --- a/src/3rdparty/angle/src/compiler/Compiler.cpp +++ b/src/3rdparty/angle/src/compiler/Compiler.cpp @@ -19,6 +19,7 @@ #include "compiler/depgraph/DependencyGraphOutput.h" #include "compiler/timing/RestrictFragmentShaderTiming.h" #include "compiler/timing/RestrictVertexShaderTiming.h" +#include "third_party/compiler/ArrayBoundsClamper.h" bool isWebGLBasedSpec(ShShaderSpec spec) { @@ -37,6 +38,7 @@ bool InitializeSymbolTable( // The builtins deliberately don't specify precisions for the function // arguments and return types. For that reason we don't try to check them. TParseContext parseContext(symbolTable, extBehavior, intermediate, type, spec, 0, false, NULL, infoSink); + parseContext.fragmentPrecisionHigh = resources.FragmentPrecisionHigh == 1; GlobalParseContext = &parseContext; @@ -101,6 +103,8 @@ TShHandleBase::~TShHandleBase() { TCompiler::TCompiler(ShShaderType type, ShShaderSpec spec) : shaderType(type), shaderSpec(spec), + fragmentPrecisionHigh(false), + clampingStrategy(SH_CLAMP_WITH_CLAMP_INTRINSIC), builtInFunctionEmulator(type) { longNameMap = LongNameMap::GetInstance(); @@ -123,12 +127,18 @@ bool TCompiler::Init(const ShBuiltInResources& resources) if (!InitBuiltInSymbolTable(resources)) return false; InitExtensionBehavior(resources, extensionBehavior); + fragmentPrecisionHigh = resources.FragmentPrecisionHigh == 1; + + arrayBoundsClamper.SetClampingStrategy(resources.ArrayIndexClampingStrategy); + clampingStrategy = resources.ArrayIndexClampingStrategy; + + hashFunction = resources.HashFunction; return true; } bool TCompiler::compile(const char* const shaderStrings[], - const int numStrings, + size_t numStrings, int compileOptions) { TScopedPoolAllocator scopedAlloc(&allocator, true); @@ -143,7 +153,7 @@ bool TCompiler::compile(const char* const shaderStrings[], // First string is path of source file if flag is set. The actual source follows. const char* sourcePath = NULL; - int firstSource = 0; + size_t firstSource = 0; if (compileOptions & SH_SOURCE_PATH) { sourcePath = shaderStrings[0]; @@ -154,6 +164,7 @@ bool TCompiler::compile(const char* const shaderStrings[], TParseContext parseContext(symbolTable, extensionBehavior, intermediate, shaderType, shaderSpec, compileOptions, true, sourcePath, infoSink); + parseContext.fragmentPrecisionHigh = fragmentPrecisionHigh; GlobalParseContext = &parseContext; // We preserve symbols at the built-in level from compile-to-compile. @@ -190,10 +201,15 @@ bool TCompiler::compile(const char* const shaderStrings[], if (success && (compileOptions & SH_EMULATE_BUILT_IN_FUNCTIONS)) builtInFunctionEmulator.MarkBuiltInFunctionsForEmulation(root); + // Clamping uniform array bounds needs to happen after validateLimitations pass. + if (success && (compileOptions & SH_CLAMP_INDIRECT_ARRAY_BOUNDS)) + arrayBoundsClamper.MarkIndirectArrayBoundsForClamping(root); + // Call mapLongVariableNames() before collectAttribsUniforms() so in // collectAttribsUniforms() we already have the mapped symbol names and // we could composite mapped and original variable names. - if (success && (compileOptions & SH_MAP_LONG_VARIABLE_NAMES)) + // Also, if we hash all the names, then no need to do this for long names. + if (success && (compileOptions & SH_MAP_LONG_VARIABLE_NAMES) && hashFunction == NULL) mapLongVariableNames(root); if (success && (compileOptions & SH_ATTRIBUTES_UNIFORMS)) { @@ -227,6 +243,7 @@ bool TCompiler::InitBuiltInSymbolTable(const ShBuiltInResources& resources) { TBuiltIns builtIns; + compileResources = resources; builtIns.initialize(shaderType, shaderSpec, resources); return InitializeSymbolTable(builtIns.getBuiltInStrings(), shaderType, shaderSpec, resources, infoSink, symbolTable); @@ -234,6 +251,7 @@ bool TCompiler::InitBuiltInSymbolTable(const ShBuiltInResources& resources) void TCompiler::clearResults() { + arrayBoundsClamper.Cleanup(); infoSink.info.erase(); infoSink.obj.erase(); infoSink.debug.erase(); @@ -242,6 +260,8 @@ void TCompiler::clearResults() uniforms.clear(); builtInFunctionEmulator.Cleanup(); + + nameMap.clear(); } bool TCompiler::detectRecursion(TIntermNode* root) @@ -317,7 +337,7 @@ bool TCompiler::enforceVertexShaderTimingRestrictions(TIntermNode* root) void TCompiler::collectAttribsUniforms(TIntermNode* root) { - CollectAttribsUniforms collect(attribs, uniforms); + CollectAttribsUniforms collect(attribs, uniforms, hashFunction); root->traverse(&collect); } @@ -344,6 +364,21 @@ const TExtensionBehavior& TCompiler::getExtensionBehavior() const return extensionBehavior; } +const ShBuiltInResources& TCompiler::getResources() const +{ + return compileResources; +} + +const ArrayBoundsClamper& TCompiler::getArrayBoundsClamper() const +{ + return arrayBoundsClamper; +} + +ShArrayIndexClampingStrategy TCompiler::getArrayIndexClampingStrategy() const +{ + return clampingStrategy; +} + const BuiltInFunctionEmulator& TCompiler::getBuiltInFunctionEmulator() const { return builtInFunctionEmulator; |