// // 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. // // AppendixALimitations_test.cpp: // Tests for validating ESSL 1.00 Appendix A limitations. // #include "gtest/gtest.h" #include "GLSLANG/ShaderLang.h" #include "angle_gl.h" #include "gtest/gtest.h" #include "tests/test_utils/ShaderCompileTreeTest.h" using namespace sh; class AppendixALimitationsTest : public ShaderCompileTreeTest { public: AppendixALimitationsTest() {} protected: ::GLenum getShaderType() const override { return GL_FRAGMENT_SHADER; } ShShaderSpec getShaderSpec() const override { return SH_WEBGL_SPEC; } }; // Test an invalid shader where a for loop index is used as an out parameter. TEST_F(AppendixALimitationsTest, IndexAsFunctionOutParameter) { const std::string &shaderString = "precision mediump float;\n" "void fun(out int a)\n" "{\n" " a = 2;\n" "}\n" "void main()\n" "{\n" " for (int i = 0; i < 2; ++i)\n" " {\n" " fun(i);\n" " }\n" " gl_FragColor = vec4(0.0);\n" "}\n"; if (compile(shaderString)) { FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog; } } // Test an invalid shader where a for loop index is used as an inout parameter. TEST_F(AppendixALimitationsTest, IndexAsFunctionInOutParameter) { const std::string &shaderString = "precision mediump float;\n" "void fun(int b, inout int a)\n" "{\n" " a += b;\n" "}\n" "void main()\n" "{\n" " for (int i = 0; i < 2; ++i)\n" " {\n" " fun(2, i);\n" " }\n" " gl_FragColor = vec4(0.0);\n" "}\n"; if (compile(shaderString)) { FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog; } } // Test a valid shader where a for loop index is used as an in parameter in a function that also has // an out parameter. TEST_F(AppendixALimitationsTest, IndexAsFunctionInParameter) { const std::string &shaderString = "precision mediump float;\n" "void fun(int b, inout int a)\n" "{\n" " a += b;\n" "}\n" "void main()\n" "{\n" " for (int i = 0; i < 2; ++i)\n" " {\n" " int a = 1;" " fun(i, a);\n" " }\n" " gl_FragColor = vec4(0.0);\n" "}\n"; if (!compile(shaderString)) { FAIL() << "Shader compilation failed, expecting success:\n" << mInfoLog; } } // Test an invalid shader where a for loop index is used as a target of assignment. TEST_F(AppendixALimitationsTest, IndexAsTargetOfAssignment) { const std::string &shaderString = "precision mediump float;\n" "void main()\n" "{\n" " for (int i = 0; i < 2; ++i)\n" " {\n" " i = 2;\n" " }\n" " gl_FragColor = vec4(0.0);\n" "}\n"; if (compile(shaderString)) { FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog; } } // Test an invalid shader where a for loop index is incremented inside the loop. TEST_F(AppendixALimitationsTest, IndexIncrementedInLoopBody) { const std::string &shaderString = "precision mediump float;\n" "void main()\n" "{\n" " for (int i = 0; i < 2; ++i)\n" " {\n" " ++i;\n" " }\n" " gl_FragColor = vec4(0.0);\n" "}\n"; if (compile(shaderString)) { FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog; } }