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)