blob: 472bbfd19fbc07b3fddeb7b212e291e2a1c57968 [file] [log] [blame]
//
// 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;
}
}