xref: /aosp_15_r20/frameworks/native/libs/gui/DebugEGLImageTracker.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright 2019 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #include <android-base/properties.h>
18*38e8c45fSAndroid Build Coastguard Worker #include <android-base/stringprintf.h>
19*38e8c45fSAndroid Build Coastguard Worker #include <gui/DebugEGLImageTracker.h>
20*38e8c45fSAndroid Build Coastguard Worker 
21*38e8c45fSAndroid Build Coastguard Worker #include <cinttypes>
22*38e8c45fSAndroid Build Coastguard Worker #include <unordered_map>
23*38e8c45fSAndroid Build Coastguard Worker 
24*38e8c45fSAndroid Build Coastguard Worker using android::base::GetBoolProperty;
25*38e8c45fSAndroid Build Coastguard Worker using android::base::StringAppendF;
26*38e8c45fSAndroid Build Coastguard Worker 
27*38e8c45fSAndroid Build Coastguard Worker std::mutex DebugEGLImageTracker::mInstanceLock;
28*38e8c45fSAndroid Build Coastguard Worker std::atomic<DebugEGLImageTracker *> DebugEGLImageTracker::mInstance;
29*38e8c45fSAndroid Build Coastguard Worker 
30*38e8c45fSAndroid Build Coastguard Worker class DebugEGLImageTrackerNoOp : public DebugEGLImageTracker {
31*38e8c45fSAndroid Build Coastguard Worker public:
32*38e8c45fSAndroid Build Coastguard Worker     DebugEGLImageTrackerNoOp() = default;
33*38e8c45fSAndroid Build Coastguard Worker     ~DebugEGLImageTrackerNoOp() override = default;
create(const char *)34*38e8c45fSAndroid Build Coastguard Worker     void create(const char * /*from*/) override {}
destroy(const char *)35*38e8c45fSAndroid Build Coastguard Worker     void destroy(const char * /*from*/) override {}
36*38e8c45fSAndroid Build Coastguard Worker 
dump(std::string &)37*38e8c45fSAndroid Build Coastguard Worker     void dump(std::string & /*result*/) override {}
38*38e8c45fSAndroid Build Coastguard Worker };
39*38e8c45fSAndroid Build Coastguard Worker 
40*38e8c45fSAndroid Build Coastguard Worker class DebugEGLImageTrackerImpl : public DebugEGLImageTracker {
41*38e8c45fSAndroid Build Coastguard Worker public:
42*38e8c45fSAndroid Build Coastguard Worker     DebugEGLImageTrackerImpl() = default;
43*38e8c45fSAndroid Build Coastguard Worker     ~DebugEGLImageTrackerImpl() override = default;
44*38e8c45fSAndroid Build Coastguard Worker     void create(const char * /*from*/) override;
45*38e8c45fSAndroid Build Coastguard Worker     void destroy(const char * /*from*/) override;
46*38e8c45fSAndroid Build Coastguard Worker 
47*38e8c45fSAndroid Build Coastguard Worker     void dump(std::string & /*result*/) override;
48*38e8c45fSAndroid Build Coastguard Worker 
49*38e8c45fSAndroid Build Coastguard Worker private:
50*38e8c45fSAndroid Build Coastguard Worker     std::mutex mLock;
51*38e8c45fSAndroid Build Coastguard Worker     std::unordered_map<std::string, int64_t> mCreateTracker;
52*38e8c45fSAndroid Build Coastguard Worker     std::unordered_map<std::string, int64_t> mDestroyTracker;
53*38e8c45fSAndroid Build Coastguard Worker 
54*38e8c45fSAndroid Build Coastguard Worker     int64_t mTotalCreated = 0;
55*38e8c45fSAndroid Build Coastguard Worker     int64_t mTotalDestroyed = 0;
56*38e8c45fSAndroid Build Coastguard Worker };
57*38e8c45fSAndroid Build Coastguard Worker 
getInstance()58*38e8c45fSAndroid Build Coastguard Worker DebugEGLImageTracker *DebugEGLImageTracker::getInstance() {
59*38e8c45fSAndroid Build Coastguard Worker     std::lock_guard lock(mInstanceLock);
60*38e8c45fSAndroid Build Coastguard Worker     if (mInstance == nullptr) {
61*38e8c45fSAndroid Build Coastguard Worker         const bool enabled = GetBoolProperty("debug.sf.enable_egl_image_tracker", false);
62*38e8c45fSAndroid Build Coastguard Worker         if (enabled) {
63*38e8c45fSAndroid Build Coastguard Worker             mInstance = new DebugEGLImageTrackerImpl();
64*38e8c45fSAndroid Build Coastguard Worker         } else {
65*38e8c45fSAndroid Build Coastguard Worker             mInstance = new DebugEGLImageTrackerNoOp();
66*38e8c45fSAndroid Build Coastguard Worker         }
67*38e8c45fSAndroid Build Coastguard Worker     }
68*38e8c45fSAndroid Build Coastguard Worker 
69*38e8c45fSAndroid Build Coastguard Worker     return mInstance;
70*38e8c45fSAndroid Build Coastguard Worker }
71*38e8c45fSAndroid Build Coastguard Worker 
create(const char * from)72*38e8c45fSAndroid Build Coastguard Worker void DebugEGLImageTrackerImpl::create(const char *from) {
73*38e8c45fSAndroid Build Coastguard Worker     std::lock_guard lock(mLock);
74*38e8c45fSAndroid Build Coastguard Worker     mCreateTracker[from]++;
75*38e8c45fSAndroid Build Coastguard Worker     mTotalCreated++;
76*38e8c45fSAndroid Build Coastguard Worker }
77*38e8c45fSAndroid Build Coastguard Worker 
destroy(const char * from)78*38e8c45fSAndroid Build Coastguard Worker void DebugEGLImageTrackerImpl::destroy(const char *from) {
79*38e8c45fSAndroid Build Coastguard Worker     std::lock_guard lock(mLock);
80*38e8c45fSAndroid Build Coastguard Worker     mDestroyTracker[from]++;
81*38e8c45fSAndroid Build Coastguard Worker     mTotalDestroyed++;
82*38e8c45fSAndroid Build Coastguard Worker }
83*38e8c45fSAndroid Build Coastguard Worker 
dump(std::string & result)84*38e8c45fSAndroid Build Coastguard Worker void DebugEGLImageTrackerImpl::dump(std::string &result) {
85*38e8c45fSAndroid Build Coastguard Worker     std::lock_guard lock(mLock);
86*38e8c45fSAndroid Build Coastguard Worker     StringAppendF(&result, "Live EGL Image objects: %" PRIi64 "\n",
87*38e8c45fSAndroid Build Coastguard Worker                   mTotalCreated - mTotalDestroyed);
88*38e8c45fSAndroid Build Coastguard Worker     StringAppendF(&result, "Total EGL Image created: %" PRIi64 "\n", mTotalCreated);
89*38e8c45fSAndroid Build Coastguard Worker     for (const auto &[from, count] : mCreateTracker) {
90*38e8c45fSAndroid Build Coastguard Worker         StringAppendF(&result, "\t%s: %" PRIi64 "\n", from.c_str(), count);
91*38e8c45fSAndroid Build Coastguard Worker     }
92*38e8c45fSAndroid Build Coastguard Worker     StringAppendF(&result, "Total EGL Image destroyed: %" PRIi64 "\n", mTotalDestroyed);
93*38e8c45fSAndroid Build Coastguard Worker     for (const auto &[from, count] : mDestroyTracker) {
94*38e8c45fSAndroid Build Coastguard Worker         StringAppendF(&result, "\t%s: %" PRIi64 "\n", from.c_str(), count);
95*38e8c45fSAndroid Build Coastguard Worker     }
96*38e8c45fSAndroid Build Coastguard Worker }
97