Fix link error when using varyings with "dx_".
Varyings beginning with "dx_" would not get decorated properly, or
at all, which could cause potential internal variables and certainly
caused link errors. Fix this by no longer treating the "dx_" prefix
differently.
Also fix our naming of "dx_Position" to be consistent with our other
internal types.
BUG=angle:678
Change-Id: I03da0494a3d934d82ae7b3f8f12a576ff9bc3869
Reviewed-on: https://chromium-review.googlesource.com/203777
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Tested-by: Jamie Madill <jmadill@chromium.org>
diff --git a/tests/angle_tests/GLSLTest.cpp b/tests/angle_tests/GLSLTest.cpp
new file mode 100644
index 0000000..7f4983e
--- /dev/null
+++ b/tests/angle_tests/GLSLTest.cpp
@@ -0,0 +1,145 @@
+#include "ANGLETest.h"
+
+class GLSLTest : public ANGLETest
+{
+protected:
+ GLSLTest()
+ {
+ setWindowWidth(128);
+ setWindowHeight(128);
+ setConfigRedBits(8);
+ setConfigGreenBits(8);
+ setConfigBlueBits(8);
+ setConfigAlphaBits(8);
+ }
+
+ virtual void SetUp()
+ {
+ ANGLETest::SetUp();
+
+ mSimpleVSSource = SHADER_SOURCE
+ (
+ attribute vec4 inputAttribute;
+ void main()
+ {
+ gl_Position = inputAttribute;
+ }
+ );
+ }
+
+ std::string mSimpleVSSource;
+};
+
+TEST_F(GLSLTest, nameless_scoped_structs)
+{
+ const std::string fragmentShaderSource = SHADER_SOURCE
+ (
+ precision mediump float;
+
+ void main()
+ {
+ struct
+ {
+ float q;
+ } b;
+
+ gl_FragColor = vec4(1, 0, 0, 1);
+ gl_FragColor.a += b.q;
+ }
+ );
+
+ GLuint program = compileProgram(mSimpleVSSource, fragmentShaderSource);
+ EXPECT_NE(0u, program);
+}
+TEST_F(GLSLTest, scoped_structs_order_bug)
+{
+ const std::string fragmentShaderSource = SHADER_SOURCE
+ (
+ precision mediump float;
+
+ struct T
+ {
+ float f;
+ };
+
+ void main()
+ {
+ T a;
+
+ struct T
+ {
+ float q;
+ };
+
+ T b;
+
+ gl_FragColor = vec4(1, 0, 0, 1);
+ gl_FragColor.a += a.f;
+ gl_FragColor.a += b.q;
+ }
+ );
+
+ GLuint program = compileProgram(mSimpleVSSource, fragmentShaderSource);
+ EXPECT_NE(0u, program);
+}
+
+TEST_F(GLSLTest, scoped_structs_bug)
+{
+ const std::string fragmentShaderSource = SHADER_SOURCE
+ (
+ precision mediump float;
+
+ struct T_0
+ {
+ float f;
+ };
+
+ void main()
+ {
+ gl_FragColor = vec4(1, 0, 0, 1);
+
+ struct T
+ {
+ vec2 v;
+ };
+
+ T_0 a;
+ T b;
+
+ gl_FragColor.a += a.f;
+ gl_FragColor.a += b.v.x;
+ }
+ );
+
+ GLuint program = compileProgram(mSimpleVSSource, fragmentShaderSource);
+ EXPECT_NE(0u, program);
+}
+
+TEST_F(GLSLTest, dx_position_bug)
+{
+ const std::string &vertexShaderSource = SHADER_SOURCE
+ (
+ attribute vec4 inputAttribute;
+ varying float dx_Position;
+ void main()
+ {
+ gl_Position = vec4(inputAttribute);
+ dx_Position = 0.0;
+ }
+ );
+
+ const std::string &fragmentShaderSource = SHADER_SOURCE
+ (
+ precision mediump float;
+
+ varying float dx_Position;
+
+ void main()
+ {
+ gl_FragColor = vec4(dx_Position, 0, 0, 1);
+ }
+ );
+
+ GLuint program = compileProgram(vertexShaderSource, fragmentShaderSource);
+ EXPECT_NE(0u, program);
+}