// // Copyright 2024 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. // // TextureFixedRateCompressionTest: Tests for GL_EXT_texture_storage_compression #include "test_utils/ANGLETest.h" #include "test_utils/gl_raii.h" namespace angle { static constexpr GLint kDefaultAttribList[3][3] = { {GL_NONE, GL_NONE, GL_NONE}, {GL_SURFACE_COMPRESSION_EXT, GL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT, GL_NONE}, {GL_SURFACE_COMPRESSION_EXT, GL_SURFACE_COMPRESSION_FIXED_RATE_DEFAULT_EXT, GL_NONE}, }; class TextureFixedRateCompressionTest : public ANGLETest<> { protected: void invalidTestHelper(const GLint *attribs); void basicTestHelper(const GLint *attribs); }; void TextureFixedRateCompressionTest::invalidTestHelper(const GLint *attribs) { GLTexture tex; glBindTexture(GL_TEXTURE_2D, tex); ASSERT_GL_NO_ERROR(); glTexStorageAttribs2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8, 16, 16, attribs); ASSERT_GL_NO_ERROR(); /* Query compression rate */ GLint compressRate = GL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT; glGetTexParameteriv(GL_TEXTURE_2D, GL_SURFACE_COMPRESSION_EXT, &compressRate); ASSERT_GL_NO_ERROR(); glBindImageTexture(0, tex, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA8); if (nullptr == attribs) { /* Default attrib which is non-compressed formats will return GL_NO_ERROR. */ ASSERT_GL_NO_ERROR(); } else if (compressRate == GL_SURFACE_COMPRESSION_FIXED_RATE_DEFAULT_EXT || (compressRate >= GL_SURFACE_COMPRESSION_FIXED_RATE_1BPC_EXT && compressRate <= GL_SURFACE_COMPRESSION_FIXED_RATE_12BPC_EXT)) { /* Compressed texture is not supported in glBindImageTexture. */ ASSERT_GL_ERROR(GL_INVALID_VALUE); } else if (attribs[1] == GL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT || attribs[0] == GL_NONE) { /* Default attrib which is non-compressed formats will return GL_NO_ERROR. */ ASSERT_GL_NO_ERROR(); } } void TextureFixedRateCompressionTest::basicTestHelper(const GLint *attribs) { GLTexture texture; glBindTexture(GL_TEXTURE_2D, texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); ASSERT_GL_NO_ERROR(); glTexStorageAttribs2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8, 16, 16, attribs); ASSERT_GL_NO_ERROR(); /* Query and check the compression rate */ GLint compressRate; glGetTexParameteriv(GL_TEXTURE_2D, GL_SURFACE_COMPRESSION_EXT, &compressRate); ASSERT_GL_NO_ERROR(); if (nullptr != attribs && compressRate != GL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT && attribs[1] != GL_SURFACE_COMPRESSION_FIXED_RATE_DEFAULT_EXT) { EXPECT_EQ(compressRate, attribs[1]); } GLFramebuffer fbo; glBindFramebuffer(GL_FRAMEBUFFER, fbo); ASSERT_GL_NO_ERROR(); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); ASSERT_GL_NO_ERROR(); ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER); ANGLE_GL_PROGRAM(drawRed, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red()); drawQuad(drawRed, essl1_shaders::PositionAttrib(), 0); EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::red); ASSERT_GL_NO_ERROR(); } // Invalid attrib list, GL_INVALID_VALUE is generated. TEST_P(TextureFixedRateCompressionTest, Invalidate) { ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_storage_compression")); constexpr GLint kAttribListInvalid[3] = {GL_SURFACE_COMPRESSION_EXT, GL_SURFACE_COMPRESSION_EXT, GL_NONE}; GLTexture texture; glBindTexture(GL_TEXTURE_2D, texture); ASSERT_GL_NO_ERROR(); glTexStorageAttribs2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8, 16, 16, kAttribListInvalid); ASSERT_GL_ERROR(GL_INVALID_VALUE); for (const GLint *attribs : kDefaultAttribList) { invalidTestHelper(attribs); } invalidTestHelper(nullptr); } // Test basic usage of glTexStorageAttribs2DEXT TEST_P(TextureFixedRateCompressionTest, TexStorageAttribs2DEXT) { ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_storage_compression")); for (const GLint *attribs : kDefaultAttribList) { basicTestHelper(attribs); } } // Use this to select which configurations (e.g. which renderer, which GLES major version) these // tests should be run against. ANGLE_INSTANTIATE_TEST_ES31_AND(TextureFixedRateCompressionTest); } // namespace angle