// // 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 unfoldShortCircuit 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_GLSL_330_CORE_OUTPUT) { ShCompileOptions defaultCompileOptions = {}; defaultCompileOptions.unfoldShortCircuit = true; setDefaultCompileOptions(defaultCompileOptions); } }; // 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)")); }