Vulkan: Keep unused uniforms list to fix glslang issues

We we're unable to cleanup the unused uniforms if we did not keep
a list of them while parsing them in ProgramLinkResource. Now
that we keep a history of them, we're able to clean them up and
fix a few dEQP tests.

Bug: angleproject:2582
Bug: angleproject:2585
Bug: angleproject:2587
Bug: angleproject:2589
Bug: angleproject:2590
Bug: angleproject:2593

Change-Id: Ic1f9151e356a3d05e83f1031cc7b187b370284e5
Reviewed-on: https://chromium-review.googlesource.com/1085644
Commit-Queue: Luc Ferron <lucferron@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/ProgramLinkedResources.cpp b/src/libANGLE/ProgramLinkedResources.cpp
index 2263544..605d1bd 100644
--- a/src/libANGLE/ProgramLinkedResources.cpp
+++ b/src/libANGLE/ProgramLinkedResources.cpp
@@ -253,9 +253,11 @@
 UniformLinker::~UniformLinker() = default;
 
 void UniformLinker::getResults(std::vector<LinkedUniform> *uniforms,
+                               std::vector<UnusedUniform> *unusedUniforms,
                                std::vector<VariableLocation> *uniformLocations)
 {
     uniforms->swap(mUniforms);
+    unusedUniforms->swap(mUnusedUniforms);
     uniformLocations->swap(mUniformLocations);
 }
 
@@ -501,6 +503,7 @@
         }
         else
         {
+            mUnusedUniforms.emplace_back(uniformIter->name, uniformIter->isSampler());
             uniformIter = mUniforms.erase(uniformIter);
         }
     }
@@ -513,13 +516,15 @@
     std::vector<LinkedUniform> &samplerUniforms,
     std::vector<LinkedUniform> &imageUniforms,
     std::vector<LinkedUniform> &atomicCounterUniforms,
+    std::vector<UnusedUniform> &unusedUniforms,
     InfoLog &infoLog)
 {
     ShaderUniformCount shaderUniformCount;
     for (const sh::Uniform &uniform : shader->getUniforms(context))
     {
-        shaderUniformCount += flattenUniform(uniform, &samplerUniforms, &imageUniforms,
-                                             &atomicCounterUniforms, shader->getType());
+        shaderUniformCount +=
+            flattenUniform(uniform, &samplerUniforms, &imageUniforms, &atomicCounterUniforms,
+                           &unusedUniforms, shader->getType());
     }
 
     ShaderType shaderType = shader->getType();
@@ -573,6 +578,7 @@
     std::vector<LinkedUniform> samplerUniforms;
     std::vector<LinkedUniform> imageUniforms;
     std::vector<LinkedUniform> atomicCounterUniforms;
+    std::vector<UnusedUniform> unusedUniforms;
 
     const Caps &caps = context->getCaps();
     for (ShaderType shaderType : AllShaderTypes())
@@ -584,7 +590,8 @@
         }
 
         if (!flattenUniformsAndCheckCapsForShader(context, shader, caps, samplerUniforms,
-                                                  imageUniforms, atomicCounterUniforms, infoLog))
+                                                  imageUniforms, atomicCounterUniforms,
+                                                  unusedUniforms, infoLog))
         {
             return false;
         }
@@ -593,6 +600,7 @@
     mUniforms.insert(mUniforms.end(), samplerUniforms.begin(), samplerUniforms.end());
     mUniforms.insert(mUniforms.end(), imageUniforms.begin(), imageUniforms.end());
     mUniforms.insert(mUniforms.end(), atomicCounterUniforms.begin(), atomicCounterUniforms.end());
+    mUnusedUniforms.insert(mUnusedUniforms.end(), unusedUniforms.begin(), unusedUniforms.end());
     return true;
 }
 
@@ -601,17 +609,22 @@
     std::vector<LinkedUniform> *samplerUniforms,
     std::vector<LinkedUniform> *imageUniforms,
     std::vector<LinkedUniform> *atomicCounterUniforms,
+    std::vector<UnusedUniform> *unusedUniforms,
     ShaderType shaderType)
 {
-    int location = uniform.location;
-    ShaderUniformCount shaderUniformCount =
-        flattenUniformImpl(uniform, uniform.name, uniform.mappedName, samplerUniforms,
-                           imageUniforms, atomicCounterUniforms, shaderType, uniform.active,
-                           uniform.staticUse, uniform.binding, uniform.offset, &location);
+    int location                          = uniform.location;
+    ShaderUniformCount shaderUniformCount = flattenUniformImpl(
+        uniform, uniform.name, uniform.mappedName, samplerUniforms, imageUniforms,
+        atomicCounterUniforms, unusedUniforms, shaderType, uniform.active, uniform.staticUse,
+        uniform.binding, uniform.offset, &location);
     if (uniform.active)
     {
         return shaderUniformCount;
     }
+    else
+    {
+        unusedUniforms->emplace_back(uniform.name, IsSamplerType(uniform.type));
+    }
     return ShaderUniformCount();
 }
 
@@ -623,6 +636,7 @@
     std::vector<LinkedUniform> *samplerUniforms,
     std::vector<LinkedUniform> *imageUniforms,
     std::vector<LinkedUniform> *atomicCounterUniforms,
+    std::vector<UnusedUniform> *unusedUniforms,
     ShaderType shaderType,
     bool markActive,
     bool markStaticUse,
