Commit 87cc90df by Olli Etuaho Committed by Commit Bot

Set proper precision on loop index for variable init

Previously the index variable was missing a precision. This may have been behind loop-based init failing on some Android platforms. BUG=chromium:735497 TEST=angle_unittests Change-Id: I0307891dfb2edf6c52efd5b495f602b380263d65 Reviewed-on: https://chromium-review.googlesource.com/822413Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
parent 495162b9
...@@ -602,7 +602,10 @@ bool TCompiler::checkAndSimplifyAST(TIntermBlock *root, ...@@ -602,7 +602,10 @@ bool TCompiler::checkAndSimplifyAST(TIntermBlock *root,
bool initializeLocalsAndGlobals = bool initializeLocalsAndGlobals =
(compileOptions & SH_INITIALIZE_UNINITIALIZED_LOCALS) && !IsOutputHLSL(getOutputType()); (compileOptions & SH_INITIALIZE_UNINITIALIZED_LOCALS) && !IsOutputHLSL(getOutputType());
bool canUseLoopsToInitialize = !(compileOptions & SH_DONT_USE_LOOPS_TO_INITIALIZE_VARIABLES); bool canUseLoopsToInitialize = !(compileOptions & SH_DONT_USE_LOOPS_TO_INITIALIZE_VARIABLES);
DeferGlobalInitializers(root, initializeLocalsAndGlobals, canUseLoopsToInitialize, &symbolTable); bool highPrecisionSupported =
shaderType != GL_FRAGMENT_SHADER || compileResources.FragmentPrecisionHigh;
DeferGlobalInitializers(root, initializeLocalsAndGlobals, canUseLoopsToInitialize,
highPrecisionSupported, &symbolTable);
if (initializeLocalsAndGlobals) if (initializeLocalsAndGlobals)
{ {
...@@ -623,7 +626,7 @@ bool TCompiler::checkAndSimplifyAST(TIntermBlock *root, ...@@ -623,7 +626,7 @@ bool TCompiler::checkAndSimplifyAST(TIntermBlock *root,
} }
InitializeUninitializedLocals(root, getShaderVersion(), canUseLoopsToInitialize, InitializeUninitializedLocals(root, getShaderVersion(), canUseLoopsToInitialize,
&getSymbolTable()); highPrecisionSupported, &getSymbolTable());
} }
if (getShaderType() == GL_VERTEX_SHADER && (compileOptions & SH_CLAMP_POINT_SIZE)) if (getShaderType() == GL_VERTEX_SHADER && (compileOptions & SH_CLAMP_POINT_SIZE))
...@@ -1067,7 +1070,7 @@ void TCompiler::initializeGLPosition(TIntermBlock *root) ...@@ -1067,7 +1070,7 @@ void TCompiler::initializeGLPosition(TIntermBlock *root)
sh::ShaderVariable var(GL_FLOAT_VEC4); sh::ShaderVariable var(GL_FLOAT_VEC4);
var.name = "gl_Position"; var.name = "gl_Position";
list.push_back(var); list.push_back(var);
InitializeVariables(root, list, &symbolTable, shaderVersion, extensionBehavior, false); InitializeVariables(root, list, &symbolTable, shaderVersion, extensionBehavior, false, false);
} }
void TCompiler::useAllMembersInUnusedStandardAndSharedBlocks(TIntermBlock *root) void TCompiler::useAllMembersInUnusedStandardAndSharedBlocks(TIntermBlock *root)
...@@ -1109,7 +1112,7 @@ void TCompiler::initializeOutputVariables(TIntermBlock *root) ...@@ -1109,7 +1112,7 @@ void TCompiler::initializeOutputVariables(TIntermBlock *root)
list.push_back(var); list.push_back(var);
} }
} }
InitializeVariables(root, list, &symbolTable, shaderVersion, extensionBehavior, false); InitializeVariables(root, list, &symbolTable, shaderVersion, extensionBehavior, false, false);
} }
const TExtensionBehavior &TCompiler::getExtensionBehavior() const const TExtensionBehavior &TCompiler::getExtensionBehavior() const
......
...@@ -30,6 +30,7 @@ namespace ...@@ -30,6 +30,7 @@ namespace
void GetDeferredInitializers(TIntermDeclaration *declaration, void GetDeferredInitializers(TIntermDeclaration *declaration,
bool initializeUninitializedGlobals, bool initializeUninitializedGlobals,
bool canUseLoopsToInitialize, bool canUseLoopsToInitialize,
bool highPrecisionSupported,
TIntermSequence *deferredInitializersOut, TIntermSequence *deferredInitializersOut,
TSymbolTable *symbolTable) TSymbolTable *symbolTable)
{ {
...@@ -83,8 +84,8 @@ void GetDeferredInitializers(TIntermDeclaration *declaration, ...@@ -83,8 +84,8 @@ void GetDeferredInitializers(TIntermDeclaration *declaration,
if (symbolNode->getQualifier() == EvqGlobal && symbolNode->getSymbol() != "") if (symbolNode->getQualifier() == EvqGlobal && symbolNode->getSymbol() != "")
{ {
TIntermSequence *initCode = TIntermSequence *initCode = CreateInitCode(symbolNode, canUseLoopsToInitialize,
CreateInitCode(symbolNode, canUseLoopsToInitialize, symbolTable); highPrecisionSupported, symbolTable);
deferredInitializersOut->insert(deferredInitializersOut->end(), initCode->begin(), deferredInitializersOut->insert(deferredInitializersOut->end(), initCode->begin(),
initCode->end()); initCode->end());
} }
...@@ -121,6 +122,7 @@ void InsertInitCallToMain(TIntermBlock *root, ...@@ -121,6 +122,7 @@ void InsertInitCallToMain(TIntermBlock *root,
void DeferGlobalInitializers(TIntermBlock *root, void DeferGlobalInitializers(TIntermBlock *root,
bool initializeUninitializedGlobals, bool initializeUninitializedGlobals,
bool canUseLoopsToInitialize, bool canUseLoopsToInitialize,
bool highPrecisionSupported,
TSymbolTable *symbolTable) TSymbolTable *symbolTable)
{ {
TIntermSequence *deferredInitializers = new TIntermSequence(); TIntermSequence *deferredInitializers = new TIntermSequence();
...@@ -133,7 +135,8 @@ void DeferGlobalInitializers(TIntermBlock *root, ...@@ -133,7 +135,8 @@ void DeferGlobalInitializers(TIntermBlock *root,
if (declaration) if (declaration)
{ {
GetDeferredInitializers(declaration, initializeUninitializedGlobals, GetDeferredInitializers(declaration, initializeUninitializedGlobals,
canUseLoopsToInitialize, deferredInitializers, symbolTable); canUseLoopsToInitialize, highPrecisionSupported,
deferredInitializers, symbolTable);
} }
} }
......
...@@ -25,6 +25,7 @@ class TSymbolTable; ...@@ -25,6 +25,7 @@ class TSymbolTable;
void DeferGlobalInitializers(TIntermBlock *root, void DeferGlobalInitializers(TIntermBlock *root,
bool initializeUninitializedGlobals, bool initializeUninitializedGlobals,
bool canUseLoopsToInitialize, bool canUseLoopsToInitialize,
bool highPrecisionSupported,
TSymbolTable *symbolTable); TSymbolTable *symbolTable);
} // namespace sh } // namespace sh
......
...@@ -25,12 +25,14 @@ typedef std::vector<sh::ShaderVariable> InitVariableList; ...@@ -25,12 +25,14 @@ typedef std::vector<sh::ShaderVariable> InitVariableList;
// may be an array, struct or any combination of these, as long as it contains only basic types. // may be an array, struct or any combination of these, as long as it contains only basic types.
TIntermSequence *CreateInitCode(const TIntermTyped *initializedSymbol, TIntermSequence *CreateInitCode(const TIntermTyped *initializedSymbol,
bool canUseLoopsToInitialize, bool canUseLoopsToInitialize,
bool highPrecisionSupported,
TSymbolTable *symbolTable); TSymbolTable *symbolTable);
// Initialize all uninitialized local variables, so that undefined behavior is avoided. // Initialize all uninitialized local variables, so that undefined behavior is avoided.
void InitializeUninitializedLocals(TIntermBlock *root, void InitializeUninitializedLocals(TIntermBlock *root,
int shaderVersion, int shaderVersion,
bool canUseLoopsToInitialize, bool canUseLoopsToInitialize,
bool highPrecisionSupported,
TSymbolTable *symbolTable); TSymbolTable *symbolTable);
// This function can initialize all the types that CreateInitCode is able to initialize. All // This function can initialize all the types that CreateInitCode is able to initialize. All
...@@ -46,7 +48,8 @@ void InitializeVariables(TIntermBlock *root, ...@@ -46,7 +48,8 @@ void InitializeVariables(TIntermBlock *root,
TSymbolTable *symbolTable, TSymbolTable *symbolTable,
int shaderVersion, int shaderVersion,
const TExtensionBehavior &extensionBehavior, const TExtensionBehavior &extensionBehavior,
bool canUseLoopsToInitialize); bool canUseLoopsToInitialize,
bool highPrecisionSupported);
} // namespace sh } // namespace sh
......
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