xref: /aosp_15_r20/external/angle/src/tests/gl_tests/MemorySizeTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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