1 #include "ANGLETest.h" 2 3 class GLSLStructTest : public ANGLETest 4 { 5 protected: 6 GLSLStructTest() 7 { 8 setWindowWidth(128); 9 setWindowHeight(128); 10 setConfigRedBits(8); 11 setConfigGreenBits(8); 12 setConfigBlueBits(8); 13 setConfigAlphaBits(8); 14 } 15 16 virtual void SetUp() 17 { 18 ANGLETest::SetUp(); 19 20 mVertexShaderSource = SHADER_SOURCE 21 ( 22 attribute vec4 inputAttribute; 23 void main() 24 { 25 gl_Position = inputAttribute; 26 } 27 ); 28 } 29 30 std::string mVertexShaderSource; 31 }; 32 33 TEST_F(GLSLStructTest, nameless_scoped_structs) 34 { 35 const std::string fragmentShaderSource = SHADER_SOURCE 36 ( 37 precision mediump float; 38 39 void main() 40 { 41 struct 42 { 43 float q; 44 } b; 45 46 gl_FragColor = vec4(1, 0, 0, 1); 47 gl_FragColor.a += b.q; 48 } 49 ); 50 51 GLuint program = compileProgram(mVertexShaderSource, fragmentShaderSource); 52 EXPECT_NE(0u, program); 53 } 54 TEST_F(GLSLStructTest, scoped_structs_order_bug) 55 { 56 const std::string fragmentShaderSource = SHADER_SOURCE 57 ( 58 precision mediump float; 59 60 struct T 61 { 62 float f; 63 }; 64 65 void main() 66 { 67 T a; 68 69 struct T 70 { 71 float q; 72 }; 73 74 T b; 75 76 gl_FragColor = vec4(1, 0, 0, 1); 77 gl_FragColor.a += a.f; 78 gl_FragColor.a += b.q; 79 } 80 ); 81 82 GLuint program = compileProgram(mVertexShaderSource, fragmentShaderSource); 83 EXPECT_NE(0u, program); 84 } 85 86 TEST_F(GLSLStructTest, scoped_structs_bug) 87 { 88 const std::string fragmentShaderSource = SHADER_SOURCE 89 ( 90 precision mediump float; 91 92 struct T_0 93 { 94 float f; 95 }; 96 97 void main() 98 { 99 gl_FragColor = vec4(1, 0, 0, 1); 100 101 struct T 102 { 103 vec2 v; 104 }; 105 106 T_0 a; 107 T b; 108 109 gl_FragColor.a += a.f; 110 gl_FragColor.a += b.v.x; 111 } 112 ); 113 114 GLuint program = compileProgram(mVertexShaderSource, fragmentShaderSource); 115 EXPECT_NE(0u, program); 116 } 117