1 //
2 // Copyright 2018 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6
7 // MemorySizeTest.cpp : Tests of the GL_ANGLE_memory_size extension.
8
9 #include "test_utils/ANGLETest.h"
10
11 #include "test_utils/gl_raii.h"
12
13 namespace angle
14 {
15
16 class MemorySizeTest : public ANGLETest<>
17 {
18 protected:
MemorySizeTest()19 MemorySizeTest()
20 {
21 setWindowWidth(128);
22 setWindowHeight(128);
23 setConfigRedBits(8);
24 setConfigGreenBits(8);
25 setConfigBlueBits(8);
26 setConfigAlphaBits(8);
27 }
28 };
29
30 // GL_ANGLE_memory_size is implemented in the front-end and should always be exposed.
TEST_P(MemorySizeTest,ExtensionStringExposed)31 TEST_P(MemorySizeTest, ExtensionStringExposed)
32 {
33 EXPECT_TRUE(EnsureGLExtensionEnabled("GL_ANGLE_memory_size"));
34 }
35
36 // Test basic queries of textures
TEST_P(MemorySizeTest,BasicUsageTexture)37 TEST_P(MemorySizeTest, BasicUsageTexture)
38 {
39 ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_memory_size"));
40
41 GLTexture texture;
42 glBindTexture(GL_TEXTURE_2D, texture);
43
44 GLint result;
45 glGetTexParameteriv(GL_TEXTURE_2D, GL_MEMORY_SIZE_ANGLE, &result);
46 EXPECT_GL_NO_ERROR();
47 EXPECT_EQ(0, result);
48
49 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
50 glGetTexParameteriv(GL_TEXTURE_2D, GL_MEMORY_SIZE_ANGLE, &result);
51 EXPECT_GL_NO_ERROR();
52 EXPECT_GT(result, 0);
53
54 if (getClientMajorVersion() > 3 ||
55 (getClientMajorVersion() == 3 && getClientMinorVersion() >= 1))
56 {
57 glGetTexLevelParameteriv(GL_TEXTURE_2D, 1, GL_MEMORY_SIZE_ANGLE, &result);
58 EXPECT_GL_NO_ERROR();
59 EXPECT_EQ(0, result);
60
61 glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_MEMORY_SIZE_ANGLE, &result);
62 EXPECT_GL_NO_ERROR();
63 EXPECT_GT(result, 0);
64 }
65 }
66
67 // Test basic queries of buffers
TEST_P(MemorySizeTest,BasicUsageBuffer)68 TEST_P(MemorySizeTest, BasicUsageBuffer)
69 {
70 ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_memory_size"));
71
72 GLBuffer buffer;
73 glBindBuffer(GL_ARRAY_BUFFER, buffer);
74
75 GLint result;
76 glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_MEMORY_SIZE_ANGLE, &result);
77 EXPECT_GL_NO_ERROR();
78 EXPECT_EQ(0, result);
79
80 if (getClientMajorVersion() > 3 ||
81 (getClientMajorVersion() == 3 && getClientMinorVersion() >= 1))
82 {
83 GLint64 result64;
84 glGetBufferParameteri64v(GL_ARRAY_BUFFER, GL_MEMORY_SIZE_ANGLE, &result64);
85 EXPECT_GL_NO_ERROR();
86 EXPECT_EQ(0, result64);
87 }
88
89 constexpr GLsizeiptr kBufSize = 16;
90 std::array<uint8_t, kBufSize> buf;
91 glBufferData(GL_ARRAY_BUFFER, kBufSize, buf.data(), GL_STATIC_DRAW);
92 glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_MEMORY_SIZE_ANGLE, &result);
93 EXPECT_GL_NO_ERROR();
94
95 // This value may have to be reset to 1 if some backend delays allocations or compresses
96 // buffers.
97 constexpr GLint kExpectedMinBufMemorySize = 15;
98
99 EXPECT_GT(result, kExpectedMinBufMemorySize);
100
101 if (getClientMajorVersion() > 3 ||
102 (getClientMajorVersion() == 3 && getClientMinorVersion() >= 1))
103 {
104 GLint64 result64;
105 glGetBufferParameteri64v(GL_ARRAY_BUFFER, GL_MEMORY_SIZE_ANGLE, &result64);
106 EXPECT_GL_NO_ERROR();
107 EXPECT_GT(result64, static_cast<GLint64>(kExpectedMinBufMemorySize));
108 }
109
110 // No way to easily test the GLint64 to GLint64 clamping behaviour of glGetBufferParameteriv
111 // without allocating a buffer >2gb.
112 }
113
114 // Test basic queries of renderbuffers
TEST_P(MemorySizeTest,BasicUsageRenderbuffer)115 TEST_P(MemorySizeTest, BasicUsageRenderbuffer)
116 {
117 ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_memory_size"));
118
119 GLRenderbuffer renderbuffer;
120 glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
121
122 GLint result;
123 glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_MEMORY_SIZE_ANGLE, &result);
124 EXPECT_GL_NO_ERROR();
125 EXPECT_EQ(0, result);
126
127 glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, 4, 4);
128 glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_MEMORY_SIZE_ANGLE, &result);
129 EXPECT_GL_NO_ERROR();
130 EXPECT_GT(result, 0);
131 }
132
133 // No errors specific to GL_ANGLE_memory_size to test for.
134
135 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
136 // tests should be run against.
137 ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(MemorySizeTest);
138 } // namespace angle
139