| // |
| // Copyright 2014 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. |
| // |
| // ARB_texture_rectangle_test.cpp: |
| // Test for the ARB_texture_rectangle extension |
| // |
| |
| #include "GLSLANG/ShaderLang.h" |
| #include "angle_gl.h" |
| #include "gtest/gtest.h" |
| #include "tests/test_utils/ShaderCompileTreeTest.h" |
| |
| using namespace sh; |
| |
| class ARBTextureRectangleTestNoExt : public ShaderCompileTreeTest |
| { |
| protected: |
| ::GLenum getShaderType() const override { return GL_FRAGMENT_SHADER; } |
| ShShaderSpec getShaderSpec() const override { return SH_GLES3_SPEC; } |
| }; |
| |
| class ARBTextureRectangleTest : public ARBTextureRectangleTestNoExt |
| { |
| protected: |
| void initResources(ShBuiltInResources *resources) override |
| { |
| resources->ARB_texture_rectangle = 1; |
| } |
| }; |
| |
| // Check that if the extension is not supported, trying to use the features without having an |
| // extension directive fails. |
| TEST_F(ARBTextureRectangleTestNoExt, NewTypeAndBuiltinsWithoutExtensionDirective) |
| { |
| const std::string &shaderString = |
| R"( |
| precision mediump float; |
| uniform sampler2DRect tex; |
| void main() |
| { |
| vec4 color = texture2DRect(tex, vec2(1.0)); |
| color = texture2DRectProj(tex, vec3(1.0)); |
| color = texture2DRectProj(tex, vec4(1.0)); |
| })"; |
| if (compile(shaderString)) |
| { |
| FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog; |
| } |
| } |
| |
| // Check that if the extension is not supported, trying to use the features fails. |
| TEST_F(ARBTextureRectangleTestNoExt, NewTypeAndBuiltinsWithExtensionDirective) |
| { |
| const std::string &shaderString = |
| R"( |
| #extension GL_ARB_texture_rectangle : enable |
| precision mediump float; |
| uniform sampler2DRect tex; |
| void main() |
| { |
| vec4 color = texture2DRect(tex, vec2(1.0)); |
| color = texture2DRectProj(tex, vec3(1.0)); |
| color = texture2DRectProj(tex, vec4(1.0)); |
| })"; |
| if (compile(shaderString)) |
| { |
| FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog; |
| } |
| } |
| |
| // Check that new types and builtins are usable even with the #extension directive |
| // Issue #15 of ARB_texture_rectangle explains that the extension was specified before the |
| // #extension mechanism was in place so it doesn't require explicit enabling. |
| TEST_F(ARBTextureRectangleTest, NewTypeAndBuiltinsWithoutExtensionDirective) |
| { |
| const std::string &shaderString = |
| "precision mediump float;\n" |
| "uniform sampler2DRect tex;\n" |
| "void main() {\n" |
| " vec4 color = texture2DRect(tex, vec2(1.0));" |
| " color = texture2DRectProj(tex, vec3(1.0));" |
| " color = texture2DRectProj(tex, vec4(1.0));" |
| "}\n"; |
| if (!compile(shaderString)) |
| { |
| FAIL() << "Shader compilation failed, expecting success:\n" << mInfoLog; |
| } |
| } |
| |
| // Test valid usage of the new types and builtins |
| TEST_F(ARBTextureRectangleTest, NewTypeAndBuiltingsWithExtensionDirective) |
| { |
| const std::string &shaderString = |
| "#extension GL_ARB_texture_rectangle : require\n" |
| "precision mediump float;\n" |
| "uniform sampler2DRect tex;\n" |
| "void main() {\n" |
| " vec4 color = texture2DRect(tex, vec2(1.0));" |
| " color = texture2DRectProj(tex, vec3(1.0));" |
| " color = texture2DRectProj(tex, vec4(1.0));" |
| "}\n"; |
| if (!compile(shaderString)) |
| { |
| FAIL() << "Shader compilation failed, expecting success:\n" << mInfoLog; |
| } |
| } |
| |
| // Check that it is not possible to pass a sampler2DRect where sampler2D is expected, and vice versa |
| TEST_F(ARBTextureRectangleTest, Rect2DVs2DMismatch) |
| { |
| const std::string &shaderString1 = |
| "#extension GL_ARB_texture_rectangle : require\n" |
| "precision mediump float;\n" |
| "uniform sampler2DRect tex;\n" |
| "void main() {\n" |
| " vec4 color = texture2D(tex, vec2(1.0));" |
| "}\n"; |
| if (compile(shaderString1)) |
| { |
| FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog; |
| } |
| |
| const std::string &shaderString2 = |
| "#extension GL_ARB_texture_rectangle : require\n" |
| "precision mediump float;\n" |
| "uniform sampler2D tex;\n" |
| "void main() {\n" |
| " vec4 color = texture2DRect(tex, vec2(1.0));" |
| "}\n"; |
| if (compile(shaderString2)) |
| { |
| FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog; |
| } |
| } |
| |
| // Disabling ARB_texture_rectangle in GLSL should work, even if it is enabled by default. |
| // See ARB_texture_rectangle spec: "a shader can still include all variations of #extension |
| // GL_ARB_texture_rectangle in its source code" |
| TEST_F(ARBTextureRectangleTest, DisableARBTextureRectangle) |
| { |
| const std::string &shaderString = |
| R"( |
| #extension GL_ARB_texture_rectangle : disable |
| |
| precision mediump float; |
| |
| uniform sampler2DRect s; |
| void main() |
| {})"; |
| if (compile(shaderString)) |
| { |
| FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog; |
| } |
| } |
| |
| // The compiler option to disable ARB_texture_rectangle should prevent shaders from |
| // enabling it. |
| TEST_F(ARBTextureRectangleTest, CompilerOption) |
| { |
| const std::string &shaderString = |
| R"( |
| #extension GL_ARB_texture_rectangle : enable |
| precision mediump float; |
| uniform sampler2DRect s; |
| void main() {})"; |
| mExtraCompileOptions |= SH_DISABLE_ARB_TEXTURE_RECTANGLE; |
| if (compile(shaderString)) |
| { |
| FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog; |
| } |
| } |
| |
| // The compiler option to disable ARB_texture_rectangle should be toggleable. |
| TEST_F(ARBTextureRectangleTest, ToggleCompilerOption) |
| { |
| const std::string &shaderString = |
| R"( |
| precision mediump float; |
| uniform sampler2DRect s; |
| void main() {})"; |
| if (!compile(shaderString)) |
| { |
| FAIL() << "Shader compilation failed, expecting success:\n" << mInfoLog; |
| } |
| mExtraCompileOptions |= SH_DISABLE_ARB_TEXTURE_RECTANGLE; |
| if (compile(shaderString)) |
| { |
| FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog; |
| } |
| mExtraCompileOptions &= ~SH_DISABLE_ARB_TEXTURE_RECTANGLE; |
| if (!compile(shaderString)) |
| { |
| FAIL() << "Shader compilation failed, expecting success:\n" << mInfoLog; |
| } |
| } |