Edit

kc3-lang/angle/tests/angle_tests/GLSLTest.cpp

Branch :

  • Show log

    Commit

  • Author : Jamie Madill
    Date : 2014-08-04 13:13:25
    Hash : 778d5279
    Message : Fix a stray quote that snuck into GLSLTest.cpp. This was causing a test failure in TwoElseIfRewriting. BUG=angle:716 Change-Id: I75e21ff586cdef10f0c35985a97fbb7c4783d2fe Reviewed-on: https://chromium-review.googlesource.com/210991 Tested-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org>

  • tests/angle_tests/GLSLTest.cpp
  • #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, NamelessScopedStructs)
    {
        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, ScopedStructsOrderBug)
    {
        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, ScopedStructsBug)
    {
        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, DxPositionBug)
    {
        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);
    }
    
    TEST_F(GLSLTest, ElseIfRewriting)
    {
        const std::string &vertexShaderSource =
            "attribute vec4 a_position;\n"
            "varying float v;\n"
            "void main() {\n"
            "  gl_Position = a_position;\n"
            "  v = 1.0;\n"
            "  if (a_position.x <= 0.5) {\n"
            "    v = 0.0;\n"
            "  } else if (a_position.x >= 0.5) {\n"
            "    v = 2.0;\n"
            "  }\n"
            "}\n";
    
        const std::string &fragmentShaderSource =
            "precision highp float;\n"
            "varying float v;\n"
            "void main() {\n"
            "  vec4 color = vec4(1.0, 0.0, 0.0, 1.0);\n"
            "  if (v >= 1.0) color = vec4(0.0, 1.0, 0.0, 1.0);\n"
            "  if (v >= 2.0) color = vec4(0.0, 0.0, 1.0, 1.0);\n"
            "  gl_FragColor = color;\n"
            "}\n";
    
        GLuint program = compileProgram(vertexShaderSource, fragmentShaderSource);
        ASSERT_NE(0u, program);
    
        drawQuad(program, "a_position", 0.5f);
        swapBuffers();
    
        EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255);
        EXPECT_PIXEL_EQ(getWindowWidth()-1, 0, 0, 255, 0, 255);
    }
    
    TEST_F(GLSLTest, TwoElseIfRewriting)
    {
        const std::string &vertexShaderSource =
            "attribute vec4 a_position;\n"
            "varying float v;\n"
            "void main() {\n"
            "  gl_Position = a_position;\n"
            "  if (a_position.x == 0.0) {\n"
            "    v = 1.0;\n"
            "  } else if (a_position.x > 0.5) {\n"
            "    v = 0.0;\n"
            "  } else if (a_position.x > 0.75) {\n"
            "    v = 0.5;\n"
            "  }\n"
            "}\n";
    
        const std::string &fragmentShaderSource =
            "precision highp float;\n"
            "varying float v;\n"
            "void main() {\n"
            "  gl_FragColor = vec4(v, 0.0, 0.0, 1.0);\n"
            "}\n";
    
        GLuint program = compileProgram(vertexShaderSource, fragmentShaderSource);
        EXPECT_NE(0u, program);
    }
    
    TEST_F(GLSLTest, InvariantVaryingOut)
    {
        const std::string fragmentShaderSource = SHADER_SOURCE
        (
            precision mediump float;
            varying float v_varying;
            void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }
        );
    
        const std::string vertexShaderSource = SHADER_SOURCE
        (
            attribute vec4 a_position;
            invariant varying float v_varying;
            void main() { v_varying = a_position.x; gl_Position = a_position; }
        );
    
        GLuint program = compileProgram(vertexShaderSource, fragmentShaderSource);
        EXPECT_NE(0u, program);
    }
    
    TEST_F(GLSLTest, InvariantVaryingIn)
    {
        const std::string fragmentShaderSource = SHADER_SOURCE
        (
            precision mediump float;
            invariant varying float v_varying;
            void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }
        );
    
        const std::string vertexShaderSource = SHADER_SOURCE
        (
            attribute vec4 a_position;
            varying float v_varying;
            void main() { v_varying = a_position.x; gl_Position = a_position; }
        );
    
        GLuint program = compileProgram(vertexShaderSource, fragmentShaderSource);
        EXPECT_NE(0u, program);
    }
    
    TEST_F(GLSLTest, InvariantVaryingBoth)
    {
        const std::string fragmentShaderSource = SHADER_SOURCE
        (
            precision mediump float;
            invariant varying float v_varying;
            void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }
        );
    
        const std::string vertexShaderSource = SHADER_SOURCE
        (
            attribute vec4 a_position;
            invariant varying float v_varying;
            void main() { v_varying = a_position.x; gl_Position = a_position; }
        );
    
        GLuint program = compileProgram(vertexShaderSource, fragmentShaderSource);
        EXPECT_NE(0u, program);
    }
    
    TEST_F(GLSLTest, InvariantGLPosition)
    {
        const std::string fragmentShaderSource = SHADER_SOURCE
        (
            precision mediump float;
            varying float v_varying;
            void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }
        );
    
        const std::string vertexShaderSource = SHADER_SOURCE
        (
            attribute vec4 a_position;
            invariant gl_Position;
            varying float v_varying;
            void main() { v_varying = a_position.x; gl_Position = a_position; }
        );
    
        GLuint program = compileProgram(vertexShaderSource, fragmentShaderSource);
        EXPECT_NE(0u, program);
    }
    
    TEST_F(GLSLTest, InvariantAll)
    {
        const std::string fragmentShaderSource = SHADER_SOURCE
        (
            precision mediump float;
            varying float v_varying;
            void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }
        );
    
        const std::string vertexShaderSource =
            "#pragma STDGL invariant(all)\n"
            "attribute vec4 a_position;\n"
            "varying float v_varying;\n"
            "void main() { v_varying = a_position.x; gl_Position = a_position; }\n";
    
        GLuint program = compileProgram(vertexShaderSource, fragmentShaderSource);
        EXPECT_NE(0u, program);
    }