Vulkan: Implement setUniform for matrices correctly

This fixes all these tests:
dEQP-GLES2.functional.shaders.functions.datatypes.float_mat*
dEQP-GLES2.functional.shaders.functions.datatypes.mat*
dEQP-GLES2.functional.shaders.linkage.varying_type_mat*
dEQP-GLES2.functional.shaders.matrix.*
dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.render.basic.mat2_*
dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.render.basic.mat3_*
dEQP-GLES2.functional.shaders.conversions.matrix_to_matrix.*
dEQP-GLES2.functional.shaders.conversions.matrix_combine.*
dEQP-GLES2.functional.shaders.random.scalar_conversion*

Bug:angleproject:2581
Bug:angleproject:2583
Bug:angleproject:2584
Bug:angleproject:2588
Change-Id: Ib8c03397f0229432292c51f4a6332f954fc8fa12
Reviewed-on: https://chromium-review.googlesource.com/1080392
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 834eea4..de78ac4 100644
--- a/src/libANGLE/renderer/vulkan/ProgramVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ProgramVk.cpp
@@ -12,6 +12,7 @@
 #include "common/debug.h"
 #include "common/utilities.h"
 #include "libANGLE/Context.h"
+#include "libANGLE/renderer/renderer_utils.h"
 #include "libANGLE/renderer/vulkan/ContextVk.h"
 #include "libANGLE/renderer/vulkan/GlslangWrapper.h"
 #include "libANGLE/renderer/vulkan/RendererVk.h"
@@ -487,8 +488,18 @@
 
     ASSERT(linkedUniform.typeInfo->componentType == entryPointType ||
            linkedUniform.typeInfo->componentType == gl::VariableBoolVectorType(entryPointType));
-    ReadFromDefaultUniformBlock(linkedUniform.typeInfo->componentCount, locationInfo.arrayIndex, v,
-                                layoutInfo, &uniformBlock.uniformData);
+
+    if (gl::IsMatrixType(linkedUniform.type))
+    {
+        const uint8_t *ptrToElement = uniformBlock.uniformData.data() + layoutInfo.offset +
+                                      (locationInfo.arrayIndex * linkedUniform.getElementSize());
+        GetMatrixUniform(linkedUniform.type, v, reinterpret_cast<const T *>(ptrToElement), false);
+    }
+    else
+    {
+        ReadFromDefaultUniformBlock(linkedUniform.typeInfo->componentCount, locationInfo.arrayIndex,
+                                    v, layoutInfo, &uniformBlock.uniformData);
+    }
 }
 
 void ProgramVk::setUniform1fv(GLint location, GLsizei count, const GLfloat *v)
@@ -551,18 +562,37 @@
     UNIMPLEMENTED();
 }
 
+template <int cols, int rows>
+void ProgramVk::setUniformMatrixfv(GLint location,
+                                   GLsizei count,
+                                   GLboolean transpose,
+                                   const GLfloat *value)
+{
+    const gl::VariableLocation &locationInfo = mState.getUniformLocations()[location];
+    const gl::LinkedUniform &linkedUniform   = mState.getUniforms()[locationInfo.index];
+
+    for (auto &uniformBlock : mDefaultUniformBlocks)
+    {
+        const sh::BlockMemberInfo &layoutInfo = uniformBlock.uniformLayout[location];
+
+        // Assume an offset of -1 means the block is unused.
+        if (layoutInfo.offset == -1)
+        {
+            continue;
+        }
+
+        uniformBlock.uniformsDirty = SetFloatUniformMatrix<cols, rows>(
+            locationInfo.arrayIndex, linkedUniform.getArraySizeProduct(), count, transpose, value,
+            uniformBlock.uniformData.data() + layoutInfo.offset);
+    }
+}
+
 void ProgramVk::setUniformMatrix2fv(GLint location,
                                     GLsizei count,
                                     GLboolean transpose,
                                     const GLfloat *value)
 {
-    if (transpose == GL_TRUE)
-    {
-        UNIMPLEMENTED();
-        return;
-    }
-
-    setUniformImpl(location, count, value, GL_FLOAT_MAT2);
+    setUniformMatrixfv<2, 2>(location, count, transpose, value);
 }
 
 void ProgramVk::setUniformMatrix3fv(GLint location,
@@ -570,12 +600,7 @@
                                     GLboolean transpose,
                                     const GLfloat *value)
 {
-    if (transpose == GL_TRUE)
-    {
-        UNIMPLEMENTED();
-        return;
-    }
-    setUniformImpl(location, count, value, GL_FLOAT_MAT3);
+    setUniformMatrixfv<3, 3>(location, count, transpose, value);
 }
 
 void ProgramVk::setUniformMatrix4fv(GLint location,
@@ -583,13 +608,7 @@
                                     GLboolean transpose,
                                     const GLfloat *value)
 {
-    if (transpose == GL_TRUE)
-    {
-        UNIMPLEMENTED();
-        return;
-    }
-
-    setUniformImpl(location, count, value, GL_FLOAT_MAT4);
+    setUniformMatrixfv<4, 4>(location, count, transpose, value);
 }
 
 void ProgramVk::setUniformMatrix2x3fv(GLint location,
@@ -597,7 +616,7 @@
                                       GLboolean transpose,
                                       const GLfloat *value)
 {
-    UNIMPLEMENTED();
+    setUniformMatrixfv<2, 3>(location, count, transpose, value);
 }
 
 void ProgramVk::setUniformMatrix3x2fv(GLint location,
@@ -605,7 +624,7 @@
                                       GLboolean transpose,
                                       const GLfloat *value)
 {
-    UNIMPLEMENTED();
+    setUniformMatrixfv<3, 2>(location, count, transpose, value);
 }
 
 void ProgramVk::setUniformMatrix2x4fv(GLint location,
@@ -613,7 +632,7 @@
                                       GLboolean transpose,
                                       const GLfloat *value)
 {
-    UNIMPLEMENTED();
+    setUniformMatrixfv<2, 4>(location, count, transpose, value);
 }
 
 void ProgramVk::setUniformMatrix4x2fv(GLint location,
@@ -621,7 +640,7 @@
                                       GLboolean transpose,
                                       const GLfloat *value)
 {
-    UNIMPLEMENTED();
+    setUniformMatrixfv<4, 2>(location, count, transpose, value);
 }
 
 void ProgramVk::setUniformMatrix3x4fv(GLint location,
@@ -629,7 +648,7 @@
                                       GLboolean transpose,
                                       const GLfloat *value)
 {
-    UNIMPLEMENTED();
+    setUniformMatrixfv<3, 4>(location, count, transpose, value);
 }
 
 void ProgramVk::setUniformMatrix4x3fv(GLint location,
@@ -637,7 +656,7 @@
                                       GLboolean transpose,
                                       const GLfloat *value)
 {
-    UNIMPLEMENTED();
+    setUniformMatrixfv<4, 3>(location, count, transpose, value);
 }
 
 void ProgramVk::setUniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding)