// // Copyright 2015 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. // #include "test_utils/ANGLETest.h" #include "test_utils/gl_raii.h" usingnamespaceangle; namespace { void TexImageCubeMapFaces(GLint level, GLenum internalformat, GLsizei width, GLenum format, GLenum type, void *pixels) { … } class BaseMipmapTest : public ANGLETest<> { … }; } // namespace class MipmapTest : public BaseMipmapTest { … }; class MipmapTestES3 : public BaseMipmapTest { … }; class MipmapTestES31 : public BaseMipmapTest { … }; // Test generating mipmaps with base level and max level set. Ported from part of the // conformance2/textures/misc/tex-mipmap-levels WebGL2 test. TEST_P(MipmapTestES3, GenerateMipmapPartialLevels) { … } // This test generates mipmaps for a 1x1 texture, which should be a no-op. TEST_P(MipmapTestES3, GenerateMipmap1x1Texture) { … } // This test generates mipmaps for a large texture and ensures all mips are generated. TEST_P(MipmapTestES3, GenerateMipmapLargeTexture) { … } // This test generates mipmaps for a large npot texture and ensures all mips are generated. TEST_P(MipmapTestES3, GenerateMipmapLargeNPOTTexture) { … } // This test generates mipmaps for an elongated npot texture with the maximum number of mips and // ensures all mips are generated. TEST_P(MipmapTestES3, GenerateMipmapLongNPOTTexture) { … } // This test generates (and uses) mipmaps on a texture using init data. D3D11 will use a // non-renderable TextureStorage for this. The test then disables mips, renders to level zero of the // texture, and reenables mips before using the texture again. To do this, D3D11 has to convert the // TextureStorage into a renderable one. This test ensures that the conversion works correctly. In // particular, on D3D11 Feature Level 9_3 it ensures that both the zero LOD workaround texture AND // the 'normal' texture are copied during conversion. TEST_P(MipmapTest, GenerateMipmapFromInitDataThenRender) { … } // Test that generating mipmap after the image is already created for a single level works. TEST_P(MipmapTest, GenerateMipmapAfterSingleLevelDraw) { … } // Test that generating mipmaps, then modifying the base level and generating mipmaps again works. TEST_P(MipmapTest, GenerateMipmapAfterModifyingBaseLevel) { … } // This test ensures that mips are correctly generated from a rendered image. // In particular, on D3D11 Feature Level 9_3, the clear call will be performed on the zero-level // texture, rather than the mipped one. The test ensures that the zero-level texture is correctly // copied into the mipped texture before the mipmaps are generated. TEST_P(MipmapTest, GenerateMipmapFromRenderedImage) { … } // Test to ensure that rendering to a mipmapped texture works, regardless of whether mipmaps are // enabled or not. // TODO: This test hits a texture rebind bug in the D3D11 renderer. Fix this. TEST_P(MipmapTest, RenderOntoLevelZeroAfterGenerateMipmap) { … } // This test defines a valid mipchain manually, with an extra level that's unused on the first few // draws. Later on, it redefines the whole mipchain but this time, uses the last mip that was // already uploaded before. The test expects that mip to be usable. TEST_P(MipmapTest, DefineValidExtraLevelAndUseItLater) { … } // Regression test for a bug that cause mipmaps to only generate using the top left corner as input. TEST_P(MipmapTest, MipMapGenerationD3D9Bug) { … } // This test ensures that the level-zero workaround for TextureCubes (on D3D11 Feature Level 9_3) // works as expected. It tests enabling/disabling mipmaps, generating mipmaps, and rendering to // level zero. TEST_P(MipmapTest, TextureCubeGeneralLevelZero) { … } // This test ensures that rendering to level-zero of a TextureCube works as expected. TEST_P(MipmapTest, TextureCubeRenderToLevelZero) { … } // Creates a mipmapped 3D texture with two layers, and calls ANGLE's GenerateMipmap. // Then tests if the mipmaps are rendered correctly for all two layers. // This is the same as MipmapTestES3.MipmapsForTexture3D but for GL_OES_texture_3D extension on // GLES 2.0 instead. TEST_P(MipmapTest, MipmapsForTexture3DOES) { … } // This test verifies 3D texture mipmap generation uses box filter on Metal back-end. class Mipmap3DBoxFilterTest : public MipmapTest { … }; TEST_P(Mipmap3DBoxFilterTest, GenMipmapsForTexture3DOES) { … } // Test that non-power of two texture also has mipmap generated using box filter TEST_P(Mipmap3DBoxFilterTest, GenMipmapsForTexture3DOESNpot) { … } // Creates a mipmapped 2D array texture with three layers, and calls ANGLE's GenerateMipmap. // Then tests if the mipmaps are rendered correctly for all three layers. TEST_P(MipmapTestES3, MipmapsForTextureArray) { … } // Create a mipmapped 2D array texture with more layers than width / height, and call // GenerateMipmap. TEST_P(MipmapTestES3, MipmapForDeepTextureArray) { … } // Creates a mipmapped 3D texture with two layers, and calls ANGLE's GenerateMipmap. // Then tests if the mipmaps are rendered correctly for all two layers. TEST_P(MipmapTestES3, MipmapsForTexture3D) { … } // Create a 2D array, then immediately redefine it to have fewer layers. Regression test for a bug // in the Vulkan backend where the old higher-layer-count data upload was not removed. TEST_P(MipmapTestES3, TextureArrayRedefineThenGenerateMipmap) { … } // Create a 2D array, use it, then redefine it to have fewer layers. Regression test for a bug in // the Vulkan backend where the old higher-layer-count data upload was not removed. TEST_P(MipmapTestES3, TextureArrayUseThenRedefineThenGenerateMipmap) { … } // Create a 2D texture with levels 0-2, call GenerateMipmap with base level 1 so that level 0 stays // the same, and then sample levels 0 and 2. // GLES 3.0.4 section 3.8.10: // "Mipmap generation replaces texel array levels levelbase + 1 through q with arrays derived from // the levelbase array, regardless of their previous contents. All other mipmap arrays, including // the levelbase array, are left unchanged by this computation." TEST_P(MipmapTestES3, GenerateMipmapBaseLevel) { … } // Test that generating mipmaps doesn't discard updates staged to out-of-range mips. TEST_P(MipmapTestES3, GenerateMipmapPreservesOutOfRangeMips) { … } // Create a cube map with levels 0-2, call GenerateMipmap with base level 1 so that level 0 stays // the same, and then sample levels 0 and 2. // GLES 3.0.4 section 3.8.10: // "Mipmap generation replaces texel array levels levelbase + 1 through q with arrays derived from // the levelbase array, regardless of their previous contents. All other mipmap arrays, including // the levelbase array, are left unchanged by this computation." TEST_P(MipmapTestES3, GenerateMipmapCubeBaseLevel) { … } // Create a texture with levels 0-2, call GenerateMipmap with max level 1 so that level 2 stays the // same, and then sample levels 1 and 2. // GLES 3.0.4 section 3.8.10: // "Mipmap generation replaces texel array levels levelbase + 1 through q with arrays derived from // the levelbase array, regardless of their previous contents. All other mipmap arrays, including // the levelbase array, are left unchanged by this computation." TEST_P(MipmapTestES3, GenerateMipmapMaxLevel) { … } // Call GenerateMipmap with out-of-range base level. The spec is interpreted so that an out-of-range // base level does not have a color-renderable/texture-filterable internal format, so the // GenerateMipmap call generates INVALID_OPERATION. GLES 3.0.4 section 3.8.10: // "If the levelbase array was not specified with an unsized internal format from table 3.3 or a // sized internal format that is both color-renderable and texture-filterable according to table // 3.13, an INVALID_OPERATION error is generated." TEST_P(MipmapTestES3, GenerateMipmapBaseLevelOutOfRange) { … } // Call GenerateMipmap with out-of-range base level on an immutable texture. The base level should // be clamped, so the call doesn't generate an error. TEST_P(MipmapTestES3, GenerateMipmapBaseLevelOutOfRangeImmutableTexture) { … } // A native version of the WebGL2 test tex-base-level-bug.html TEST_P(MipmapTestES3, BaseLevelTextureBug) { … } TEST_P(MipmapTestES31, MipmapWithMemoryBarrier) { … } // Tests respecifying 3D mipmaps. TEST_P(MipmapTestES3, Generate3DMipmapRespecification) { … } // Test the calling glGenerateMipmap on a texture with a zero dimension doesn't crash. TEST_P(MipmapTestES3, GenerateMipmapZeroSize) { … } // Test that reducing the size of the mipchain by resizing the base image then deleting it doesn't // cause a crash. Issue found by fuzzer. TEST_P(MipmapTestES3, ResizeBaseMipTo1x1ThenDelete) { … } // Test the calling generateMipmap with redefining texture and modifying baselevel. TEST_P(MipmapTestES3, GenerateMipmapWithRedefineLevelAndTexture) { … } // Test that manually generating mipmaps using draw calls is functional TEST_P(MipmapTestES31, GenerateMipmapWithDraw) { … } // Test that manually generating lower mipmaps using draw calls is functional TEST_P(MipmapTestES31, GenerateLowerMipsWithDraw) { … } // Use this to select which configurations (e.g. which renderer, which GLES major version) these // tests should be run against. ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(…); extraPlatforms // namespace extraPlatforms GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(…); ANGLE_INSTANTIATE_TEST_ES3(…); GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(…); ANGLE_INSTANTIATE_TEST_ES31(…);