//
// Copyright 2021 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.
//
// WebGLCompressedTextureAvailabilityTest:
//   Compressed formats must be enabled on platforms that always support them.
//   Compressed formats must be disabled on platforms that never support them.
//

#include "test_utils/ANGLETest.h"

using namespace angle;

namespace
{

class WebGLCompressedTextureAvailabilityTest : public ANGLETest<>
{
  public:
    WebGLCompressedTextureAvailabilityTest()
    {
        setWebGLCompatibilityEnabled(true);
        setExtensionsEnabled(false);
    }
};

const char kDXT1[]     = "GL_EXT_texture_compression_dxt1";
const char kDXT3[]     = "GL_ANGLE_texture_compression_dxt3";
const char kDXT5[]     = "GL_ANGLE_texture_compression_dxt5";
const char kS3TCSRGB[] = "GL_EXT_texture_compression_s3tc_srgb";
const char kRGTC[]     = "GL_EXT_texture_compression_rgtc";
const char kBPTC[]     = "GL_EXT_texture_compression_bptc";

const char kETC1[]    = "GL_OES_compressed_ETC1_RGB8_texture";
const char kETC1Sub[] = "GL_EXT_compressed_ETC1_RGB8_sub_texture";  // Not exposed to WebGL apps
const char kETC2[]    = "GL_ANGLE_compressed_texture_etc";

const char kASTCLDR[] = "GL_KHR_texture_compression_astc_ldr";
const char kASTCHDR[] = "GL_KHR_texture_compression_astc_hdr";

const char kPVRTC1[] = "GL_IMG_texture_compression_pvrtc";

// Test compressed formats availability
TEST_P(WebGLCompressedTextureAvailabilityTest, Test)
{
    if (IsD3D())
    {
        EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT1));
        EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT3));
        EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT5));
        EXPECT_TRUE(EnsureGLExtensionEnabled(kS3TCSRGB));

        if (IsD3D9())
        {
            EXPECT_FALSE(EnsureGLExtensionEnabled(kRGTC));
            EXPECT_FALSE(EnsureGLExtensionEnabled(kBPTC));
        }
        else
        {
            EXPECT_TRUE(EnsureGLExtensionEnabled(kRGTC));
        }

        EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1));
        EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1Sub));
        EXPECT_FALSE(EnsureGLExtensionEnabled(kETC2));
        EXPECT_FALSE(EnsureGLExtensionEnabled(kASTCLDR));
        EXPECT_FALSE(EnsureGLExtensionEnabled(kASTCHDR));
        EXPECT_FALSE(EnsureGLExtensionEnabled(kPVRTC1));
    }
    else if (IsMetal())
    {
        if (IsMac())
        {
            EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT1));
            EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT3));
            EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT5));
            EXPECT_TRUE(EnsureGLExtensionEnabled(kS3TCSRGB));
            EXPECT_TRUE(EnsureGLExtensionEnabled(kRGTC));
            EXPECT_TRUE(EnsureGLExtensionEnabled(kBPTC));

            if (IsAppleGPU())
            {
                // M1 or newer
                EXPECT_TRUE(EnsureGLExtensionEnabled(kETC1));
                EXPECT_TRUE(EnsureGLExtensionEnabled(kETC1Sub));
                EXPECT_TRUE(EnsureGLExtensionEnabled(kETC2));
                EXPECT_TRUE(EnsureGLExtensionEnabled(kASTCLDR));
                EXPECT_TRUE(EnsureGLExtensionEnabled(kASTCHDR));
                EXPECT_TRUE(EnsureGLExtensionEnabled(kPVRTC1));
            }
            else
            {
                // macOS with non-Apple GPU
                EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1));
                EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1Sub));
                EXPECT_FALSE(EnsureGLExtensionEnabled(kETC2));
                EXPECT_FALSE(EnsureGLExtensionEnabled(kASTCLDR));
                EXPECT_FALSE(EnsureGLExtensionEnabled(kASTCHDR));
                EXPECT_FALSE(EnsureGLExtensionEnabled(kPVRTC1));
            }
        }
        else
        {
            // Need proper Catalyst detection to assert formats here.
        }
    }
    else if (IsDesktopOpenGL())
    {
        if (IsMac())
        {
            // OpenGL version is fixed to 4.1 on macOS, so the supported formats are the same on all
            // devices.
            EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT1));
            EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT3));
            EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT5));
            EXPECT_TRUE(EnsureGLExtensionEnabled(kS3TCSRGB));
            EXPECT_TRUE(EnsureGLExtensionEnabled(kRGTC));

            EXPECT_FALSE(EnsureGLExtensionEnabled(kBPTC));

            EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1));
            EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1Sub));
            EXPECT_FALSE(EnsureGLExtensionEnabled(kETC2));
            EXPECT_FALSE(EnsureGLExtensionEnabled(kASTCLDR));
            EXPECT_FALSE(EnsureGLExtensionEnabled(kASTCHDR));
            EXPECT_FALSE(EnsureGLExtensionEnabled(kPVRTC1));
        }
    }
}

// Regression test for emulated ETC1 being exposed to WebGL contexts.
//
// Relies on the fact that ETC1 is a strict subset of ETC2 and the ANGLE-specific ETC2 extension
// string is exposed only when the hardware support is available. Hardware support for ETC1
// without ETC2 exists only on native OpenGL ES.
//
// Note that non-WebGL contexts are allowed to expose emulated ETC1.
// https://crbug.com/1048244
TEST_P(WebGLCompressedTextureAvailabilityTest, EmulatedEtc1Test)
{
    if (!IsOpenGLES())
    {
        if (EnsureGLExtensionEnabled(kETC2))
        {
            EXPECT_TRUE(EnsureGLExtensionEnabled(kETC1));
            EXPECT_TRUE(EnsureGLExtensionEnabled(kETC1Sub));
        }
        else
        {
            EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1));
            EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1Sub));
        }
    }
}

ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(WebGLCompressedTextureAvailabilityTest);

}  // namespace
