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: