| // |
| // Copyright 2018 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. |
| // |
| // UnfoldShortCircuitAST_test.cpp: |
| // Tests shader compilation with SH_UNFOLD_SHORT_CIRCUIT workaround on. |
| |
| #include "GLSLANG/ShaderLang.h" |
| #include "angle_gl.h" |
| #include "gtest/gtest.h" |
| #include "tests/test_utils/compiler_test.h" |
| |
| using namespace sh; |
| |
| class UnfoldShortCircuitASTTest : public MatchOutputCodeTest |
| { |
| public: |
| UnfoldShortCircuitASTTest() |
| : MatchOutputCodeTest(GL_FRAGMENT_SHADER, SH_UNFOLD_SHORT_CIRCUIT, SH_GLSL_330_CORE_OUTPUT) |
| {} |
| }; |
| |
| // Test unfolding the && operator. |
| TEST_F(UnfoldShortCircuitASTTest, UnfoldAnd) |
| { |
| const std::string &shaderString = |
| R"(#version 300 es |
| precision highp float; |
| |
| out vec4 color; |
| uniform bool b; |
| uniform bool b2; |
| |
| void main() |
| { |
| color = vec4(0, 0, 0, 1); |
| if (b && b2) |
| { |
| color = vec4(0, 1, 0, 1); |
| } |
| })"; |
| compile(shaderString); |
| ASSERT_TRUE(foundInCode("(_ub) ? (_ub2) : (false)")); |
| } |
| |
| // Test unfolding the || operator. |
| TEST_F(UnfoldShortCircuitASTTest, UnfoldOr) |
| { |
| const std::string &shaderString = |
| R"(#version 300 es |
| precision highp float; |
| |
| out vec4 color; |
| uniform bool b; |
| uniform bool b2; |
| |
| void main() |
| { |
| color = vec4(0, 0, 0, 1); |
| if (b || b2) |
| { |
| color = vec4(0, 1, 0, 1); |
| } |
| })"; |
| compile(shaderString); |
| ASSERT_TRUE(foundInCode("(_ub) ? (true) : (_ub2)")); |
| } |
| |
| // Test unfolding nested && and || operators. Both should be unfolded. |
| TEST_F(UnfoldShortCircuitASTTest, UnfoldNested) |
| { |
| const std::string &shaderString = |
| R"(#version 300 es |
| precision highp float; |
| |
| out vec4 color; |
| uniform bool b; |
| uniform bool b2; |
| uniform bool b3; |
| |
| void main() |
| { |
| color = vec4(0, 0, 0, 1); |
| if (b && (b2 || b3)) |
| { |
| color = vec4(0, 1, 0, 1); |
| } |
| })"; |
| compile(shaderString); |
| ASSERT_TRUE(foundInCode("(_ub) ? (((_ub2) ? (true) : (_ub3))) : (false)")); |
| } |