Fix uniform array handling in ProgramGL.

Our validation wouldn't correctly handle single-element arrays because it
was checking size > 1 instead of isArray().  This caused issues in
ProgramGL on some drivers that optimized the array size (AMD) if some elements
were unused.

BUG=angleproject:882

Change-Id: I417d13cd86380e2c6caa688f6398709a74692e21
Reviewed-on: https://chromium-review.googlesource.com/289201
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Brandon Jones <bajones@chromium.org>
Tested-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/renderer/gl/ProgramGL.cpp b/src/libANGLE/renderer/gl/ProgramGL.cpp
index 9017762..f92ad6e 100644
--- a/src/libANGLE/renderer/gl/ProgramGL.cpp
+++ b/src/libANGLE/renderer/gl/ProgramGL.cpp
@@ -134,12 +134,15 @@
         GLenum uniformType = GL_NONE;
         mFunctions->getActiveUniform(mProgramID, i, uniformNameBuffer.size(), &uniformNameLength, &uniformSize, &uniformType, &uniformNameBuffer[0]);
 
-        std::string uniformName = gl::ParseUniformName(std::string(&uniformNameBuffer[0], uniformNameLength), nullptr);
+        size_t subscript = 0;
+        std::string uniformName = gl::ParseUniformName(std::string(&uniformNameBuffer[0], uniformNameLength), &subscript);
+
+        bool isArray = uniformSize > 1 || subscript != GL_INVALID_INDEX;
 
         for (size_t arrayIndex = 0; arrayIndex < static_cast<size_t>(uniformSize); arrayIndex++)
         {
             std::string locationName = uniformName;
-            if (uniformSize > 1)
+            if (isArray)
             {
                 locationName += "[" + Str(arrayIndex) + "]";
             }
@@ -161,7 +164,7 @@
         }
 
         // ANGLE uses 0 to identify an non-array uniform.
-        unsigned int arraySize = (uniformSize > 1) ? static_cast<unsigned int>(uniformSize) : 0;
+        unsigned int arraySize = isArray ? static_cast<unsigned int>(uniformSize) : 0;
 
         // TODO: determine uniform precision
         mUniforms.push_back(new gl::LinkedUniform(uniformType, GL_NONE, uniformName, arraySize, -1, sh::BlockMemberInfo::getDefaultBlockInfo()));