// // Copyright 2016 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. // // SamplerMultisample_test.cpp: // Tests compiling shaders that use gsampler2DMS types // #include "GLSLANG/ShaderLang.h" #include "angle_gl.h" #include "gtest/gtest.h" #include "tests/test_utils/ShaderCompileTreeTest.h" using namespace sh; class SamplerMultisampleTest : public ShaderCompileTreeTest { public: SamplerMultisampleTest() {} protected: ::GLenum getShaderType() const override { return GL_FRAGMENT_SHADER; } ShShaderSpec getShaderSpec() const override { return SH_GLES3_1_SPEC; } }; class SamplerMultisampleArrayTest : public ShaderCompileTreeTest { public: SamplerMultisampleArrayTest() {} void initResources(ShBuiltInResources *resources) override { resources->OES_texture_storage_multisample_2d_array = 1; } protected: ::GLenum getShaderType() const override { return GL_FRAGMENT_SHADER; } ShShaderSpec getShaderSpec() const override { return SH_GLES3_1_SPEC; } }; // Checks whether compiler has parsed the gsampler2DMS, texelfetch correctly. TEST_F(SamplerMultisampleTest, TexelFetchSampler2DMS) { constexpr char kShaderString[] = R"(#version 310 es precision highp float; uniform highp sampler2DMS s; uniform highp isampler2DMS is; uniform highp usampler2DMS us; void main() { vec4 tex1 = texelFetch(s, ivec2(0, 0), 0); ivec4 tex2 = texelFetch(is, ivec2(0, 0), 0); uvec4 tex3 = texelFetch(us, ivec2(0, 0), 0); })"; if (!compile(kShaderString)) { FAIL() << "Shader compilation failed, expecting success:\n" << mInfoLog; } } // Checks whether compiler has parsed the gsampler2DMS, textureSize correctly. TEST_F(SamplerMultisampleTest, TextureSizeSampler2DMS) { constexpr char kShaderString[] = R"(#version 310 es precision highp float; uniform highp sampler2DMS s; uniform highp isampler2DMS is; uniform highp usampler2DMS us; void main() { ivec2 size = textureSize(s); size = textureSize(is); size = textureSize(us); })"; if (!compile(kShaderString)) { FAIL() << "Shader compilation failed, expecting success:\n" << mInfoLog; } } // Check that sampler2DMS has no default precision. TEST_F(SamplerMultisampleTest, NoPrecisionSampler2DMS) { constexpr char kShaderString[] = R"(#version 310 es precision highp float; uniform sampler2DMS s; void main() {})"; if (compile(kShaderString)) { FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog; } } // Check that isampler2DMS has no default precision. TEST_F(SamplerMultisampleTest, NoPrecisionISampler2DMS) { constexpr char kShaderString[] = R"(#version 310 es precision highp float; uniform isampler2DMS s; void main() {})"; if (compile(kShaderString)) { FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog; } } // Check that usampler2DMS has no default precision. TEST_F(SamplerMultisampleTest, NoPrecisionUSampler2DMS) { constexpr char kShaderString[] = R"(#version 310 es precision highp float; uniform usampler2DMS s; void main() {})"; if (compile(kShaderString)) { FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog; } } // Negative test: checks that sampler2DMS is not usable in ESSL 3.00. TEST_F(SamplerMultisampleTest, Sampler2DMSESSL300) { constexpr char kShaderString[] = R"(#version 300 es precision highp float; uniform highp sampler2DMS s; void main() { })"; if (compile(kShaderString)) { FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog; } } // Negative test: checks that isampler2DMS is not usable in ESSL 3.00. TEST_F(SamplerMultisampleTest, ISampler2DMSESSL300) { constexpr char kShaderString[] = R"(#version 300 es precision highp float; uniform highp isampler2DMS s; void main() { })"; if (compile(kShaderString)) { FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog; } } // Negative test: checks that usampler2DMS is not usable in ESSL 3.00. TEST_F(SamplerMultisampleTest, USampler2DMSESSL300) { constexpr char kShaderString[] = R"(#version 300 es precision highp float; uniform highp usampler2DMS s; void main() { })"; if (compile(kShaderString)) { FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog; } } // Negative test: checks that sampler2DMSArray is not usable in ESSL 3.10 without extensions. TEST_F(SamplerMultisampleTest, Sampler2DMSArrayNotSupported) { constexpr char kShaderString[] = R"(#version 310 es precision highp float; uniform highp sampler2DMSArray s; void main() { })"; if (compile(kShaderString)) { FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog; } } // Negative test: checks that isampler2DMSArray is not usable in ESSL 3.10 without extensions. TEST_F(SamplerMultisampleTest, ISampler2DMSArrayNotSupported) { constexpr char kShaderString[] = R"(#version 310 es precision highp float; uniform highp isampler2DMSArray s; void main() { })"; if (compile(kShaderString)) { FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog; } } // Negative test: checks that usampler2DMSArray is not usable in ESSL 3.10 without extensions. TEST_F(SamplerMultisampleTest, USampler2DMSArrayNotSupported) { constexpr char kShaderString[] = R"(#version 310 es precision highp float; uniform highp usampler2DMSArray s; void main() { })"; if (compile(kShaderString)) { FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog; } } // Checks whether compiler has parsed the gsampler2DMSArray, texelfetch correctly. TEST_F(SamplerMultisampleArrayTest, TexelFetchSampler2DMSArray) { constexpr char kShaderString[] = R"(#version 310 es #extension GL_OES_texture_storage_multisample_2d_array : require precision highp float; uniform highp sampler2DMSArray s; uniform highp isampler2DMSArray is; uniform highp usampler2DMSArray us; void main() { vec4 tex1 = texelFetch(s, ivec3(0, 0, 0), 0); ivec4 tex2 = texelFetch(is, ivec3(0, 0, 0), 0); uvec4 tex3 = texelFetch(us, ivec3(0, 0, 0), 0); })"; if (!compile(kShaderString)) { FAIL() << "Shader compilation failed, expecting success:\n" << mInfoLog; } } // Checks whether compiler has parsed the gsampler2DMSArray, textureSize correctly. TEST_F(SamplerMultisampleArrayTest, TextureSizeSampler2DMSArray) { constexpr char kShaderString[] = R"(#version 310 es #extension GL_OES_texture_storage_multisample_2d_array : require precision highp float; uniform highp sampler2DMSArray s; uniform highp isampler2DMSArray is; uniform highp usampler2DMSArray us; void main() { ivec3 size = textureSize(s); size = textureSize(is); size = textureSize(us); })"; if (!compile(kShaderString)) { FAIL() << "Shader compilation failed, expecting success:\n" << mInfoLog; } } // Check that sampler2DMSArray has no default precision. TEST_F(SamplerMultisampleArrayTest, NoPrecisionSampler2DMSArray) { constexpr char kShaderString[] = R"(#version 310 es #extension GL_OES_texture_storage_multisample_2d_array : require precision highp float; uniform sampler2DMSArray s; void main() {})"; if (compile(kShaderString)) { FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog; } } // Check that isampler2DMSArray has no default precision. TEST_F(SamplerMultisampleArrayTest, NoPrecisionISampler2DMSArray) { constexpr char kShaderString[] = R"(#version 310 es #extension GL_OES_texture_storage_multisample_2d_array : require precision highp float; uniform isampler2DMSArray s; void main() {})"; if (compile(kShaderString)) { FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog; } } // Check that usampler2DMSArray has no default precision. TEST_F(SamplerMultisampleArrayTest, NoPrecisionUSampler2DMSArray) { constexpr char kShaderString[] = R"(#version 310 es #extension GL_OES_texture_storage_multisample_2d_array : require precision highp float; uniform usampler2DMSArray s; void main() {})"; if (compile(kShaderString)) { FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog; } } class SamplerMultisampleEXTTest : public SamplerMultisampleTest { public: SamplerMultisampleEXTTest() {} protected: void initResources(ShBuiltInResources *resources) override { resources->ANGLE_texture_multisample = 1; } ::GLenum getShaderType() const override { return GL_FRAGMENT_SHADER; } ShShaderSpec getShaderSpec() const override { return SH_GLES3_SPEC; } }; // checks ANGLE_texture_multisample is supported in es 3.0 TEST_F(SamplerMultisampleEXTTest, TextureMultisampleEXTEnabled) { constexpr char kShaderString[] = R"(#version 300 es #extension GL_ANGLE_texture_multisample : require precision highp float; uniform highp sampler2DMS s; uniform highp isampler2DMS is; uniform highp usampler2DMS us; void main() { ivec2 size = textureSize(s); size = textureSize(is); size = textureSize(us); vec4 tex1 = texelFetch(s, ivec2(0, 0), 0); ivec4 tex2 = texelFetch(is, ivec2(0, 0), 0); uvec4 tex3 = texelFetch(us, ivec2(0, 0), 0); })"; if (!compile(kShaderString)) { FAIL() << "Shader compilation failure, expecting success:\n" << mInfoLog; } } // checks that multisample texture is not supported without ANGLE_texture_multisample in es 3.0 TEST_F(SamplerMultisampleEXTTest, TextureMultisampleEXTDisabled) { constexpr char kShaderString[] = R"(#version 300 es precision highp float; uniform highp sampler2DMS s; uniform highp isampler2DMS is; uniform highp usampler2DMS us; void main() { ivec2 size = textureSize(s); size = textureSize(is); size = textureSize(us); vec4 tex1 = texelFetch(s, ivec2(0, 0), 0); ivec4 tex2 = texelFetch(is, ivec2(0, 0), 0); uvec4 tex3 = texelFetch(us, ivec2(0, 0), 0); })"; if (compile(kShaderString)) { FAIL() << "Shader compilation success, expecting failure:\n" << mInfoLog; } }