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

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

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