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

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 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(kETC2));
        EXPECT_FALSE(EnsureGLExtensionEnabled(kASTCLDR));
        EXPECT_FALSE(EnsureGLExtensionEnabled(kASTCHDR));
        EXPECT_FALSE(EnsureGLExtensionEnabled(kPVRTC1));
    }
    else if (IsMetal())
    {
        if (IsOSX())
        {
            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 (IsApple())
            {
                // M1 or newer
                EXPECT_TRUE(EnsureGLExtensionEnabled(kETC1));
                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(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 (IsOSX())
        {
            // 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(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));
        }
        else
        {
            EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1));
        }
    }
}

ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(WebGLCompressedTextureAvailabilityTest);

}  // namespace
