Skip to content

Commit 6bb1bc9

Browse files
kakashidinhoAngle LUCI CQ
authored and
Angle LUCI CQ
committed
Add an extension to report total memory usage of all GL objects
Currently the extension will only count GL buffers, textures and render buffers' memory. Fixed: angleproject:383256300 Change-Id: I33ce6fafae8aa5b60071e66366d35dc098e1313b Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6084013 Auto-Submit: Quyen Le <[email protected]> Reviewed-by: Shahbaz Youssefi <[email protected]> Commit-Queue: Quyen Le <[email protected]>
1 parent a137d70 commit 6bb1bc9

21 files changed

+284
-14
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
Name
2+
3+
ANGLE_memory_usage_report
4+
5+
Name Strings
6+
7+
EGL_ANGLE_memory_usage_report
8+
9+
Contact
10+
11+
Le Hoang Quyen, Google (lehoangquyen 'at' google.com)
12+
13+
Status
14+
15+
Draft.
16+
17+
Version
18+
19+
Version 1, 2024-12-10
20+
21+
Number
22+
23+
???
24+
25+
Dependencies
26+
27+
The extension is written against the EGL 1.3 Specification, although it
28+
should work on other versions of these specifications.
29+
30+
Overview
31+
32+
This extension provides a function that reports memory allocated for live
33+
GL objects. The memory usage only accounts for buffers, textures and renderbuffers.
34+
35+
Issues
36+
37+
None.
38+
39+
IP Status
40+
41+
No known issues.
42+
43+
New Procedures and Functions
44+
45+
None
46+
47+
New Tokens
48+
Accepted by the <attribute> parameter of eglQueryContext
49+
50+
EGL_CONTEXT_MEMORY_USAGE_ANGLE 0x3462
51+
52+
Additions to the EGL 1.3 Specification
53+
54+
If <attribute>=EGL_CONTEXT_MEMORY_USAGE_ANGLE is passed to eglQueryContext, then the
55+
<value> pointer is expected to point to an array of 2 32-bit values. Upon a successful
56+
return, value[0] and value[1] will contain the low and high 32-bit parts of a 64-bit
57+
value. This 64-bit value is the estimated memory usage of all live GL objects belonging
58+
to the given context's shared group.
59+
60+
New Implementation Dependent State
61+
62+
None
63+
64+
Revision History
65+
66+
Version 1, 2024-12-10 (Le Hoang Quyen)
67+
- Initial draft

include/EGL/eglext_angle.h

+5
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,11 @@ EGLAPI void EGLAPIENTRY eglSetValidationEnabledANGLE(EGLBoolean validationState)
444444
#endif
445445
#endif /* EGL_ANGLE_no_error */
446446

447+
#ifndef EGL_ANGLE_memory_usage_report
448+
#define EGL_ANGLE_memory_usage_report 1
449+
#define EGL_CONTEXT_MEMORY_USAGE_ANGLE 0x3462
450+
#endif /* EGL_ANGLE_memory_usage_report */
451+
447452
// clang-format on
448453

449454
#endif // INCLUDE_EGL_EGLEXT_ANGLE_

scripts/code_generation_hashes/Extension_files.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"doc/ExtensionSupport.md":
33
"9fedcc1a67af79d93c2da1105c9bada6",
44
"scripts/egl_angle_ext.xml":
5-
"b3bef068d5c832d52adf78047a22b467",
5+
"0a03416ded6719c24d8198f58f8ad0c6",
66
"scripts/extension_data/intel_630_linux.json":
77
"3b86832de6a7095f4617e273cba6d45e",
88
"scripts/extension_data/intel_630_win10.json":
@@ -22,7 +22,7 @@
2222
"scripts/gl_angle_ext.xml":
2323
"ef111314bcf6e8c9cdc1a391080f1d80",
2424
"scripts/registry_xml.py":
25-
"d5aa8e863f9ba75df0ee589cfb05189a",
25+
"0a4a8297242bf7c000e7349cf6934822",
2626
"src/libANGLE/gen_extensions.py":
2727
"6ea1cb1733c4df98b527bbf2752e118b",
2828
"src/libANGLE/gles_extensions_autogen.cpp":

