Program: Sampler uniform query in front-end.

We have this information stored in the front-end sampler bindings.
This solves sampler uniform query across the various back-ends.

Turns on a bunch of uniform_api dEQP tests.

Bug: angleproject:2612
Change-Id: If8752a26438595ad103598369df360e2f5e12d53
Reviewed-on: https://chromium-review.googlesource.com/1101572
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Luc Ferron <lucferron@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/Program.cpp b/src/libANGLE/Program.cpp
index 5c7f031..35873db 100644
--- a/src/libANGLE/Program.cpp
+++ b/src/libANGLE/Program.cpp
@@ -1952,54 +1952,77 @@
     mProgram->setUniformMatrix4x3fv(location, clampedCount, transpose, v);
 }
 
+GLuint Program::getSamplerUniformBinding(const VariableLocation &uniformLocation) const
+{
+    GLuint samplerIndex = mState.getSamplerIndexFromUniformIndex(uniformLocation.index);
+    const std::vector<GLuint> &boundTextureUnits =
+        mState.mSamplerBindings[samplerIndex].boundTextureUnits;
+    return boundTextureUnits[uniformLocation.arrayIndex];
+}
+
 void Program::getUniformfv(const Context *context, GLint location, GLfloat *v) const
 {
-    const auto &uniformLocation = mState.getUniformLocations()[location];
-    const auto &uniform         = mState.getUniforms()[uniformLocation.index];
+    const VariableLocation &uniformLocation = mState.getUniformLocations()[location];
+    const LinkedUniform &uniform            = mState.getUniforms()[uniformLocation.index];
 
-    GLenum nativeType = gl::VariableComponentType(uniform.type);
+    if (uniform.isSampler())
+    {
+        *v = static_cast<GLfloat>(getSamplerUniformBinding(uniformLocation));
+        return;
+    }
+
+    const GLenum nativeType = gl::VariableComponentType(uniform.type);
     if (nativeType == GL_FLOAT)
     {
         mProgram->getUniformfv(context, location, v);
     }
     else
     {
-        getUniformInternal(context, v, location, nativeType,
-                           gl::VariableComponentCount(uniform.type));
+        getUniformInternal(context, v, location, nativeType, VariableComponentCount(uniform.type));
     }
 }
 
 void Program::getUniformiv(const Context *context, GLint location, GLint *v) const
 {
-    const auto &uniformLocation = mState.getUniformLocations()[location];
-    const auto &uniform         = mState.getUniforms()[uniformLocation.index];
+    const VariableLocation &uniformLocation = mState.getUniformLocations()[location];
+    const LinkedUniform &uniform            = mState.getUniforms()[uniformLocation.index];
 
-    GLenum nativeType = gl::VariableComponentType(uniform.type);
+    if (uniform.isSampler())
+    {
+        *v = static_cast<GLint>(getSamplerUniformBinding(uniformLocation));
+        return;
+    }
+
+    const GLenum nativeType = gl::VariableComponentType(uniform.type);
     if (nativeType == GL_INT || nativeType == GL_BOOL)
     {
         mProgram->getUniformiv(context, location, v);
     }
     else
     {
-        getUniformInternal(context, v, location, nativeType,
-                           gl::VariableComponentCount(uniform.type));
+        getUniformInternal(context, v, location, nativeType, VariableComponentCount(uniform.type));
     }
 }
 
 void Program::getUniformuiv(const Context *context, GLint location, GLuint *v) const
 {
-    const auto &uniformLocation = mState.getUniformLocations()[location];
-    const auto &uniform         = mState.getUniforms()[uniformLocation.index];
+    const VariableLocation &uniformLocation = mState.getUniformLocations()[location];
+    const LinkedUniform &uniform            = mState.getUniforms()[uniformLocation.index];
 
-    GLenum nativeType = gl::VariableComponentType(uniform.type);
+    if (uniform.isSampler())
+    {
+        *v = getSamplerUniformBinding(uniformLocation);
+        return;
+    }
+
+    const GLenum nativeType = VariableComponentType(uniform.type);
     if (nativeType == GL_UNSIGNED_INT)
     {
         mProgram->getUniformuiv(context, location, v);
     }
     else
     {
-        getUniformInternal(context, v, location, nativeType,
-                           gl::VariableComponentCount(uniform.type));
+        getUniformInternal(context, v, location, nativeType, VariableComponentCount(uniform.type));
     }
 }