Edit

kc3-lang/angle/tests/compiler_tests/ShaderExtension_test.cpp

Branch :

  • Show log

    Commit

  • Author : Geoff Lang
    Date : 2015-02-03 15:26:40
    Hash : 821f40a4
    Message : Fix conversion to bool warning. BUG=453543 Change-Id: I287cc3b6e86df71eb3dfa3c82316ae56950913b3 Reviewed-on: https://chromium-review.googlesource.com/245833 Reviewed-by: Geoff Lang <geofflang@chromium.org> Tested-by: Geoff Lang <geofflang@chromium.org>

  • tests/compiler_tests/ShaderExtension_test.cpp
  • //
    // Copyright (c) 2015 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.
    //
    // Extension_test.cpp
    //   Test that shaders need various extensions to be compiled.
    //
    
    #include "angle_gl.h"
    #include "gtest/gtest.h"
    #include "GLSLANG/ShaderLang.h"
    
    static const char *FragDepthExtShdr[] =
    {
        // First string of the shader. The required pragma declaration.
        "#extension GL_EXT_frag_depth : enable\n",
    
        // Second string of the shader. The rest of the shader body.
        "void main() { gl_FragDepthEXT = 1.0; }\n"
    };
    
    static const char *StandDerivExtShdr[] =
    {
        // First string of the shader. The required pragma declaration.
        "#extension GL_OES_standard_derivatives : enable\n",
    
        // Second string of the shader. The rest of the shader body.
        "precision mediump float;\n"
        "varying vec2 texCoord;\n"
        "void main() { gl_FragColor = vec4(dFdx(texCoord.x), dFdy(texCoord.y), fwidth(texCoord.x), 1.0); }\n"
    };
    
    static const char *TextureLODShdr[] =
    {
        // First string of the shader. The required pragma declaration.
        "#extension GL_EXT_shader_texture_lod : enable\n",
    
        // Second string of the shader. The rest of the shader body.
        "precision mediump float;\n"
        "varying vec2 texCoord0v;\n"
        "uniform float lod;\n"
        "uniform sampler2D tex;\n"
        "void main() { vec4 color = texture2DLodEXT(tex, texCoord0v, lod); }\n"
    };
    
    class ShaderExtensionTest : public testing::Test
    {
      public:
        ShaderExtensionTest() {}
    
      protected:
        virtual void SetUp()
        {
            ShInitBuiltInResources(&mResources);
            mCompiler = NULL;
        }
    
        virtual void TearDown()
        {
            DestroyCompiler();
        }
    
        void DestroyCompiler()
        {
            if (mCompiler)
            {
                ShDestruct(mCompiler);
                mCompiler = NULL;
            }
        }
    
        void InitializeCompiler()
        {
            DestroyCompiler();
            mCompiler = ShConstructCompiler(GL_FRAGMENT_SHADER, SH_WEBGL_SPEC, SH_GLSL_OUTPUT, &mResources);
            ASSERT_TRUE(mCompiler != NULL) << "Compiler could not be constructed.";
        }
    
        void TestShaderExtension(const char **shaderStrings, int stringCount, bool expectation)
        {
            bool success = ShCompile(mCompiler, shaderStrings, stringCount, 0);
            const std::string& compileLog = ShGetInfoLog(mCompiler);
            EXPECT_EQ(success, expectation) << compileLog;
        }
    
      protected:
        ShBuiltInResources mResources;
        ShHandle mCompiler;
    };
    
    TEST_F(ShaderExtensionTest, FragDepthExtRequiresExt)
    {
        // Extension is required to compile properly.
        mResources.EXT_frag_depth = 0;
        InitializeCompiler();
        TestShaderExtension(FragDepthExtShdr, 2, false);
    }
    
    TEST_F(ShaderExtensionTest, FragDepthExtRequiresPragma)
    {
        // Pragma is required to compile properly.
        mResources.EXT_frag_depth = 1;
        InitializeCompiler();
        TestShaderExtension(&FragDepthExtShdr[1], 1, false);
    }
    
    TEST_F(ShaderExtensionTest, FragDepthExtCompiles)
    {
        // Test that it compiles properly with extension enabled.
        mResources.EXT_frag_depth = 1;
        InitializeCompiler();
        TestShaderExtension(FragDepthExtShdr, 2, true);
    }
    
    TEST_F(ShaderExtensionTest, FragDepthExtResetsInternalStates)
    {
        // Test that extension internal states are reset properly between compiles.
        mResources.EXT_frag_depth = 1;
        InitializeCompiler();
    
        TestShaderExtension(FragDepthExtShdr, 2, true);
        TestShaderExtension(&FragDepthExtShdr[1], 1, false);
        TestShaderExtension(FragDepthExtShdr, 2, true);
    };
    
    TEST_F(ShaderExtensionTest, StandDerivExtRequiresExt)
    {
        // Extension is required to compile properly.
        mResources.OES_standard_derivatives = 0;
        InitializeCompiler();
        TestShaderExtension(StandDerivExtShdr, 2, false);
    }
    
    TEST_F(ShaderExtensionTest, StandDerivExtRequiresPragma)
    {
        // Pragma is required to compile properly.
        mResources.OES_standard_derivatives = 1;
        InitializeCompiler();
        TestShaderExtension(&StandDerivExtShdr[1], 1, false);
    }
    
    TEST_F(ShaderExtensionTest, StandDerivExtCompiles)
    {
        // Test that it compiles properly with extension enabled.
        mResources.OES_standard_derivatives = 1;
        InitializeCompiler();
        TestShaderExtension(StandDerivExtShdr, 2, true);
    }
    
    TEST_F(ShaderExtensionTest, StandDerivExtResetsInternalStates)
    {
        // Test that extension internal states are reset properly between compiles.
        mResources.OES_standard_derivatives = 1;
        InitializeCompiler();
    
        TestShaderExtension(StandDerivExtShdr, 2, true);
        TestShaderExtension(&StandDerivExtShdr[1], 1, false);
        TestShaderExtension(StandDerivExtShdr, 2, true);
        TestShaderExtension(&StandDerivExtShdr[1], 1, false);
    };
    
    TEST_F(ShaderExtensionTest, TextureLODExtRequiresExt)
    {
        // Extension is required to compile properly.
        mResources.EXT_shader_texture_lod = 0;
        InitializeCompiler();
        TestShaderExtension(TextureLODShdr, 2, false);
    }
    
    TEST_F(ShaderExtensionTest, TextureLODExtRequiresPragma)
    {
        // Pragma is required to compile properly.
        mResources.EXT_shader_texture_lod = 1;
        InitializeCompiler();
        TestShaderExtension(&TextureLODShdr[1], 1, false);
    }
    
    TEST_F(ShaderExtensionTest, TextureLODExtCompiles)
    {
        // Test that it compiles properly with extension enabled.
        mResources.EXT_shader_texture_lod = 1;
        InitializeCompiler();
        TestShaderExtension(TextureLODShdr, 2, true);
    }
    
    TEST_F(ShaderExtensionTest, TextureLODExtResetsInternalStates)
    {
        // Test that extension internal states are reset properly between compiles.
        mResources.EXT_shader_texture_lod = 1;
        InitializeCompiler();
    
        TestShaderExtension(&TextureLODShdr[1], 1, false);
        TestShaderExtension(TextureLODShdr, 2, true);
        TestShaderExtension(&TextureLODShdr[1], 1, false);
        TestShaderExtension(TextureLODShdr, 2, true);
    };