blob: 8b01c282cc4c164daca59a8d551203af0e57da18 [file] [log] [blame]
Yiwei Zhang2d4c1882019-02-24 22:28:08 -08001/*
2 * Copyright 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#undef LOG_TAG
17#define LOG_TAG "GpuStats"
18#define ATRACE_TAG ATRACE_TAG_GRAPHICS
19
20#include "GpuStats.h"
21
Yiwei Zhang174a2a02019-05-06 19:08:31 -070022#include <cutils/properties.h>
Yiwei Zhang2d4c1882019-02-24 22:28:08 -080023#include <log/log.h>
24#include <utils/Trace.h>
25
Yiwei Zhang174a2a02019-05-06 19:08:31 -070026#include <unordered_set>
27
Yiwei Zhang2d4c1882019-02-24 22:28:08 -080028namespace android {
29
Yiwei Zhang8e7c4b62019-05-08 15:57:59 -070030static void addLoadingCount(GraphicsEnv::Driver driver, bool isDriverLoaded,
Yiwei Zhangf40fb102019-02-27 21:05:06 -080031 GpuStatsGlobalInfo* const outGlobalInfo) {
Yiwei Zhang2d4c1882019-02-24 22:28:08 -080032 switch (driver) {
33 case GraphicsEnv::Driver::GL:
34 case GraphicsEnv::Driver::GL_UPDATED:
Yiwei Zhangf40fb102019-02-27 21:05:06 -080035 outGlobalInfo->glLoadingCount++;
36 if (!isDriverLoaded) outGlobalInfo->glLoadingFailureCount++;
Yiwei Zhang2d4c1882019-02-24 22:28:08 -080037 break;
38 case GraphicsEnv::Driver::VULKAN:
39 case GraphicsEnv::Driver::VULKAN_UPDATED:
Yiwei Zhangf40fb102019-02-27 21:05:06 -080040 outGlobalInfo->vkLoadingCount++;
41 if (!isDriverLoaded) outGlobalInfo->vkLoadingFailureCount++;
Yiwei Zhang2d4c1882019-02-24 22:28:08 -080042 break;
Yiwei Zhang8e7c4b62019-05-08 15:57:59 -070043 case GraphicsEnv::Driver::ANGLE:
44 outGlobalInfo->angleLoadingCount++;
45 if (!isDriverLoaded) outGlobalInfo->angleLoadingFailureCount++;
46 break;
Yiwei Zhang2d4c1882019-02-24 22:28:08 -080047 default:
Yiwei Zhang8e7c4b62019-05-08 15:57:59 -070048 break;
Yiwei Zhang2d4c1882019-02-24 22:28:08 -080049 }
Yiwei Zhang2d4c1882019-02-24 22:28:08 -080050}
51
52static void addLoadingTime(GraphicsEnv::Driver driver, int64_t driverLoadingTime,
Yiwei Zhangf40fb102019-02-27 21:05:06 -080053 GpuStatsAppInfo* const outAppInfo) {
Yiwei Zhang2d4c1882019-02-24 22:28:08 -080054 switch (driver) {
55 case GraphicsEnv::Driver::GL:
56 case GraphicsEnv::Driver::GL_UPDATED:
Yiwei Zhang8e7c4b62019-05-08 15:57:59 -070057 if (outAppInfo->glDriverLoadingTime.size() < GpuStats::MAX_NUM_LOADING_TIMES) {
58 outAppInfo->glDriverLoadingTime.emplace_back(driverLoadingTime);
59 }
Yiwei Zhang2d4c1882019-02-24 22:28:08 -080060 break;
61 case GraphicsEnv::Driver::VULKAN:
62 case GraphicsEnv::Driver::VULKAN_UPDATED:
Yiwei Zhang8e7c4b62019-05-08 15:57:59 -070063 if (outAppInfo->vkDriverLoadingTime.size() < GpuStats::MAX_NUM_LOADING_TIMES) {
64 outAppInfo->vkDriverLoadingTime.emplace_back(driverLoadingTime);
65 }
66 break;
67 case GraphicsEnv::Driver::ANGLE:
68 if (outAppInfo->angleDriverLoadingTime.size() < GpuStats::MAX_NUM_LOADING_TIMES) {
69 outAppInfo->angleDriverLoadingTime.emplace_back(driverLoadingTime);
70 }
Yiwei Zhang2d4c1882019-02-24 22:28:08 -080071 break;
72 default:
73 break;
74 }
75}
76
77void GpuStats::insert(const std::string& driverPackageName, const std::string& driverVersionName,
78 uint64_t driverVersionCode, int64_t driverBuildTime,
Yiwei Zhang794d2952019-05-06 17:43:59 -070079 const std::string& appPackageName, const int32_t vulkanVersion,
80 GraphicsEnv::Driver driver, bool isDriverLoaded, int64_t driverLoadingTime) {
Yiwei Zhang2d4c1882019-02-24 22:28:08 -080081 ATRACE_CALL();
82
83 std::lock_guard<std::mutex> lock(mLock);
84 ALOGV("Received:\n"
85 "\tdriverPackageName[%s]\n"
86 "\tdriverVersionName[%s]\n"
87 "\tdriverVersionCode[%" PRIu64 "]\n"
88 "\tdriverBuildTime[%" PRId64 "]\n"
89 "\tappPackageName[%s]\n"
Yiwei Zhang794d2952019-05-06 17:43:59 -070090 "\tvulkanVersion[%d]\n"
Yiwei Zhang2d4c1882019-02-24 22:28:08 -080091 "\tdriver[%d]\n"
92 "\tisDriverLoaded[%d]\n"
93 "\tdriverLoadingTime[%" PRId64 "]",
94 driverPackageName.c_str(), driverVersionName.c_str(), driverVersionCode, driverBuildTime,
Yiwei Zhang794d2952019-05-06 17:43:59 -070095 appPackageName.c_str(), vulkanVersion, static_cast<int32_t>(driver), isDriverLoaded,
96 driverLoadingTime);
Yiwei Zhang2d4c1882019-02-24 22:28:08 -080097
98 if (!mGlobalStats.count(driverVersionCode)) {
Yiwei Zhangf40fb102019-02-27 21:05:06 -080099 GpuStatsGlobalInfo globalInfo;
Yiwei Zhang8e7c4b62019-05-08 15:57:59 -0700100 addLoadingCount(driver, isDriverLoaded, &globalInfo);
Yiwei Zhangf40fb102019-02-27 21:05:06 -0800101 globalInfo.driverPackageName = driverPackageName;
102 globalInfo.driverVersionName = driverVersionName;
103 globalInfo.driverVersionCode = driverVersionCode;
104 globalInfo.driverBuildTime = driverBuildTime;
Yiwei Zhang794d2952019-05-06 17:43:59 -0700105 globalInfo.vulkanVersion = vulkanVersion;
Yiwei Zhangf40fb102019-02-27 21:05:06 -0800106 mGlobalStats.insert({driverVersionCode, globalInfo});
Yiwei Zhang8e7c4b62019-05-08 15:57:59 -0700107 } else {
108 addLoadingCount(driver, isDriverLoaded, &mGlobalStats[driverVersionCode]);
Yiwei Zhang2d4c1882019-02-24 22:28:08 -0800109 }
110
111 if (mAppStats.size() >= MAX_NUM_APP_RECORDS) {
Yiwei Zhangf40fb102019-02-27 21:05:06 -0800112 ALOGV("GpuStatsAppInfo has reached maximum size. Ignore new stats.");
Yiwei Zhang2d4c1882019-02-24 22:28:08 -0800113 return;
114 }
115
116 const std::string appStatsKey = appPackageName + std::to_string(driverVersionCode);
117 if (!mAppStats.count(appStatsKey)) {
Yiwei Zhangf40fb102019-02-27 21:05:06 -0800118 GpuStatsAppInfo appInfo;
119 addLoadingTime(driver, driverLoadingTime, &appInfo);
120 appInfo.appPackageName = appPackageName;
121 appInfo.driverVersionCode = driverVersionCode;
122 mAppStats.insert({appStatsKey, appInfo});
Yiwei Zhang2d4c1882019-02-24 22:28:08 -0800123 return;
124 }
125
126 addLoadingTime(driver, driverLoadingTime, &mAppStats[appStatsKey]);
127}
128
Yiwei Zhang174a2a02019-05-06 19:08:31 -0700129void GpuStats::interceptSystemDriverStatsLocked() {
130 // Append cpuVulkanVersion and glesVersion to system driver stats
131 if (!mGlobalStats.count(0) || mGlobalStats[0].glesVersion) {
132 return;
133 }
134
135 mGlobalStats[0].cpuVulkanVersion = property_get_int32("ro.cpuvulkan.version", 0);
136 mGlobalStats[0].glesVersion = property_get_int32("ro.opengles.version", 0);
137}
138
Yiwei Zhang2d4c1882019-02-24 22:28:08 -0800139void GpuStats::dump(const Vector<String16>& args, std::string* result) {
140 ATRACE_CALL();
141
142 if (!result) {
143 ALOGE("Dump result shouldn't be nullptr.");
144 return;
145 }
146
147 std::lock_guard<std::mutex> lock(mLock);
148 bool dumpAll = true;
149
150 std::unordered_set<std::string> argsSet;
151 for (size_t i = 0; i < args.size(); i++) {
152 argsSet.insert(String8(args[i]).c_str());
153 }
154
155 const bool dumpGlobal = argsSet.count("--global") != 0;
156 if (dumpGlobal) {
157 dumpGlobalLocked(result);
158 dumpAll = false;
159 }
160
161 const bool dumpApp = argsSet.count("--app") != 0;
162 if (dumpApp) {
163 dumpAppLocked(result);
164 dumpAll = false;
165 }
166
167 if (argsSet.count("--clear")) {
168 bool clearAll = true;
169
170 if (dumpGlobal) {
171 mGlobalStats.clear();
172 clearAll = false;
173 }
174
175 if (dumpApp) {
176 mAppStats.clear();
177 clearAll = false;
178 }
179
180 if (clearAll) {
181 mGlobalStats.clear();
182 mAppStats.clear();
183 }
184
185 dumpAll = false;
186 }
187
188 if (dumpAll) {
189 dumpGlobalLocked(result);
190 dumpAppLocked(result);
191 }
192}
193
194void GpuStats::dumpGlobalLocked(std::string* result) {
Yiwei Zhang174a2a02019-05-06 19:08:31 -0700195 interceptSystemDriverStatsLocked();
196
Yiwei Zhang2d4c1882019-02-24 22:28:08 -0800197 for (const auto& ele : mGlobalStats) {
Yiwei Zhangf40fb102019-02-27 21:05:06 -0800198 result->append(ele.second.toString());
Yiwei Zhang2d4c1882019-02-24 22:28:08 -0800199 result->append("\n");
200 }
201}
202
203void GpuStats::dumpAppLocked(std::string* result) {
Yiwei Zhang2d4c1882019-02-24 22:28:08 -0800204 for (const auto& ele : mAppStats) {
Yiwei Zhangf40fb102019-02-27 21:05:06 -0800205 result->append(ele.second.toString());
Yiwei Zhang2d4c1882019-02-24 22:28:08 -0800206 result->append("\n");
Yiwei Zhang2d4c1882019-02-24 22:28:08 -0800207 }
208}
209
Yiwei Zhangbaea97f2019-02-27 16:35:37 -0800210void GpuStats::pullGlobalStats(std::vector<GpuStatsGlobalInfo>* outStats) {
211 ATRACE_CALL();
212
213 std::lock_guard<std::mutex> lock(mLock);
214 outStats->clear();
215 outStats->reserve(mGlobalStats.size());
216
Yiwei Zhang174a2a02019-05-06 19:08:31 -0700217 interceptSystemDriverStatsLocked();
218
Yiwei Zhangbaea97f2019-02-27 16:35:37 -0800219 for (const auto& ele : mGlobalStats) {
220 outStats->emplace_back(ele.second);
221 }
222
223 mGlobalStats.clear();
224}
225
Yiwei Zhang178e0672019-03-04 14:17:12 -0800226void GpuStats::pullAppStats(std::vector<GpuStatsAppInfo>* outStats) {
227 ATRACE_CALL();
228
229 std::lock_guard<std::mutex> lock(mLock);
230 outStats->clear();
231 outStats->reserve(mAppStats.size());
232
233 for (const auto& ele : mAppStats) {
234 outStats->emplace_back(ele.second);
235 }
236
237 mAppStats.clear();
238}
239
Yiwei Zhang2d4c1882019-02-24 22:28:08 -0800240} // namespace android