@@ -642,15 +656,15 @@
         {
             shaderUniformCount += flattenArrayOfStructsUniform(
                 uniform, arrayNestingIndex + 1u, elementName, elementMappedName, samplerUniforms,
-                imageUniforms, atomicCounterUniforms, shaderType, markActive, markStaticUse,
-                binding, offset, location);
+                imageUniforms, atomicCounterUniforms, unusedUniforms, shaderType, markActive,
+                markStaticUse, binding, offset, location);
         }
         else
         {
             shaderUniformCount += flattenStructUniform(
                 uniform.fields, elementName, elementMappedName, samplerUniforms, imageUniforms,
-                atomicCounterUniforms, shaderType, markActive, markStaticUse, binding, offset,
-                location);
+                atomicCounterUniforms, unusedUniforms, shaderType, markActive, markStaticUse,
+                binding, offset, location);
         }
     }
     return shaderUniformCount;
@@ -663,6 +677,7 @@
     std::vector<LinkedUniform> *samplerUniforms,
     std::vector<LinkedUniform> *imageUniforms,
     std::vector<LinkedUniform> *atomicCounterUniforms,
+    std::vector<UnusedUniform> *unusedUniforms,
     ShaderType shaderType,
     bool markActive,
     bool markStaticUse,
@@ -676,9 +691,10 @@
         const std::string &fieldName       = namePrefix + "." + field.name;
         const std::string &fieldMappedName = mappedNamePrefix + "." + field.mappedName;
 
-        shaderUniformCount += flattenUniformImpl(field, fieldName, fieldMappedName, samplerUniforms,
-                                                 imageUniforms, atomicCounterUniforms, shaderType,
-                                                 markActive, markStaticUse, -1, -1, location);
+        shaderUniformCount +=
+            flattenUniformImpl(field, fieldName, fieldMappedName, samplerUniforms, imageUniforms,
+                               atomicCounterUniforms, unusedUniforms, shaderType, markActive,
+                               markStaticUse, -1, -1, location);
     }
     return shaderUniformCount;
 }
@@ -690,6 +706,7 @@
     std::vector<LinkedUniform> *samplerUniforms,
     std::vector<LinkedUniform> *imageUniforms,
     std::vector<LinkedUniform> *atomicCounterUniforms,
+    std::vector<UnusedUniform> *unusedUniforms,
     ShaderType shaderType,
     bool markActive,
     bool markStaticUse,
@@ -710,8 +727,8 @@
 
         shaderUniformCount +=
             flattenUniformImpl(uniformElement, elementName, elementMappedName, samplerUniforms,
-                               imageUniforms, atomicCounterUniforms, shaderType, markActive,
-                               markStaticUse, binding, offset, location);
+                               imageUniforms, atomicCounterUniforms, unusedUniforms, shaderType,
+                               markActive, markStaticUse, binding, offset, location);
     }
     return shaderUniformCount;
 }
@@ -723,6 +740,7 @@
     std::vector<LinkedUniform> *samplerUniforms,
     std::vector<LinkedUniform> *imageUniforms,
     std::vector<LinkedUniform> *atomicCounterUniforms,
+    std::vector<UnusedUniform> *unusedUniforms,
     ShaderType shaderType,
     bool markActive,
     bool markStaticUse,
@@ -737,17 +755,17 @@
     {
         if (uniform.isArray())
         {
-            shaderUniformCount +=
-                flattenArrayOfStructsUniform(uniform, 0u, fullName, fullMappedName, samplerUniforms,
-                                             imageUniforms, atomicCounterUniforms, shaderType,
-                                             markActive, markStaticUse, binding, offset, location);
+            shaderUniformCount += flattenArrayOfStructsUniform(
+                uniform, 0u, fullName, fullMappedName, samplerUniforms, imageUniforms,
+                atomicCounterUniforms, unusedUniforms, shaderType, markActive, markStaticUse,
+                binding, offset, location);
         }
         else
         {
-            shaderUniformCount +=
-                flattenStructUniform(uniform.fields, fullName, fullMappedName, samplerUniforms,
-                                     imageUniforms, atomicCounterUniforms, shaderType, markActive,
-                                     markStaticUse, binding, offset, location);
+            shaderUniformCount += flattenStructUniform(
+                uniform.fields, fullName, fullMappedName, samplerUniforms, imageUniforms,
+                atomicCounterUniforms, unusedUniforms, shaderType, markActive, markStaticUse,
+                binding, offset, location);
         }
         return shaderUniformCount;
     }
@@ -757,8 +775,8 @@
         // "For an active variable declared as an array of an aggregate data type (structures or
         // arrays), a separate entry will be generated for each active array element"
         return flattenArrayUniform(uniform, fullName, fullMappedName, samplerUniforms,
-                                   imageUniforms, atomicCounterUniforms, shaderType, markActive,
-                                   markStaticUse, binding, offset, location);
+                                   imageUniforms, atomicCounterUniforms, unusedUniforms, shaderType,
+                                   markActive, markStaticUse, binding, offset, location);
     }
 
     // Not a struct
@@ -829,6 +847,10 @@
         {
             linkedUniform.setActive(shaderType, true);
         }
+        else
+        {
+            unusedUniforms->emplace_back(linkedUniform.name, linkedUniform.isSampler());
+        }
 
         uniformList->push_back(linkedUniform);
     }