Use the specified Program instead of current in GetUniform.

This bug slipped in with the GetUniform validation refactor.

BUG=angle:571

Change-Id: I2b87e6fe98224ba99c5b21a71d66b197fd618741
Reviewed-on: https://chromium-review.googlesource.com/214872
Reviewed-by: Nicolas Capens <capn@chromium.org>
Tested-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libGLESv2/libGLESv2.cpp b/src/libGLESv2/libGLESv2.cpp
index 6c1bc5b..2f5e24c 100644
--- a/src/libGLESv2/libGLESv2.cpp
+++ b/src/libGLESv2/libGLESv2.cpp
@@ -3141,7 +3141,9 @@
             return;
         }
 
-        gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
+        gl::Program *programObject = context->getProgram(program);
+        ASSERT(programObject);
+        gl::ProgramBinary *programBinary = programObject->getProgramBinary();
         ASSERT(programBinary);
 
         programBinary->getUniformfv(location, params);
@@ -3160,7 +3162,9 @@
             return;
         }
 
-        gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
+        gl::Program *programObject = context->getProgram(program);
+        ASSERT(programObject);
+        gl::ProgramBinary *programBinary = programObject->getProgramBinary();
         ASSERT(programBinary);
 
         programBinary->getUniformfv(location, params);
@@ -3180,7 +3184,9 @@
             return;
         }
 
-        gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
+        gl::Program *programObject = context->getProgram(program);
+        ASSERT(programObject);
+        gl::ProgramBinary *programBinary = programObject->getProgramBinary();
         ASSERT(programBinary);
 
         programBinary->getUniformiv(location, params);
@@ -3199,7 +3205,9 @@
             return;
         }
 
-        gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
+        gl::Program *programObject = context->getProgram(program);
+        ASSERT(programObject);
+        gl::ProgramBinary *programBinary = programObject->getProgramBinary();
         ASSERT(programBinary);
 
         programBinary->getUniformiv(location, params);
@@ -6399,7 +6407,9 @@
             return;
         }
 
-        gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
+        gl::Program *programObject = context->getProgram(program);
+        ASSERT(programObject);
+        gl::ProgramBinary *programBinary = programObject->getProgramBinary();
         ASSERT(programBinary);
 
         programBinary->getUniformuiv(location, params);
diff --git a/src/libGLESv2/validationES.cpp b/src/libGLESv2/validationES.cpp
index 1d6a40e..d65c2c5 100644
--- a/src/libGLESv2/validationES.cpp
+++ b/src/libGLESv2/validationES.cpp
@@ -1859,7 +1859,9 @@
         return false;
     }
 
-    gl::ProgramBinary *programBinary = context->getState().getCurrentProgramBinary();
+    gl::Program *programObject = context->getProgram(program);
+    ASSERT(programObject);
+    gl::ProgramBinary *programBinary = programObject->getProgramBinary();
 
     // sized queries -- ensure the provided buffer is large enough
     LinkedUniform *uniform = programBinary->getUniformByLocation(location);
diff --git a/tests/angle_tests/UniformTest.cpp b/tests/angle_tests/UniformTest.cpp
new file mode 100644
index 0000000..4f76b0e
--- /dev/null
+++ b/tests/angle_tests/UniformTest.cpp
@@ -0,0 +1,74 @@
+#include "ANGLETest.h"
+
+class UniformTest : public ANGLETest
+{
+  protected:
+    UniformTest()
+    {
+        setWindowWidth(128);
+        setWindowHeight(128);
+        setConfigRedBits(8);
+        setConfigGreenBits(8);
+        setConfigBlueBits(8);
+        setConfigAlphaBits(8);
+    }
+
+    virtual void SetUp()
+    {
+        ANGLETest::SetUp();
+
+        const std::string &vertexShader = "void main() { gl_Position = vec4(1); }";
+        const std::string &fragShader =
+            "precision mediump float;\n"
+            "uniform float uniF;\n"
+            "uniform int uniI;\n"
+            "void main() { gl_FragColor = vec4(uniF + float(uniI)); }";
+
+        mProgram = CompileProgram(vertexShader, fragShader);
+        ASSERT_NE(mProgram, 0u);
+
+        mUniformFLocation = glGetUniformLocation(mProgram, "uniF");
+        ASSERT_NE(mUniformFLocation, -1);
+
+        mUniformILocation = glGetUniformLocation(mProgram, "uniI");
+        ASSERT_NE(mUniformILocation, -1);
+
+        ASSERT_GL_NO_ERROR();
+    }
+
+    virtual void TearDown()
+    {
+        glDeleteProgram(mProgram);
+        ANGLETest::TearDown();
+    }
+
+    GLuint mProgram;
+    GLint mUniformFLocation;
+    GLint mUniformILocation;
+};
+
+TEST_F(UniformTest, GetUniformNoCurrentProgram)
+{
+    glUseProgram(mProgram);
+    glUniform1f(mUniformFLocation, 1.0f);
+    glUniform1i(mUniformILocation, 1);
+    glUseProgram(0);
+
+    GLfloat f;
+    glGetnUniformfvEXT(mProgram, mUniformFLocation, 4, &f);
+    ASSERT_GL_NO_ERROR();
+    EXPECT_EQ(1.0f, f);
+
+    glGetUniformfv(mProgram, mUniformFLocation, &f);
+    ASSERT_GL_NO_ERROR();
+    EXPECT_EQ(1.0f, f);
+
+    GLint i;
+    glGetnUniformivEXT(mProgram, mUniformILocation, 4, &i);
+    ASSERT_GL_NO_ERROR();
+    EXPECT_EQ(1, i);
+
+    glGetUniformiv(mProgram, mUniformILocation, &i);
+    ASSERT_GL_NO_ERROR();
+    EXPECT_EQ(1, i);
+}