Vulkan: Support of float uniform matrixes (2,3,4).

Bug:angleproject:2392

Change-Id: I97efea83e604d19b1745d9db4ab8f02997a1b7fc
Reviewed-on: https://chromium-review.googlesource.com/962666
Commit-Queue: Luc Ferron <lucferron@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/ProgramVk.cpp b/src/libANGLE/renderer/vulkan/ProgramVk.cpp
index 2b6cfe3..7130d39 100644
--- a/src/libANGLE/renderer/vulkan/ProgramVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ProgramVk.cpp
@@ -534,7 +534,13 @@
                                     GLboolean transpose,
                                     const GLfloat *value)
 {
-    UNIMPLEMENTED();
+    if (transpose == GL_TRUE)
+    {
+        UNIMPLEMENTED();
+        return;
+    }
+
+    setUniformImpl(location, count, value, GL_FLOAT_MAT2);
 }
 
 void ProgramVk::setUniformMatrix3fv(GLint location,
@@ -542,7 +548,12 @@
                                     GLboolean transpose,
                                     const GLfloat *value)
 {
-    UNIMPLEMENTED();
+    if (transpose == GL_TRUE)
+    {
+        UNIMPLEMENTED();
+        return;
+    }
+    setUniformImpl(location, count, value, GL_FLOAT_MAT3);
 }
 
 void ProgramVk::setUniformMatrix4fv(GLint location,
@@ -550,7 +561,13 @@
                                     GLboolean transpose,
                                     const GLfloat *value)
 {
-    UNIMPLEMENTED();
+    if (transpose == GL_TRUE)
+    {
+        UNIMPLEMENTED();
+        return;
+    }
+
+    setUniformImpl(location, count, value, GL_FLOAT_MAT4);
 }
 
 void ProgramVk::setUniformMatrix2x3fv(GLint location,
diff --git a/src/tests/gl_tests/UniformTest.cpp b/src/tests/gl_tests/UniformTest.cpp
index 4b00789..4d46d17 100644
--- a/src/tests/gl_tests/UniformTest.cpp
+++ b/src/tests/gl_tests/UniformTest.cpp
@@ -151,6 +151,79 @@
     ASSERT_EQ(floats, expected);
 }
 
+// Test that we can get and set a 2x2 float Matrix uniform successfully.
+TEST_P(SimpleUniformTest, FloatMatrix2UniformStateQuery)
+{
+    constexpr char kFragShader[] = R"(precision mediump float;
+uniform mat2 umat2;
+void main() {
+    gl_FragColor = vec4(umat2);
+})";
+
+    ANGLE_GL_PROGRAM(program, kBasicVertexShader, kFragShader);
+    glUseProgram(program);
+
+    GLint uniformLocation = glGetUniformLocation(program, "umat2");
+    ASSERT_NE(uniformLocation, -1);
+
+    std::vector<GLfloat> expected = {{1.0f, 0.5f, 0.2f, -0.8f}};
+    glUniformMatrix2fv(uniformLocation, 1, false, expected.data());
+
+    std::vector<GLfloat> floats(4, 0);
+    glGetUniformfv(program, uniformLocation, floats.data());
+    ASSERT_GL_NO_ERROR();
+    ASSERT_EQ(floats, expected);
+}
+
+// Test that we can get and set a 3x3 float Matrix uniform successfully.
+TEST_P(SimpleUniformTest, FloatMatrix3UniformStateQuery)
+{
+    constexpr char kFragShader[] = R"(precision mediump float;
+uniform mat3 umat3;
+void main() {
+    gl_FragColor = vec4(umat3);
+})";
+
+    ANGLE_GL_PROGRAM(program, kBasicVertexShader, kFragShader);
+    glUseProgram(program);
+
+    GLint uniformLocation = glGetUniformLocation(program, "umat3");
+    ASSERT_NE(uniformLocation, -1);
+
+    std::vector<GLfloat> expected = {{1.0f, 0.5f, 0.2f, -0.8f, -0.2f, 0.1f, 0.1f, 0.2f, 0.7f}};
+    glUniformMatrix3fv(uniformLocation, 1, false, expected.data());
+
+    std::vector<GLfloat> floats(9, 0);
+    glGetUniformfv(program, uniformLocation, floats.data());
+    ASSERT_GL_NO_ERROR();
+    ASSERT_EQ(floats, expected);
+}
+
+// Test that we can get and set a 4x4 float Matrix uniform successfully.
+TEST_P(SimpleUniformTest, FloatMatrix4UniformStateQuery)
+{
+    constexpr char kFragShader[] = R"(precision mediump float;
+uniform mat4 umat4;
+void main() {
+    gl_FragColor = umat4 * vec4(1.0, 1.0, 1.0, 1.0);
+})";
+
+    ANGLE_GL_PROGRAM(program, kBasicVertexShader, kFragShader);
+    glUseProgram(program);
+
+    GLint uniformLocation = glGetUniformLocation(program, "umat4");
+    ASSERT_NE(uniformLocation, -1);
+
+    std::vector<GLfloat> expected = {{1.0f, 0.5f, 0.2f, -0.8f, -0.2f, 0.1f, 0.1f, 0.2f, 0.7f, 0.1f,
+                                      0.7f, 0.1f, 0.7f, 0.1f, 0.7f, 0.1f}};
+    glUniformMatrix4fv(uniformLocation, 1, false, expected.data());
+
+    std::vector<GLfloat> floats(16, 0);
+    glGetUniformfv(program, uniformLocation, floats.data());
+    ASSERT_GL_NO_ERROR();
+    ASSERT_EQ(floats, expected);
+}
+
 class UniformTest : public ANGLETest
 {
   protected: