| // |
| // 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. |
| // |
| // RegenerateStructNames_test.cpp: |
| // Tests for regenerating struct names. |
| // |
| |
| #include "GLSLANG/ShaderLang.h" |
| #include "angle_gl.h" |
| #include "gtest/gtest.h" |
| #include "tests/test_utils/compiler_test.h" |
| |
| using namespace sh; |
| |
| class RegenerateStructNamesTest : public MatchOutputCodeTest |
| { |
| public: |
| RegenerateStructNamesTest() |
| : MatchOutputCodeTest(GL_FRAGMENT_SHADER, SH_REGENERATE_STRUCT_NAMES, SH_ESSL_OUTPUT) |
| {} |
| }; |
| |
| // Test that a struct defined in a function scope is renamed. The global struct that's used as a |
| // type of a uniform cannot be renamed. |
| TEST_F(RegenerateStructNamesTest, GlobalStructAndLocalStructWithTheSameName) |
| { |
| const std::string &shaderString = |
| R"(precision mediump float; |
| |
| struct myStruct |
| { |
| float foo; |
| }; |
| |
| uniform myStruct us; |
| |
| void main() |
| { |
| struct myStruct |
| { |
| vec2 bar; |
| }; |
| myStruct scoped; |
| scoped.bar = vec2(1.0, 2.0) * us.foo; |
| gl_FragColor = vec4(scoped.bar, 0.0, 1.0); |
| })"; |
| compile(shaderString); |
| EXPECT_TRUE(foundInCode("struct _umyStruct")); |
| EXPECT_TRUE(foundInCode("struct _u_webgl_struct_")); |
| } |
| |
| // Test that a nameless struct is handled gracefully. |
| TEST_F(RegenerateStructNamesTest, NamelessStruct) |
| { |
| const std::string &shaderString = |
| R"(precision mediump float; |
| |
| uniform float u; |
| |
| void main() |
| { |
| struct |
| { |
| vec2 bar; |
| } scoped; |
| scoped.bar = vec2(1.0, 2.0) * u; |
| gl_FragColor = vec4(scoped.bar, 0.0, 1.0); |
| })"; |
| compile(shaderString); |
| EXPECT_TRUE(foundInCode("struct")); |
| } |