scripts/code_generation_hashes/GL_EGL_WGL_loader.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
{
22
"scripts/egl_angle_ext.xml":
3-
"b3bef068d5c832d52adf78047a22b467",
3+
"0a03416ded6719c24d8198f58f8ad0c6",
44
"scripts/generate_loader.py":
55
"93c78a8d11323fa311fed5118fbcf083",
66
"scripts/gl_angle_ext.xml":
77
"ef111314bcf6e8c9cdc1a391080f1d80",
88
"scripts/registry_xml.py":
9-
"d5aa8e863f9ba75df0ee589cfb05189a",
9+
"0a4a8297242bf7c000e7349cf6934822",
1010
"src/libEGL/egl_loader_autogen.cpp":
1111
"0c060b5fa8c375813a28a0ed6be191ae",
1212
"src/libEGL/egl_loader_autogen.h":

scripts/code_generation_hashes/GL_EGL_entry_points.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"scripts/egl_angle_ext.xml":
3-
"b3bef068d5c832d52adf78047a22b467",
3+
"0a03416ded6719c24d8198f58f8ad0c6",
44
"scripts/entry_point_packed_egl_enums.json":
55
"a72ae855c6b403912103b519139951a1",
66
"scripts/entry_point_packed_gl_enums.json":
@@ -10,7 +10,7 @@
1010
"scripts/gl_angle_ext.xml":
1111
"ef111314bcf6e8c9cdc1a391080f1d80",
1212
"scripts/registry_xml.py":
13-
"d5aa8e863f9ba75df0ee589cfb05189a",
13+
"0a4a8297242bf7c000e7349cf6934822",
1414
"src/common/entry_points_enum_autogen.cpp":
1515
"fdf900943a9f51164bd1134d14e0ecb0",
1616
"src/common/entry_points_enum_autogen.h":

scripts/code_generation_hashes/GLenum_value_to_string_map.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"scripts/gl_angle_ext.xml":
55
"ef111314bcf6e8c9cdc1a391080f1d80",
66
"scripts/registry_xml.py":
7-
"d5aa8e863f9ba75df0ee589cfb05189a",
7+
"0a4a8297242bf7c000e7349cf6934822",
88
"src/common/gl_enum_utils_autogen.cpp":
99
"109224915eb4122569c2fc644e2228e1",
1010
"src/common/gl_enum_utils_autogen.h":

scripts/code_generation_hashes/interpreter_utils.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
{
22
"scripts/egl_angle_ext.xml":
3-
"b3bef068d5c832d52adf78047a22b467",
3+
"0a03416ded6719c24d8198f58f8ad0c6",
44
"scripts/gen_interpreter_utils.py":
55
"10ba16ee78604763fc883525dd275de8",
66
"scripts/gl_angle_ext.xml":
77
"ef111314bcf6e8c9cdc1a391080f1d80",
88
"scripts/registry_xml.py":
9-
"d5aa8e863f9ba75df0ee589cfb05189a",
9+
"0a4a8297242bf7c000e7349cf6934822",
1010
"third_party/EGL-Registry/src/api/egl.xml":
1111
"2056d54ea07156f1988ca1366bdee21a",
1212
"third_party/OpenCL-Docs/src/xml/cl.xml":

scripts/code_generation_hashes/proc_table.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
{
22
"scripts/egl_angle_ext.xml":
3-
"b3bef068d5c832d52adf78047a22b467",
3+
"0a03416ded6719c24d8198f58f8ad0c6",
44
"scripts/gen_proc_table.py":
55
"240b4a4f4c9e9592c712cfbbdc6d4d35",
66
"scripts/gl_angle_ext.xml":
77
"ef111314bcf6e8c9cdc1a391080f1d80",
88
"scripts/registry_xml.py":
9-
"d5aa8e863f9ba75df0ee589cfb05189a",
9+
"0a4a8297242bf7c000e7349cf6934822",
1010
"src/libGLESv2/proc_table_cl_autogen.cpp":
1111
"ed003b0f041aaaa35b67d3fe07e61f91",
1212
"src/libGLESv2/proc_table_egl_autogen.cpp":

scripts/egl_angle_ext.xml

+5
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,11 @@
529529
<command name="eglSetValidationEnabledANGLE"/>
530530
</require>
531531
</extension>
532+
<extension name="EGL_ANGLE_memory_usage_report" supported="egl">
533+
<require>
534+
<enum name="EGL_CONTEXT_MEMORY_USAGE_ANGLE"/>
535+
</require>
536+
</extension>
532537
</extensions>
533538

534539
<!-- SECTION: EGL enumerant (token) definitions. -->

scripts/registry_xml.py

+1
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,7 @@ def check_sorted(name, l):
346346
"EGL_ANGLE_external_context_and_surface",
347347
"EGL_ANGLE_feature_control",
348348
"EGL_ANGLE_ggp_stream_descriptor",
349+
"EGL_ANGLE_memory_usage_report",
349350
"EGL_ANGLE_metal_create_context_ownership_identity",
350351
"EGL_ANGLE_metal_shared_event_sync",
351352
"EGL_ANGLE_no_error",

src/libANGLE/Caps.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -1397,6 +1397,7 @@ std::vector<std::string> DisplayExtensions::getStrings() const
13971397
InsertExtensionString("EGL_KHR_partial_update", partialUpdateKHR, &extensionStrings);
13981398
InsertExtensionString("EGL_ANGLE_metal_shared_event_sync", mtlSyncSharedEventANGLE, &extensionStrings);
13991399
InsertExtensionString("EGL_ANGLE_global_fence_sync", globalFenceSyncANGLE, &extensionStrings);
1400+
InsertExtensionString("EGL_ANGLE_memory_usage_report", memoryUsageReportANGLE, &extensionStrings);
14001401
// clang-format on
14011402

14021403
return extensionStrings;

src/libANGLE/Caps.h

+3
Original file line numberDiff line numberDiff line change
@@ -710,6 +710,9 @@ struct DisplayExtensions
710710

711711
// EGL_ANGLE_global_fence_sync
712712
bool globalFenceSyncANGLE = false;
713+
714+
// EGL_ANGLE_memory_usage_report
715+
bool memoryUsageReportANGLE = false;
713716
};
714717

715718
struct DeviceExtensions

src/libANGLE/Context.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -10097,6 +10097,17 @@ void Context::texStorageAttribs3D(GLenum target,
1009710097
texture->setStorageAttribs(this, textype, levels, internalFormat, size, attribList));
1009810098
}
1009910099

10100+
size_t Context::getMemoryUsage() const
10101+
{
10102+
size_t memoryUsage = 0;
10103+
10104+
memoryUsage += mState.mBufferManager->getTotalMemorySize();
10105+
memoryUsage += mState.mRenderbufferManager->getTotalMemorySize();
10106+
memoryUsage += mState.mTextureManager->getTotalMemorySize();
10107+
10108+
return memoryUsage;
10109+
}
10110+
1010010111
// ErrorSet implementation.
1010110112
ErrorSet::ErrorSet(Debug *debug,
1010210113
const angle::FrontendFeatures &frontendFeatures,

src/libANGLE/Context.h

+2
Original file line numberDiff line numberDiff line change
@@ -827,6 +827,8 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
827827

828828
bool areBlobCacheFuncsSet() const;
829829

830+
size_t getMemoryUsage() const;
831+
830832
private:
831833
void initializeDefaultResources();
832834
void releaseSharedObjects();

src/libANGLE/Display.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -2264,6 +2264,9 @@ void Display::initDisplayExtensions()
22642264
// All backends support specific context versions
22652265
mDisplayExtensions.createContextBackwardsCompatible = true;
22662266

2267+
// EGL_ANGLE_memory_usage_report is implemented on front end.
2268+
mDisplayExtensions.memoryUsageReportANGLE = true;
2269+
22672270
mDisplayExtensionString = GenerateExtensionsString(mDisplayExtensions);
22682271
}
22692272

src/libANGLE/ResourceManager.cpp

+16
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,22 @@ void TextureManager::enableHandleAllocatorLogging()
268268
mHandleAllocator.enableLogging(true);
269269
}
270270

