blob: 056ebe560b4f5a908687f305d07ec175d08635e8 [file] [log] [blame]
//
// 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 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