| // |
| // Copyright 2017 The ANGLE Project Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| // ScalarizeVecAndMatConstructorArgs_test.cpp: |
| // Tests for scalarizing vector and matrix constructor args. |
| // |
| |
| #include "GLSLANG/ShaderLang.h" |
| #include "angle_gl.h" |
| #include "gtest/gtest.h" |
| #include "tests/test_utils/compiler_test.h" |
| |
| using namespace sh; |
| |
| namespace |
| { |
| |
| class ScalarizeVecAndMatConstructorArgsTest : public MatchOutputCodeTest |
| { |
| public: |
| ScalarizeVecAndMatConstructorArgsTest() |
| : MatchOutputCodeTest(GL_FRAGMENT_SHADER, |
| SH_SCALARIZE_VEC_AND_MAT_CONSTRUCTOR_ARGS, |
| SH_ESSL_OUTPUT) |
| {} |
| }; |
| |
| // Verifies scalarizing matrix inside a vector constructor. |
| TEST_F(ScalarizeVecAndMatConstructorArgsTest, MatrixInVectorConstructor) |
| { |
| const std::string shaderString = |
| R"( |
| precision mediump float; |
| |
| uniform mat2 umat2; |
| |
| void main() |
| { |
| gl_FragColor = vec4(umat2); |
| })"; |
| compile(shaderString); |
| |
| std::vector<const char *> expectedStrings = { |
| "main()", " = _uumat2", "gl_FragColor = vec4(", "[0][0],", "[0][1],", "[1][0],", "[1][1])"}; |
| |
| EXPECT_TRUE(foundInCodeInOrder(expectedStrings)); |
| } |
| |
| // Verifies scalarizing a vector insized a matrix constructor. |
| TEST_F(ScalarizeVecAndMatConstructorArgsTest, VectorInMatrixConstructor) |
| { |
| const std::string shaderString = |
| R"( |
| precision mediump float; |
| |
| uniform vec2 uvec2; |
| |
| void main() |
| { |
| mat2 m = mat2(uvec2, uvec2); |
| gl_FragColor = vec4(m * uvec2, m * uvec2); |
| })"; |
| compile(shaderString); |
| |
| std::vector<const char *> expectedStrings = { |
| "main()", " = _uuvec2", "mat2(", "[0],", "[1],", "[0],", "[1])", "gl_FragColor = vec4("}; |
| |
| EXPECT_TRUE(foundInCodeInOrder(expectedStrings)); |
| } |
| |
| // Verifies that scalarizing vector and matrix constructor args inside a sequence operator preserves |
| // correct order of operations. |
| TEST_F(ScalarizeVecAndMatConstructorArgsTest, SequenceOperator) |
| { |
| const std::string shaderString = |
| R"( |
| precision mediump float; |
| |
| uniform vec2 u; |
| |
| void main() |
| { |
| vec2 v = u; |
| mat2 m = (v[0] += 1.0, mat2(v, v[1], -v[0])); |
| gl_FragColor = vec4(m[0], m[1]); |
| })"; |
| compile(shaderString); |
| |
| std::vector<const char *> expectedStrings = {"_uv[0] += 1.0", "-_uv[0]"}; |
| |
| EXPECT_TRUE(foundInCodeInOrder(expectedStrings)); |
| } |
| |
| // Verifies that scalarizing vector and matrix constructor args inside multiple declarations |
| // preserves the correct order of operations. |
| TEST_F(ScalarizeVecAndMatConstructorArgsTest, MultiDeclaration) |
| { |
| const std::string shaderString = |
| R"( |
| precision mediump float; |
| |
| uniform vec2 u; |
| |
| void main() |
| { |
| vec2 v = vec2(u[0]), |
| w = mat2(v, v) * u; |
| gl_FragColor = vec4(v, w); |
| })"; |
| compile(shaderString); |
| |
| std::vector<const char *> expectedStrings = {"vec2(_uu[0])", "mat2("}; |
| |
| EXPECT_TRUE(foundInCodeInOrder(expectedStrings)); |
| } |
| |
| } // anonymous namespace |