Vulkan: Get/SetUniform for float / int and vec*

Bug:angleproject:2392

Change-Id: I2110ecde653a85a28b515dc9d8473a1b37a73eb6
Reviewed-on: https://chromium-review.googlesource.com/962718
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Luc Ferron <lucferron@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/ProgramVk.cpp b/src/libANGLE/renderer/vulkan/ProgramVk.cpp
index 5b2411d..2b6cfe3 100644
--- a/src/libANGLE/renderer/vulkan/ProgramVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ProgramVk.cpp
@@ -99,6 +99,26 @@
     }
 }
 
+template <typename T>
+void ReadFromDefaultUniformBlock(int componentCount,
+                                 T *dst,
+                                 const sh::BlockMemberInfo &layoutInfo,
+                                 const angle::MemoryBuffer *uniformData)
+{
+    ASSERT(layoutInfo.offset != -1);
+
+    int elementSize = sizeof(T) * componentCount;
+    if (layoutInfo.arrayStride == 0 || layoutInfo.arrayStride == elementSize)
+    {
+        const uint8_t *readPtr = uniformData->data() + layoutInfo.offset;
+        memcpy(dst, readPtr, elementSize);
+    }
+    else
+    {
+        UNIMPLEMENTED();
+    }
+}
+
 vk::Error SyncDefaultUniformBlock(VkDevice device,
                                   vk::DeviceMemory *bufferMemory,
                                   const angle::MemoryBuffer &bufferData)
@@ -405,6 +425,12 @@
     const gl::VariableLocation &locationInfo = mState.getUniformLocations()[location];
     const gl::LinkedUniform &linkedUniform   = mState.getUniforms()[locationInfo.index];
 
+    if (linkedUniform.isSampler())
+    {
+        UNIMPLEMENTED();
+        return;
+    }
+
     if (linkedUniform.type == entryPointType)
     {
         for (auto &uniformBlock : mDefaultUniformBlocks)
@@ -421,6 +447,28 @@
     }
 }
 
+template <typename T>
+void ProgramVk::getUniformImpl(GLint location, T *v, GLenum entryPointType) const
+{
+    const gl::VariableLocation &locationInfo = mState.getUniformLocations()[location];
+    const gl::LinkedUniform &linkedUniform   = mState.getUniforms()[locationInfo.index];
+
+    if (linkedUniform.isSampler())
+    {
+        UNIMPLEMENTED();
+        return;
+    }
+
+    ASSERT(linkedUniform.typeInfo->componentType == entryPointType);
+    const gl::ShaderType shaderType = linkedUniform.getFirstStaticUseShaderType();
+    ASSERT(shaderType != gl::ShaderType::SHADER_TYPE_INVALID);
+
+    const DefaultUniformBlock &uniformBlock = mDefaultUniformBlocks[shaderType];
+    const sh::BlockMemberInfo &layoutInfo   = uniformBlock.uniformLayout[location];
+    ReadFromDefaultUniformBlock(linkedUniform.typeInfo->componentCount, v, layoutInfo,
+                                &uniformBlock.uniformData);
+}
+
 void ProgramVk::setUniform1fv(GLint location, GLsizei count, const GLfloat *v)
 {
     setUniformImpl(location, count, v, GL_FLOAT);
@@ -443,7 +491,7 @@
 
 void ProgramVk::setUniform1iv(GLint location, GLsizei count, const GLint *v)
 {
-    UNIMPLEMENTED();
+    setUniformImpl(location, count, v, GL_INT);
 }
 
 void ProgramVk::setUniform2iv(GLint location, GLsizei count, const GLint *v)
@@ -617,12 +665,12 @@
 
 void ProgramVk::getUniformfv(const gl::Context *context, GLint location, GLfloat *params) const
 {
-    UNIMPLEMENTED();
+    getUniformImpl(location, params, GL_FLOAT);
 }
 
 void ProgramVk::getUniformiv(const gl::Context *context, GLint location, GLint *params) const
 {
-    UNIMPLEMENTED();
+    getUniformImpl(location, params, GL_INT);
 }
 
 void ProgramVk::getUniformuiv(const gl::Context *context, GLint location, GLuint *params) const