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