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,
bool initializeLocalsAndGlobals =
(compileOptions & SH_INITIALIZE_UNINITIALIZED_LOCALS) && !IsOutputHLSL(getOutputType());
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)
{
......@@ -623,7 +626,7 @@ bool TCompiler::checkAndSimplifyAST(TIntermBlock *root,
}
InitializeUninitializedLocals(root, getShaderVersion(), canUseLoopsToInitialize,
&getSymbolTable());
highPrecisionSupported, &getSymbolTable());
}
if (getShaderType() == GL_VERTEX_SHADER && (compileOptions & SH_CLAMP_POINT_SIZE))
......@@ -1067,7 +1070,7 @@ void TCompiler::initializeGLPosition(TIntermBlock *root)
sh::ShaderVariable var(GL_FLOAT_VEC4);
var.name = "gl_Position";
list.push_back(var);
InitializeVariables(root, list, &symbolTable, shaderVersion, extensionBehavior, false);
InitializeVariables(root, list, &symbolTable, shaderVersion, extensionBehavior, false, false);
}
void TCompiler::useAllMembersInUnusedStandardAndSharedBlocks(TIntermBlock *root)
......@@ -1109,7 +1112,7 @@ void TCompiler::initializeOutputVariables(TIntermBlock *root)
list.push_back(var);
}
}
InitializeVariables(root, list, &symbolTable, shaderVersion, extensionBehavior, false);
InitializeVariables(root, list, &symbolTable, shaderVersion, extensionBehavior, false, false);
}
const TExtensionBehavior &TCompiler::getExtensionBehavior() const
......
......@@ -30,6 +30,7 @@ namespace
void GetDeferredInitializers(TIntermDeclaration *declaration,
bool initializeUninitializedGlobals,
bool canUseLoopsToInitialize,
bool highPrecisionSupported,
TIntermSequence *deferredInitializersOut,
TSymbolTable *symbolTable)
{
......@@ -83,8 +84,8 @@ void GetDeferredInitializers(TIntermDeclaration *declaration,
if (symbolNode->getQualifier() == EvqGlobal && symbolNode->getSymbol() != "")
{
TIntermSequence *initCode =
CreateInitCode(symbolNode, canUseLoopsToInitialize, symbolTable);
TIntermSequence *initCode = CreateInitCode(symbolNode, canUseLoopsToInitialize,
highPrecisionSupported, symbolTable);
deferredInitializersOut->insert(deferredInitializersOut->end(), initCode->begin(),
initCode->end());
}
......@@ -121,6 +122,7 @@ void InsertInitCallToMain(TIntermBlock *root,
void DeferGlobalInitializers(TIntermBlock *root,
bool initializeUninitializedGlobals,
bool canUseLoopsToInitialize,
bool highPrecisionSupported,
TSymbolTable *symbolTable)
{
TIntermSequence *deferredInitializers = new TIntermSequence();
......@@ -133,7 +135,8 @@ void DeferGlobalInitializers(TIntermBlock *root,
if (declaration)
{
GetDeferredInitializers(declaration, initializeUninitializedGlobals,
canUseLoopsToInitialize, deferredInitializers, symbolTable);
canUseLoopsToInitialize, highPrecisionSupported,
deferredInitializers, symbolTable);
}
}
......
......@@ -25,6 +25,7 @@ class TSymbolTable;
void DeferGlobalInitializers(TIntermBlock *root,
bool initializeUninitializedGlobals,
bool canUseLoopsToInitialize,
bool highPrecisionSupported,
TSymbolTable *symbolTable);
} // namespace sh
......
......@@ -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.
TIntermSequence *CreateInitCode(const TIntermTyped *initializedSymbol,
bool canUseLoopsToInitialize,
bool highPrecisionSupported,
TSymbolTable *symbolTable);
// Initialize all uninitialized local variables, so that undefined behavior is avoided.
void InitializeUninitializedLocals(TIntermBlock *root,
int shaderVersion,
bool canUseLoopsToInitialize,
bool highPrecisionSupported,
TSymbolTable *symbolTable);
// This function can initialize all the types that CreateInitCode is able to initialize. All
......@@ -46,7 +48,8 @@ void InitializeVariables(TIntermBlock *root,
TSymbolTable *symbolTable,
int shaderVersion,
const TExtensionBehavior &extensionBehavior,
bool canUseLoopsToInitialize);
bool canUseLoopsToInitialize,
bool highPrecisionSupported);
} // 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