| // |
| // Copyright 2018 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. |
| // |
| |
| // MemorySizeTest.cpp : Tests of the GL_ANGLE_memory_size extension. |
| |
| #include "test_utils/ANGLETest.h" |
| |
| #include "test_utils/gl_raii.h" |
| |
| namespace angle |
| { |
| |
| class MemorySizeTest : public ANGLETest |
| { |
| protected: |
| MemorySizeTest() |
| { |
| setWindowWidth(128); |
| setWindowHeight(128); |
| setConfigRedBits(8); |
| setConfigGreenBits(8); |
| setConfigBlueBits(8); |
| setConfigAlphaBits(8); |
| } |
| }; |
| |
| // GL_ANGLE_memory_size is implemented in the front-end and should always be exposed. |
| TEST_P(MemorySizeTest, ExtensionStringExposed) |
| { |
| EXPECT_TRUE(EnsureGLExtensionEnabled("GL_ANGLE_memory_size")); |
| } |
| |
| // Test basic queries of textures |
| TEST_P(MemorySizeTest, BasicUsageTexture) |
| { |
| ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_memory_size")); |
| |
| GLTexture texture; |
| glBindTexture(GL_TEXTURE_2D, texture); |
| |
| GLint result; |
| glGetTexParameteriv(GL_TEXTURE_2D, GL_MEMORY_SIZE_ANGLE, &result); |
| EXPECT_GL_NO_ERROR(); |
| EXPECT_EQ(0, result); |
| |
| glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); |
| glGetTexParameteriv(GL_TEXTURE_2D, GL_MEMORY_SIZE_ANGLE, &result); |
| EXPECT_GL_NO_ERROR(); |
| EXPECT_GT(result, 0); |
| |
| if (getClientMajorVersion() > 3) |
| { |
| glGetTexLevelParameteriv(GL_TEXTURE_2D, 1, GL_MEMORY_SIZE_ANGLE, &result); |
| EXPECT_GL_NO_ERROR(); |
| EXPECT_EQ(0, result); |
| |
| glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_MEMORY_SIZE_ANGLE, &result); |
| EXPECT_GL_NO_ERROR(); |
| EXPECT_GT(result, 0); |
| } |
| } |
| |
| // Test basic queries of buffers |
| TEST_P(MemorySizeTest, BasicUsageBuffer) |
| { |
| ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_memory_size")); |
| |
| GLBuffer buffer; |
| glBindBuffer(GL_ARRAY_BUFFER, buffer); |
| |
| GLint result; |
| glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_MEMORY_SIZE_ANGLE, &result); |
| EXPECT_GL_NO_ERROR(); |
| EXPECT_EQ(0, result); |
| |
| if (getClientMajorVersion() > 3) |
| { |
| GLint64 result64; |
| glGetBufferParameteri64v(GL_ARRAY_BUFFER, GL_MEMORY_SIZE_ANGLE, &result64); |
| EXPECT_GL_NO_ERROR(); |
| EXPECT_EQ(0, result64); |
| } |
| |
| constexpr GLsizeiptr kBufSize = 16; |
| std::array<uint8_t, kBufSize> buf; |
| glBufferData(GL_ARRAY_BUFFER, kBufSize, buf.data(), GL_STATIC_DRAW); |
| glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_MEMORY_SIZE_ANGLE, &result); |
| EXPECT_GL_NO_ERROR(); |
| |
| // This value may have to be reset to 1 if some backend delays allocations or compresses |
| // buffers. |
| constexpr GLint kExpectedMinBufMemorySize = 15; |
| |
| EXPECT_GT(result, kExpectedMinBufMemorySize); |
| |
| if (getClientMajorVersion() > 3) |
| { |
| GLint64 result64; |
| glGetBufferParameteri64v(GL_ARRAY_BUFFER, GL_MEMORY_SIZE_ANGLE, &result64); |
| EXPECT_GL_NO_ERROR(); |
| EXPECT_GT(result64, static_cast<GLint64>(kExpectedMinBufMemorySize)); |
| } |
| |
| // No way to easily test the GLint64 to GLint64 clamping behaviour of glGetBufferParameteriv |
| // without allocating a buffer >2gb. |
| } |
| |
| // Test basic queries of renderbuffers |
| TEST_P(MemorySizeTest, BasicUsageRenderbuffer) |
| { |
| ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_memory_size")); |
| |
| GLRenderbuffer renderbuffer; |
| glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer); |
| |
| GLint result; |
| glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_MEMORY_SIZE_ANGLE, &result); |
| EXPECT_GL_NO_ERROR(); |
| EXPECT_EQ(0, result); |
| |
| glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, 4, 4); |
| glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_MEMORY_SIZE_ANGLE, &result); |
| EXPECT_GL_NO_ERROR(); |
| EXPECT_GT(result, 0); |
| } |
| |
| // No errors specific to GL_ANGLE_memory_size to test for. |
| |
| // 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(MemorySizeTest); |
| } // namespace angle |