Path: blob/main_old/src/tests/gl_tests/CopyCompressedTextureTest.cpp
1693 views
//1// Copyright 2016 The ANGLE Project Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file.4//56// CopyCompressedTextureTest.cpp: Tests of the GL_CHROMIUM_copy_compressed_texture extension78#include "test_utils/ANGLETest.h"910namespace angle11{1213class CopyCompressedTextureTest : public ANGLETest14{15protected:16CopyCompressedTextureTest()17{18setWindowWidth(256);19setWindowHeight(256);20setConfigRedBits(8);21setConfigGreenBits(8);22setConfigBlueBits(8);23setConfigAlphaBits(8);24}2526void testSetUp() override27{28glGenTextures(2, mTextures);2930constexpr char kVS[] =31"attribute vec2 a_position;\n"32"varying vec2 v_texcoord;\n"33"void main()\n"34"{\n"35" gl_Position = vec4(a_position, 0.0, 1.0);\n"36" v_texcoord = (a_position + 1.0) * 0.5;\n"37"}\n";3839constexpr char kFS[] =40"precision mediump float;\n"41"uniform sampler2D u_texture;\n"42"varying vec2 v_texcoord;\n"43"void main()\n"44"{\n"45" gl_FragColor = texture2D(u_texture, v_texcoord);\n"46"}\n";4748mProgram = CompileProgram(kVS, kFS);49ASSERT_NE(0u, mProgram);50}5152void testTearDown() override53{54glDeleteTextures(2, mTextures);55glDeleteProgram(mProgram);56}5758bool checkExtensions() const59{60if (!IsGLExtensionEnabled("GL_CHROMIUM_copy_compressed_texture"))61{62std::cout63<< "Test skipped because GL_CHROMIUM_copy_compressed_texture is not available."64<< std::endl;65return false;66}6768EXPECT_NE(nullptr, glCompressedCopyTextureCHROMIUM);69if (glCompressedCopyTextureCHROMIUM == nullptr)70{71return false;72}7374return true;75}7677GLuint mProgram = 0;78GLuint mTextures[2] = {0, 0};79};8081namespace82{8384const GLColor &CompressedImageColor = GLColor::red;8586// Single compressed ATC block of source pixels all set to:87// CompressedImageColor.88const uint8_t CompressedImageATC[8] = {0x0, 0x7c, 0x0, 0xf8, 0x55, 0x55, 0x55, 0x55};8990// Single compressed ATCIA block of source pixels all set to:91// CompressedImageColor.92const uint8_t CompressedImageATCIA[16] = {0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,930x0, 0x7c, 0x0, 0xf8, 0x55, 0x55, 0x55, 0x55};9495// Single compressed DXT1 block of source pixels all set to:96// CompressedImageColor.97const uint8_t CompressedImageDXT1[8] = {0x00, 0xf8, 0x00, 0xf8, 0xaa, 0xaa, 0xaa, 0xaa};9899// Single compressed DXT5 block of source pixels all set to:100// CompressedImageColor.101const uint8_t CompressedImageDXT5[16] = {0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,1020x0, 0xf8, 0x0, 0xf8, 0xaa, 0xaa, 0xaa, 0xaa};103104// Single compressed DXT1 block of source pixels all set to:105// CompressedImageColor.106const uint8_t CompressedImageETC1[8] = {0x0, 0x0, 0xf8, 0x2, 0xff, 0xff, 0x0, 0x0};107108} // anonymous namespace109110// Test to ensure that the basic functionality of the extension works.111TEST_P(CopyCompressedTextureTest, Basic)112{113ANGLE_SKIP_TEST_IF(!checkExtensions());114115ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));116117glBindTexture(GL_TEXTURE_2D, mTextures[0]);118glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);119glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);120glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);121glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);122glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4, 0,123sizeof(CompressedImageDXT1), CompressedImageDXT1);124ASSERT_GL_NO_ERROR();125126glBindTexture(GL_TEXTURE_2D, mTextures[1]);127glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);128glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);129glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);130glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);131glCompressedCopyTextureCHROMIUM(mTextures[0], mTextures[1]);132ASSERT_GL_NO_ERROR();133134// Load texture.135glActiveTexture(GL_TEXTURE0);136glBindTexture(GL_TEXTURE_2D, mTextures[1]);137GLint textureLoc = glGetUniformLocation(mProgram, "u_texture");138glUseProgram(mProgram);139glUniform1i(textureLoc, 0);140141// Draw.142drawQuad(mProgram, "a_position", 0.5f);143144EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, CompressedImageColor);145ASSERT_GL_NO_ERROR();146}147148// Test validation of compressed formats149TEST_P(CopyCompressedTextureTest, InternalFormat)150{151if (!checkExtensions())152{153return;154}155156struct Data157{158GLint format;159const uint8_t *data;160GLsizei dataSize;161162Data() : Data(GL_NONE, nullptr, 0) {}163Data(GLint format, const uint8_t *data, GLsizei dataSize)164: format(format), data(data), dataSize(dataSize)165{}166};167std::vector<Data> supportedFormats;168169if (IsGLExtensionEnabled("GL_AMD_compressed_ATC_texture"))170{171supportedFormats.push_back(172Data(GL_ATC_RGB_AMD, CompressedImageATC, sizeof(CompressedImageATC)));173supportedFormats.push_back(Data(GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD, CompressedImageATCIA,174sizeof(CompressedImageATCIA)));175}176if (IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"))177{178supportedFormats.push_back(Data(GL_COMPRESSED_RGB_S3TC_DXT1_EXT, CompressedImageDXT1,179sizeof(CompressedImageDXT1)));180}181if (IsGLExtensionEnabled("GL_ANGLE_texture_compression_dxt5"))182{183supportedFormats.push_back(Data(GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, CompressedImageDXT5,184sizeof(CompressedImageDXT5)));185}186if (IsGLExtensionEnabled("GL_OES_compressed_ETC1_RGB8_texture"))187{188supportedFormats.push_back(189Data(GL_ETC1_RGB8_OES, CompressedImageETC1, sizeof(CompressedImageETC1)));190}191192for (const auto &supportedFormat : supportedFormats)193{194glBindTexture(GL_TEXTURE_2D, mTextures[0]);195glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);196glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);197glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);198glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);199glCompressedTexImage2D(GL_TEXTURE_2D, 0, supportedFormat.format, 4, 4, 0,200supportedFormat.dataSize, supportedFormat.data);201ASSERT_GL_NO_ERROR();202203glBindTexture(GL_TEXTURE_2D, mTextures[1]);204glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);205glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);206glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);207glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);208glCompressedCopyTextureCHROMIUM(mTextures[0], mTextures[1]);209ASSERT_GL_NO_ERROR();210}211}212213// Test that uncompressed textures generate errors when copying214TEST_P(CopyCompressedTextureTest, InternalFormatNotSupported)215{216if (!checkExtensions())217{218return;219}220221glBindTexture(GL_TEXTURE_2D, mTextures[0]);222glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);223glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);224glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);225glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);226glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);227ASSERT_GL_NO_ERROR();228229glBindTexture(GL_TEXTURE_2D, mTextures[1]);230glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);231glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);232glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);233glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);234ASSERT_GL_NO_ERROR();235236// Check that the GL_RGBA format reports an error.237glCompressedCopyTextureCHROMIUM(mTextures[0], mTextures[1]);238EXPECT_GL_ERROR(GL_INVALID_OPERATION);239}240241// Test validation of texture IDs242TEST_P(CopyCompressedTextureTest, InvalidTextureIds)243{244if (!checkExtensions())245{246return;247}248249ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));250251glBindTexture(GL_TEXTURE_2D, mTextures[0]);252glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);253glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);254glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);255glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);256glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4, 0,257sizeof(CompressedImageDXT1), CompressedImageDXT1);258ASSERT_GL_NO_ERROR();259260glBindTexture(GL_TEXTURE_2D, mTextures[1]);261glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);262glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);263glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);264glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);265ASSERT_GL_NO_ERROR();266267glCompressedCopyTextureCHROMIUM(mTextures[0], 99993);268EXPECT_GL_ERROR(GL_INVALID_VALUE);269270glCompressedCopyTextureCHROMIUM(99994, mTextures[1]);271EXPECT_GL_ERROR(GL_INVALID_VALUE);272273glCompressedCopyTextureCHROMIUM(99995, 99996);274EXPECT_GL_ERROR(GL_INVALID_VALUE);275276glCompressedCopyTextureCHROMIUM(mTextures[0], mTextures[1]);277EXPECT_GL_NO_ERROR();278}279280// Test that only 2D textures are valid281TEST_P(CopyCompressedTextureTest, BindingPoints)282{283if (!checkExtensions())284{285return;286}287288ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));289290glBindTexture(GL_TEXTURE_CUBE_MAP, mTextures[0]);291glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);292glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);293glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);294glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);295for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;296face++)297{298glCompressedTexImage2D(face, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4, 0,299sizeof(CompressedImageDXT1), CompressedImageDXT1);300}301ASSERT_GL_NO_ERROR();302303glBindTexture(GL_TEXTURE_CUBE_MAP, mTextures[1]);304glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);305glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);306glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);307glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);308ASSERT_GL_NO_ERROR();309310glCompressedCopyTextureCHROMIUM(mTextures[0], mTextures[1]);311EXPECT_GL_ERROR(GL_INVALID_VALUE);312}313314// Test the destination texture cannot be immutable315TEST_P(CopyCompressedTextureTest, Immutable)316{317if (!checkExtensions() || getClientMajorVersion() < 3)318{319return;320}321322ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));323324glBindTexture(GL_TEXTURE_2D, mTextures[0]);325glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);326glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);327glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);328glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);329glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4, 0,330sizeof(CompressedImageDXT1), CompressedImageDXT1);331ASSERT_GL_NO_ERROR();332333glBindTexture(GL_TEXTURE_2D, mTextures[1]);334glTexStorage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4);335glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);336glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);337glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);338glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);339ASSERT_GL_NO_ERROR();340341glCompressedCopyTextureCHROMIUM(mTextures[0], mTextures[1]);342EXPECT_GL_ERROR(GL_INVALID_OPERATION);343}344345// Use this to select which configurations (e.g. which renderer, which GLES major version) these346// tests should be run against.347ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(CopyCompressedTextureTest);348349} // namespace angle350351352