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