Reverse the order of array variable initialization
This works around a bug on Adreno 3xx in which array varying variables
are assigned in the reverse order.
BUG=chromium:709317
Change-Id: I86a345747f293ca8a2cb9a281bd1b752e66dcd3a
Reviewed-on: https://chromium-review.googlesource.com/475979
Commit-Queue: Kai Ninomiya <kainino@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/compiler/translator/InitializeVariables.cpp b/src/compiler/translator/InitializeVariables.cpp
index dafea1b..8cb50ae 100644
--- a/src/compiler/translator/InitializeVariables.cpp
+++ b/src/compiler/translator/InitializeVariables.cpp
@@ -82,11 +82,17 @@
TType arrayType = elementType;
arrayType.setArraySize(var.elementCount());
- for (unsigned int i = 0; i < var.arraySize; ++i)
+ // Workaround for http://crbug.com/709317
+ // This loop is reversed to initialize elements in increasing
+ // order [0 1 2 ...]. Otherwise, they're initialized in
+ // decreasing order [... 2 1 0], due to
+ // `sequence->insert(sequence->begin(), ...)` below.
+ for (unsigned int i = var.arraySize; i > 0; --i)
{
+ unsigned int index = i - 1;
TIntermSymbol *arraySymbol = new TIntermSymbol(0, name, arrayType);
TIntermBinary *element = new TIntermBinary(EOpIndexDirect, arraySymbol,
- TIntermTyped::CreateIndexNode(i));
+ TIntermTyped::CreateIndexNode(index));
TIntermTyped *zero = TIntermTyped::CreateZero(elementType);
TIntermBinary *assignment = new TIntermBinary(EOpAssign, element, zero);