271+
size_t TextureManager::getTotalMemorySize() const
272+
{
273+
size_t totalBytes = 0;
274+
275+
for (const auto &texture : UnsafeResourceMapIter(mObjectMap))
276+
{
277+
if (texture.second->getBoundSurface() || texture.second->isEGLImageTarget())
278+
{
279+
// Skip external texture
280+
continue;
281+
}
282+
totalBytes += static_cast<size_t>(texture.second->getMemorySize());
283+
}
284+
return totalBytes;
285+
}
286+
271287
// RenderbufferManager Implementation.
272288

273289
RenderbufferManager::~RenderbufferManager() = default;

src/libANGLE/ResourceManager.h

+24-3
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,25 @@ class TypedResourceManager : public ResourceManagerBase
122122
}
123123
};
124124

125-
class BufferManager : public TypedResourceManager<Buffer, BufferManager, BufferID>
125+
template <typename ResourceType, typename ImplT, typename IDType>
126+
class TypedResourceManagerWithTotalMemorySize
127+
: public TypedResourceManager<ResourceType, ImplT, IDType>
128+
{
129+
public:
130+
size_t getTotalMemorySize() const
131+
{
132+
size_t totalBytes = 0;
133+
134+
for (const auto &rb : UnsafeResourceMapIter(this->mObjectMap))
135+
{
136+
totalBytes += static_cast<size_t>(rb.second->getMemorySize());
137+
}
138+
return totalBytes;
139+
}
140+
};
141+
142+
class BufferManager
143+
: public TypedResourceManagerWithTotalMemorySize<Buffer, BufferManager, BufferID>
126144
{
127145
public:
128146
BufferID createBuffer();
@@ -208,12 +226,15 @@ class TextureManager : public TypedResourceManager<Texture, TextureManager, Text
208226

209227
void enableHandleAllocatorLogging();
210228

229+
size_t getTotalMemorySize() const;
230+
211231
protected:
212232
~TextureManager() override;
213233
};
214234

