| // | |
| // Copyright 2017 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. | |
| // | |
| // ExtensionDirective_test.cpp: | |
| // Miscellaneous tests for extension directives toggling functionality correctly. | |
| // | |
| #include "GLSLANG/ShaderLang.h" | |
| #include "angle_gl.h" | |
| #include "compiler/translator/ExtensionBehavior.h" | |
| #include "gtest/gtest.h" | |
| #include "tests/test_utils/ShaderCompileTreeTest.h" | |
| using namespace sh; | |
| class FragmentShaderExtensionDirectiveTest : public ShaderCompileTreeTest | |
| { | |
| public: | |
| FragmentShaderExtensionDirectiveTest() {} | |
| protected: | |
| ::GLenum getShaderType() const override { return GL_FRAGMENT_SHADER; } | |
| ShShaderSpec getShaderSpec() const override { return SH_GLES3_1_SPEC; } | |
| void testCompileNeedsExtensionDirective(const std::string &shader, const std::string &extension) | |
| { | |
| testCompileNeedsExtensionDirective(shader, extension, ""); | |
| } | |
| void testCompileNeedsExtensionDirective(const std::string &shader, | |
| const std::string &extension, | |
| const std::string &versionDirective) | |
| { | |
| if (compile(versionDirective + shader)) | |
| { | |
| FAIL() | |
| << "Shader compilation without extension directive succeeded, expecting failure:\n" | |
| << mInfoLog; | |
| } | |
| if (compile(versionDirective + getExtensionDirective(extension, sh::EBhDisable) + shader)) | |
| { | |
| FAIL() << "Shader compilation with extension disable directive succeeded, expecting " | |
| "failure:\n" | |
| << mInfoLog; | |
| } | |
| if (!compile(versionDirective + getExtensionDirective(extension, sh::EBhEnable) + shader)) | |
| { | |
| FAIL() | |
| << "Shader compilation with extension enable directive failed, expecting success:\n" | |
| << mInfoLog; | |
| } | |
| if (!compile(versionDirective + getExtensionDirective(extension, sh::EBhWarn) + shader)) | |
| { | |
| FAIL() | |
| << "Shader compilation with extension warn directive failed, expecting success:\n" | |
| << mInfoLog; | |
| } | |
| else if (!hasWarning()) | |
| { | |
| FAIL() << "Expected compilation to succeed with warning, but warning not present:\n" | |
| << mInfoLog; | |
| } | |
| } | |
| private: | |
| std::string getExtensionDirective(const std::string &extension, sh::TBehavior behavior) | |
| { | |
| std::string extensionDirective("#extension "); | |
| extensionDirective += extension + " : "; | |
| switch (behavior) | |
| { | |
| case EBhRequire: | |
| extensionDirective += "require"; | |
| break; | |
| case EBhEnable: | |
| extensionDirective += "enable"; | |
| break; | |
| case EBhWarn: | |
| extensionDirective += "warn"; | |
| break; | |
| case EBhDisable: | |
| extensionDirective += "disable"; | |
| break; | |
| default: | |
| break; | |
| } | |
| extensionDirective += "\n"; | |
| return extensionDirective; | |
| } | |
| }; | |
| class OESEGLImageExternalExtensionTest : public FragmentShaderExtensionDirectiveTest | |
| { | |
| public: | |
| OESEGLImageExternalExtensionTest() {} | |
| protected: | |
| void initResources(ShBuiltInResources *resources) override | |
| { | |
| resources->OES_EGL_image_external = 1; | |
| } | |
| }; | |
| // OES_EGL_image_external needs to be enabled in GLSL to be able to use samplerExternalOES. | |
| TEST_F(OESEGLImageExternalExtensionTest, SamplerExternalOESUsageNeedsExtensionDirective) | |
| { | |
| const std::string &shaderString = | |
| R"( | |
| precision mediump float; | |
| uniform samplerExternalOES s; | |
| void main() | |
| {})"; | |
| testCompileNeedsExtensionDirective(shaderString, "GL_OES_EGL_image_external"); | |
| } | |
| class NVEGLStreamConsumerExternalExtensionTest : public FragmentShaderExtensionDirectiveTest | |
| { | |
| public: | |
| NVEGLStreamConsumerExternalExtensionTest() {} | |
| protected: | |
| void initResources(ShBuiltInResources *resources) override | |
| { | |
| resources->NV_EGL_stream_consumer_external = 1; | |
| } | |
| }; | |
| // NV_EGL_stream_consumer_external needs to be enabled in GLSL to be able to use samplerExternalOES. | |
| TEST_F(NVEGLStreamConsumerExternalExtensionTest, SamplerExternalOESUsageNeedsExtensionDirective) | |
| { | |
| const std::string &shaderString = | |
| R"( | |
| precision mediump float; | |
| uniform samplerExternalOES s; | |
| void main() | |
| {})"; | |
| testCompileNeedsExtensionDirective(shaderString, "GL_NV_EGL_stream_consumer_external"); | |
| } | |
| class EXTYUVTargetExtensionTest : public FragmentShaderExtensionDirectiveTest | |
| { | |
| public: | |
| EXTYUVTargetExtensionTest() {} | |
| protected: | |
| void initResources(ShBuiltInResources *resources) override { resources->EXT_YUV_target = 1; } | |
| }; | |
| // GL_EXT_YUV_target needs to be enabled in GLSL to be able to use samplerExternal2DY2YEXT. | |
| TEST_F(EXTYUVTargetExtensionTest, SamplerExternal2DY2YEXTUsageNeedsExtensionDirective) | |
| { | |
| const std::string &shaderString = | |
| R"( | |
| precision mediump float; | |
| uniform __samplerExternal2DY2YEXT s; | |
| void main() | |
| {})"; | |
| testCompileNeedsExtensionDirective(shaderString, "GL_EXT_YUV_target", "#version 300 es\n"); | |
| } | |
| // GL_EXT_YUV_target needs to be enabled in GLSL to be able to use samplerExternal2DY2YEXT. | |
| TEST_F(EXTYUVTargetExtensionTest, YUVLayoutNeedsExtensionDirective) | |
| { | |
| const std::string &shaderString = | |
| R"( | |
| precision mediump float; | |
| layout(yuv) out vec4 color; | |
| void main() | |
| {})"; | |
| testCompileNeedsExtensionDirective(shaderString, "GL_EXT_YUV_target", "#version 300 es\n"); | |
| } |