| // | |
| // 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); | |
| } |