215-
class RenderbufferManager
216-
: public TypedResourceManager<Renderbuffer, RenderbufferManager, RenderbufferID>
235+
class RenderbufferManager : public TypedResourceManagerWithTotalMemorySize<Renderbuffer,
236+
RenderbufferManager,
237+
RenderbufferID>
217238
{
218239
public:
219240
RenderbufferID createRenderbuffer();

src/libANGLE/queryutils.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -4642,6 +4642,13 @@ void QueryContextAttrib(const gl::Context *context, EGLint attribute, EGLint *va
46424642
case EGL_PROTECTED_CONTENT_EXT:
46434643
*value = context->getState().hasProtectedContent();
46444644
break;
4645+
case EGL_CONTEXT_MEMORY_USAGE_ANGLE:
4646+
{
4647+
uint64_t memory = context->getMemoryUsage();
4648+
value[0] = static_cast<GLint>(memory & 0xffffffff);
4649+
value[1] = static_cast<GLint>(memory >> 32);
4650+
}
4651+
break;
46454652
default:
46464653
UNREACHABLE();
46474654
break;

src/libANGLE/validationEGL.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -5776,6 +5776,16 @@ bool ValidateQueryContext(const ValidationContext *val,
57765776
}
57775777
break;
57785778

5779+
case EGL_CONTEXT_MEMORY_USAGE_ANGLE:
5780+
if (!display->getExtensions().memoryUsageReportANGLE)
5781+
{
5782+
val->setError(EGL_BAD_ATTRIBUTE,
5783+
"Attribute EGL_CONTEXT_MEMORY_USAGE_ANGLE requires "
5784+
"EGL_ANGLE_memory_usage_report.");
5785+
return false;
5786+
}
5787+
break;
5788+
57795789
default:
57805790
val->setError(EGL_BAD_ATTRIBUTE, "Invalid context attribute: 0x%04X", attribute);
57815791
return false;

src/tests/angle_end2end_tests.gni

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ angle_end2end_tests_sources = [
1717
"egl_tests/EGLDisplaySelectionTest.cpp",
1818
"egl_tests/EGLDisplayTest.cpp",
1919
"egl_tests/EGLLockSurface3Test.cpp",
20+
"egl_tests/EGLMemoryUsageReportTest.cpp",
2021
"egl_tests/EGLMultiContextTest.cpp",
2122
"egl_tests/EGLNoConfigContextTest.cpp",
2223
"egl_tests/EGLNoErrorTest.cpp",

0 commit comments

Comments
 (0)