blob: 11b636d564c297756b6a4060d17701e9b5c6e1f8 [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
Yiwei Zhang29f85932020-02-04 17:14:54 -080020#include "gpustats/GpuStats.h"
Yiwei Zhang2d4c1882019-02-24 22:28:08 -080021
Yiwei Zhang29f85932020-02-04 17:14:54 -080022#include <android/util/ProtoOutputStream.h>
Yiwei Zhang174a2a02019-05-06 19:08:31 -070023#include <cutils/properties.h>
Yiwei Zhang2d4c1882019-02-24 22:28:08 -080024#include <log/log.h>
Yiwei Zhangb59a1272020-02-04 14:58:01 -080025#include <stats_event.h>
26#include <statslog.h>
Yiwei Zhang2d4c1882019-02-24 22:28:08 -080027#include <utils/Trace.h>
28
Yiwei Zhang174a2a02019-05-06 19:08:31 -070029#include <unordered_set>
30
Yiwei Zhang2d4c1882019-02-24 22:28:08 -080031namespace android {
32
Yiwei Zhangb59a1272020-02-04 14:58:01 -080033GpuStats::~GpuStats() {
Alec Mouri822b10a2020-03-17 17:51:27 -070034 if (mStatsdRegistered) {
Tej Singh38a4b212020-03-13 19:04:51 -070035 AStatsManager_clearPullAtomCallback(android::util::GPU_STATS_GLOBAL_INFO);
36 AStatsManager_clearPullAtomCallback(android::util::GPU_STATS_APP_INFO);
Alec Mouri822b10a2020-03-17 17:51:27 -070037 }
Yiwei Zhangb59a1272020-02-04 14:58:01 -080038}
39
Yiwei Zhang27ab3ac2019-07-02 18:10:55 -070040static void addLoadingCount(GpuStatsInfo::Driver driver, bool isDriverLoaded,
Yiwei Zhangf40fb102019-02-27 21:05:06 -080041 GpuStatsGlobalInfo* const outGlobalInfo) {
Yiwei Zhang2d4c1882019-02-24 22:28:08 -080042 switch (driver) {
Yiwei Zhang27ab3ac2019-07-02 18:10:55 -070043 case GpuStatsInfo::Driver::GL:
44 case GpuStatsInfo::Driver::GL_UPDATED:
Yiwei Zhangf40fb102019-02-27 21:05:06 -080045 outGlobalInfo->glLoadingCount++;
46 if (!isDriverLoaded) outGlobalInfo->glLoadingFailureCount++;
Yiwei Zhang2d4c1882019-02-24 22:28:08 -080047 break;
Yiwei Zhang27ab3ac2019-07-02 18:10:55 -070048 case GpuStatsInfo::Driver::VULKAN:
49 case GpuStatsInfo::Driver::VULKAN_UPDATED:
Yiwei Zhangf40fb102019-02-27 21:05:06 -080050 outGlobalInfo->vkLoadingCount++;
51 if (!isDriverLoaded) outGlobalInfo->vkLoadingFailureCount++;
Yiwei Zhang2d4c1882019-02-24 22:28:08 -080052 break;
Yiwei Zhang27ab3ac2019-07-02 18:10:55 -070053 case GpuStatsInfo::Driver::ANGLE:
Yiwei Zhang8e7c4b62019-05-08 15:57:59 -070054 outGlobalInfo->angleLoadingCount++;
55 if (!isDriverLoaded) outGlobalInfo->angleLoadingFailureCount++;
56 break;
Yiwei Zhang2d4c1882019-02-24 22:28:08 -080057 default:
Yiwei Zhang8e7c4b62019-05-08 15:57:59 -070058 break;
Yiwei Zhang2d4c1882019-02-24 22:28:08 -080059 }
Yiwei Zhang2d4c1882019-02-24 22:28:08 -080060}
61
Yiwei Zhang27ab3ac2019-07-02 18:10:55 -070062static void addLoadingTime(GpuStatsInfo::Driver driver, int64_t driverLoadingTime,
Yiwei Zhangf40fb102019-02-27 21:05:06 -080063 GpuStatsAppInfo* const outAppInfo) {
Yiwei Zhang2d4c1882019-02-24 22:28:08 -080064 switch (driver) {
Yiwei Zhang27ab3ac2019-07-02 18:10:55 -070065 case GpuStatsInfo::Driver::GL:
66 case GpuStatsInfo::Driver::GL_UPDATED:
Yiwei Zhang8e7c4b62019-05-08 15:57:59 -070067 if (outAppInfo->glDriverLoadingTime.size() < GpuStats::MAX_NUM_LOADING_TIMES) {
68 outAppInfo->glDriverLoadingTime.emplace_back(driverLoadingTime);
69 }
Yiwei Zhang2d4c1882019-02-24 22:28:08 -080070 break;
Yiwei Zhang27ab3ac2019-07-02 18:10:55 -070071 case GpuStatsInfo::Driver::VULKAN:
72 case GpuStatsInfo::Driver::VULKAN_UPDATED:
Yiwei Zhang8e7c4b62019-05-08 15:57:59 -070073 if (outAppInfo->vkDriverLoadingTime.size() < GpuStats::MAX_NUM_LOADING_TIMES) {
74 outAppInfo->vkDriverLoadingTime.emplace_back(driverLoadingTime);
75 }
76 break;
Yiwei Zhang27ab3ac2019-07-02 18:10:55 -070077 case GpuStatsInfo::Driver::ANGLE:
Yiwei Zhang8e7c4b62019-05-08 15:57:59 -070078 if (outAppInfo->angleDriverLoadingTime.size() < GpuStats::MAX_NUM_LOADING_TIMES) {
79 outAppInfo->angleDriverLoadingTime.emplace_back(driverLoadingTime);
80 }
Yiwei Zhang2d4c1882019-02-24 22:28:08 -080081 break;
82 default:
83 break;
84 }
85}
86
Tim Van Pattena9ad69b2021-11-24 19:29:38 -070087void GpuStats::purgeOldDriverStats() {
88 ALOG_ASSERT(mAppStats.size() == MAX_NUM_APP_RECORDS);
89
90 struct GpuStatsApp {
91 // Key is <app package name>+<driver version code>.
92 const std::string *appStatsKey = nullptr;
93 const std::chrono::time_point<std::chrono::system_clock> *lastAccessTime = nullptr;
94 };
95 std::vector<GpuStatsApp> gpuStatsApps(MAX_NUM_APP_RECORDS);
96
97 // Create a list of pointers to package names and their last access times.
98 int index = 0;
99 for (const auto & [appStatsKey, gpuStatsAppInfo] : mAppStats) {
100 GpuStatsApp &gpuStatsApp = gpuStatsApps[index];
101 gpuStatsApp.appStatsKey = &appStatsKey;
102 gpuStatsApp.lastAccessTime = &gpuStatsAppInfo.lastAccessTime;
103 ++index;
104 }
105
106 // Sort the list with the oldest access times at the front.
107 std::sort(gpuStatsApps.begin(), gpuStatsApps.end(), [](GpuStatsApp a, GpuStatsApp b) -> bool {
108 return *a.lastAccessTime < *b.lastAccessTime;
109 });
110
111 // Remove the oldest packages from mAppStats to make room for new apps.
112 for (int i = 0; i < APP_RECORD_HEADROOM; ++i) {
113 mAppStats.erase(*gpuStatsApps[i].appStatsKey);
114 gpuStatsApps[i].appStatsKey = nullptr;
115 gpuStatsApps[i].lastAccessTime = nullptr;
116 }
117}
118
Yiwei Zhangfdd7e782020-01-31 15:59:34 -0800119void GpuStats::insertDriverStats(const std::string& driverPackageName,
120 const std::string& driverVersionName, uint64_t driverVersionCode,
121 int64_t driverBuildTime, const std::string& appPackageName,
122 const int32_t vulkanVersion, GpuStatsInfo::Driver driver,
123 bool isDriverLoaded, int64_t driverLoadingTime) {
Yiwei Zhang2d4c1882019-02-24 22:28:08 -0800124 ATRACE_CALL();
125
126 std::lock_guard<std::mutex> lock(mLock);
Alec Mouri822b10a2020-03-17 17:51:27 -0700127 registerStatsdCallbacksIfNeeded();
Yiwei Zhang2d4c1882019-02-24 22:28:08 -0800128 ALOGV("Received:\n"
129 "\tdriverPackageName[%s]\n"
130 "\tdriverVersionName[%s]\n"
131 "\tdriverVersionCode[%" PRIu64 "]\n"
132 "\tdriverBuildTime[%" PRId64 "]\n"
133 "\tappPackageName[%s]\n"
Yiwei Zhang794d2952019-05-06 17:43:59 -0700134 "\tvulkanVersion[%d]\n"
Yiwei Zhang2d4c1882019-02-24 22:28:08 -0800135 "\tdriver[%d]\n"
136 "\tisDriverLoaded[%d]\n"
137 "\tdriverLoadingTime[%" PRId64 "]",
138 driverPackageName.c_str(), driverVersionName.c_str(), driverVersionCode, driverBuildTime,
Yiwei Zhang794d2952019-05-06 17:43:59 -0700139 appPackageName.c_str(), vulkanVersion, static_cast<int32_t>(driver), isDriverLoaded,
140 driverLoadingTime);
Yiwei Zhang2d4c1882019-02-24 22:28:08 -0800141
142 if (!mGlobalStats.count(driverVersionCode)) {
Yiwei Zhangf40fb102019-02-27 21:05:06 -0800143 GpuStatsGlobalInfo globalInfo;
Yiwei Zhang8e7c4b62019-05-08 15:57:59 -0700144 addLoadingCount(driver, isDriverLoaded, &globalInfo);
Yiwei Zhangf40fb102019-02-27 21:05:06 -0800145 globalInfo.driverPackageName = driverPackageName;
146 globalInfo.driverVersionName = driverVersionName;
147 globalInfo.driverVersionCode = driverVersionCode;
148 globalInfo.driverBuildTime = driverBuildTime;
Yiwei Zhang794d2952019-05-06 17:43:59 -0700149 globalInfo.vulkanVersion = vulkanVersion;
Yiwei Zhangf40fb102019-02-27 21:05:06 -0800150 mGlobalStats.insert({driverVersionCode, globalInfo});
Yiwei Zhang8e7c4b62019-05-08 15:57:59 -0700151 } else {
152 addLoadingCount(driver, isDriverLoaded, &mGlobalStats[driverVersionCode]);
Yiwei Zhang2d4c1882019-02-24 22:28:08 -0800153 }
154
Yiwei Zhang2d4c1882019-02-24 22:28:08 -0800155 const std::string appStatsKey = appPackageName + std::to_string(driverVersionCode);
156 if (!mAppStats.count(appStatsKey)) {
Yiwei Zhang8c5e3bd2019-05-09 14:34:19 -0700157 if (mAppStats.size() >= MAX_NUM_APP_RECORDS) {
Tim Van Pattena9ad69b2021-11-24 19:29:38 -0700158 ALOGV("GpuStatsAppInfo has reached maximum size. Removing old stats to make room.");
159 purgeOldDriverStats();
Yiwei Zhang8c5e3bd2019-05-09 14:34:19 -0700160 }
161
Yiwei Zhangf40fb102019-02-27 21:05:06 -0800162 GpuStatsAppInfo appInfo;
163 addLoadingTime(driver, driverLoadingTime, &appInfo);
164 appInfo.appPackageName = appPackageName;
165 appInfo.driverVersionCode = driverVersionCode;
Solti54161bf2023-11-09 21:09:53 +0000166 appInfo.angleInUse =
167 driver == GpuStatsInfo::Driver::ANGLE || driverPackageName == "angle";
Tim Van Pattena9ad69b2021-11-24 19:29:38 -0700168 appInfo.lastAccessTime = std::chrono::system_clock::now();
Yiwei Zhangf40fb102019-02-27 21:05:06 -0800169 mAppStats.insert({appStatsKey, appInfo});
Tim Van Pattena9ad69b2021-11-24 19:29:38 -0700170 } else {
Solti54161bf2023-11-09 21:09:53 +0000171 mAppStats[appStatsKey].angleInUse =
172 driver == GpuStatsInfo::Driver::ANGLE || driverPackageName == "angle";
Tim Van Pattena9ad69b2021-11-24 19:29:38 -0700173 addLoadingTime(driver, driverLoadingTime, &mAppStats[appStatsKey]);
174 mAppStats[appStatsKey].lastAccessTime = std::chrono::system_clock::now();
Yiwei Zhang2d4c1882019-02-24 22:28:08 -0800175 }
Yiwei Zhang2d4c1882019-02-24 22:28:08 -0800176}
177
Yiwei Zhangbcba4112019-07-03 13:39:32 -0700178void GpuStats::insertTargetStats(const std::string& appPackageName,
179 const uint64_t driverVersionCode, const GpuStatsInfo::Stats stats,
Serdar Kocdemirb2901c92022-11-17 00:39:05 +0000180 const uint64_t value) {
181 return insertTargetStatsArray(appPackageName, driverVersionCode, stats, &value, 1);
182}
183
184void GpuStats::insertTargetStatsArray(const std::string& appPackageName,
185 const uint64_t driverVersionCode, const GpuStatsInfo::Stats stats,
186 const uint64_t* values, const uint32_t valueCount) {
Yiwei Zhangbcba4112019-07-03 13:39:32 -0700187 ATRACE_CALL();
188
Yiwei Zhang8c5e3bd2019-05-09 14:34:19 -0700189 const std::string appStatsKey = appPackageName + std::to_string(driverVersionCode);
Yiwei Zhangbcba4112019-07-03 13:39:32 -0700190
191 std::lock_guard<std::mutex> lock(mLock);
Alec Mouri822b10a2020-03-17 17:51:27 -0700192 registerStatsdCallbacksIfNeeded();
Serdar Kocdemirb2901c92022-11-17 00:39:05 +0000193
194 const auto foundApp = mAppStats.find(appStatsKey);
195 if (foundApp == mAppStats.end()) {
Yiwei Zhang8c5e3bd2019-05-09 14:34:19 -0700196 return;
197 }
198
Serdar Kocdemirb2901c92022-11-17 00:39:05 +0000199 GpuStatsAppInfo& targetAppStats = foundApp->second;
200
201 if (stats == GpuStatsInfo::Stats::VULKAN_INSTANCE_EXTENSION
202 || stats == GpuStatsInfo::Stats::VULKAN_DEVICE_EXTENSION) {
203 // Handle extension arrays separately as we need to store a unique set of them
204 // in the stats vector. Storing in std::set<> is not efficient for serialization tasks.
205 std::vector<int32_t>& targetVec =
206 (stats == GpuStatsInfo::Stats::VULKAN_INSTANCE_EXTENSION) ?
207 targetAppStats.vulkanInstanceExtensions :
208 targetAppStats.vulkanDeviceExtensions;
209 const bool addAll = (targetVec.size() == 0);
210 targetVec.reserve(valueCount);
211
212 // Add new extensions into the set
213 for(uint32_t i = 0;
214 (i < valueCount) && (targetVec.size() < GpuStatsAppInfo::MAX_NUM_EXTENSIONS);
215 i++) {
216 const int32_t extVal = int32_t(values[i] & 0xFFFFFFFF);
217 if (addAll
218 || std::find(targetVec.cbegin(), targetVec.cend(), extVal) == targetVec.cend()) {
219 targetVec.push_back(extVal);
220 }
221 }
222 }
223 else {
224 // Handle other type of stats info events
225 for(uint32_t i = 0; i < valueCount; i++) {
226 const uint64_t value = values[i];
227 switch (stats) {
228 case GpuStatsInfo::Stats::CPU_VULKAN_IN_USE:
229 targetAppStats.cpuVulkanInUse = true;
230 break;
231 case GpuStatsInfo::Stats::FALSE_PREROTATION:
232 targetAppStats.falsePrerotation = true;
233 break;
234 case GpuStatsInfo::Stats::GLES_1_IN_USE:
235 targetAppStats.gles1InUse = true;
236 break;
237 case GpuStatsInfo::Stats::CREATED_GLES_CONTEXT:
238 targetAppStats.createdGlesContext = true;
239 break;
240 case GpuStatsInfo::Stats::CREATED_VULKAN_DEVICE:
241 targetAppStats.createdVulkanDevice = true;
242 break;
243 case GpuStatsInfo::Stats::CREATED_VULKAN_API_VERSION:
244 targetAppStats.vulkanApiVersion = uint32_t(value & 0xffffffff);
245 break;
246 case GpuStatsInfo::Stats::CREATED_VULKAN_SWAPCHAIN:
247 targetAppStats.createdVulkanSwapchain = true;
248 break;
249 case GpuStatsInfo::Stats::VULKAN_DEVICE_FEATURES_ENABLED:
250 // Merge all requested feature bits together for this app
251 targetAppStats.vulkanDeviceFeaturesEnabled |= value;
252 break;
253 default:
254 break;
255 }
256 }
Yiwei Zhangbcba4112019-07-03 13:39:32 -0700257 }
Yiwei Zhang8c5e3bd2019-05-09 14:34:19 -0700258}
259
Yiwei Zhang174a2a02019-05-06 19:08:31 -0700260void GpuStats::interceptSystemDriverStatsLocked() {
261 // Append cpuVulkanVersion and glesVersion to system driver stats
262 if (!mGlobalStats.count(0) || mGlobalStats[0].glesVersion) {
263 return;
264 }
265
266 mGlobalStats[0].cpuVulkanVersion = property_get_int32("ro.cpuvulkan.version", 0);
267 mGlobalStats[0].glesVersion = property_get_int32("ro.opengles.version", 0);
268}
269
Alec Mouri822b10a2020-03-17 17:51:27 -0700270void GpuStats::registerStatsdCallbacksIfNeeded() {
271 if (!mStatsdRegistered) {
Tej Singh38a4b212020-03-13 19:04:51 -0700272 AStatsManager_setPullAtomCallback(android::util::GPU_STATS_GLOBAL_INFO, nullptr,
273 GpuStats::pullAtomCallback, this);
274 AStatsManager_setPullAtomCallback(android::util::GPU_STATS_APP_INFO, nullptr,
275 GpuStats::pullAtomCallback, this);
Alec Mouri822b10a2020-03-17 17:51:27 -0700276 mStatsdRegistered = true;
277 }
278}
279
Yiwei Zhang2d4c1882019-02-24 22:28:08 -0800280void GpuStats::dump(const Vector<String16>& args, std::string* result) {
281 ATRACE_CALL();
282
283 if (!result) {
284 ALOGE("Dump result shouldn't be nullptr.");
285 return;
286 }
287
288 std::lock_guard<std::mutex> lock(mLock);
289 bool dumpAll = true;
290
291 std::unordered_set<std::string> argsSet;
292 for (size_t i = 0; i < args.size(); i++) {
293 argsSet.insert(String8(args[i]).c_str());
294 }
295
296 const bool dumpGlobal = argsSet.count("--global") != 0;
297 if (dumpGlobal) {
298 dumpGlobalLocked(result);
299 dumpAll = false;
300 }
301
302 const bool dumpApp = argsSet.count("--app") != 0;
303 if (dumpApp) {
304 dumpAppLocked(result);
305 dumpAll = false;
306 }
307
Yiwei Zhangfdd7e782020-01-31 15:59:34 -0800308 if (dumpAll) {
309 dumpGlobalLocked(result);
310 dumpAppLocked(result);
311 }
312
Yiwei Zhang2d4c1882019-02-24 22:28:08 -0800313 if (argsSet.count("--clear")) {
314 bool clearAll = true;
315
316 if (dumpGlobal) {
317 mGlobalStats.clear();
318 clearAll = false;
319 }
320
321 if (dumpApp) {
322 mAppStats.clear();
323 clearAll = false;
324 }
325
326 if (clearAll) {
327 mGlobalStats.clear();
328 mAppStats.clear();
329 }
Yiwei Zhang2d4c1882019-02-24 22:28:08 -0800330 }
331}
332
333void GpuStats::dumpGlobalLocked(std::string* result) {
Yiwei Zhang174a2a02019-05-06 19:08:31 -0700334 interceptSystemDriverStatsLocked();
335
Yiwei Zhang2d4c1882019-02-24 22:28:08 -0800336 for (const auto& ele : mGlobalStats) {
Yiwei Zhangf40fb102019-02-27 21:05:06 -0800337 result->append(ele.second.toString());
Yiwei Zhang2d4c1882019-02-24 22:28:08 -0800338 result->append("\n");
339 }
340}
341
342void GpuStats::dumpAppLocked(std::string* result) {
Yiwei Zhang2d4c1882019-02-24 22:28:08 -0800343 for (const auto& ele : mAppStats) {
Yiwei Zhangf40fb102019-02-27 21:05:06 -0800344 result->append(ele.second.toString());
Yiwei Zhang2d4c1882019-02-24 22:28:08 -0800345 result->append("\n");
Yiwei Zhang2d4c1882019-02-24 22:28:08 -0800346 }
347}
348
Yiwei Zhang29f85932020-02-04 17:14:54 -0800349static std::string protoOutputStreamToByteString(android::util::ProtoOutputStream& proto) {
350 if (!proto.size()) return "";
351
352 std::string byteString;
353 sp<android::util::ProtoReader> reader = proto.data();
354 while (reader->readBuffer() != nullptr) {
355 const size_t toRead = reader->currentToRead();
356 byteString.append((char*)reader->readBuffer(), toRead);
357 reader->move(toRead);
358 }
359
360 if (byteString.size() != proto.size()) return "";
361
362 return byteString;
363}
364
365static std::string int64VectorToProtoByteString(const std::vector<int64_t>& value) {
366 if (value.empty()) return "";
367
368 android::util::ProtoOutputStream proto;
369 for (const auto& ele : value) {
370 proto.write(android::util::FIELD_TYPE_INT64 | android::util::FIELD_COUNT_REPEATED |
371 1 /* field id */,
372 (long long)ele);
373 }
374
375 return protoOutputStreamToByteString(proto);
376}
377
378AStatsManager_PullAtomCallbackReturn GpuStats::pullAppInfoAtom(AStatsEventList* data) {
379 ATRACE_CALL();
380
381 std::lock_guard<std::mutex> lock(mLock);
382
383 if (data) {
384 for (const auto& ele : mAppStats) {
Salud Lemus30108fa2020-07-11 00:02:19 +0000385 std::string glDriverBytes = int64VectorToProtoByteString(
386 ele.second.glDriverLoadingTime);
387 std::string vkDriverBytes = int64VectorToProtoByteString(
388 ele.second.vkDriverLoadingTime);
389 std::string angleDriverBytes = int64VectorToProtoByteString(
390 ele.second.angleDriverLoadingTime);
Yiwei Zhang29f85932020-02-04 17:14:54 -0800391
Salud Lemus30108fa2020-07-11 00:02:19 +0000392 android::util::addAStatsEvent(
393 data,
394 android::util::GPU_STATS_APP_INFO,
395 ele.second.appPackageName.c_str(),
396 ele.second.driverVersionCode,
397 android::util::BytesField(glDriverBytes.c_str(),
398 glDriverBytes.length()),
399 android::util::BytesField(vkDriverBytes.c_str(),
400 vkDriverBytes.length()),
401 android::util::BytesField(angleDriverBytes.c_str(),
402 angleDriverBytes.length()),
403 ele.second.cpuVulkanInUse,
404 ele.second.falsePrerotation,
Tim Van Pattena9ad69b2021-11-24 19:29:38 -0700405 ele.second.gles1InUse,
Serdar Kocdemirb2901c92022-11-17 00:39:05 +0000406 ele.second.angleInUse,
407 ele.second.createdGlesContext,
408 ele.second.createdVulkanDevice,
409 ele.second.createdVulkanSwapchain,
410 ele.second.vulkanApiVersion,
411 ele.second.vulkanDeviceFeaturesEnabled,
412 ele.second.vulkanInstanceExtensions,
413 ele.second.vulkanDeviceExtensions);
Yiwei Zhang29f85932020-02-04 17:14:54 -0800414 }
415 }
416
417 mAppStats.clear();
418
419 return AStatsManager_PULL_SUCCESS;
420}
421
Yiwei Zhangb59a1272020-02-04 14:58:01 -0800422AStatsManager_PullAtomCallbackReturn GpuStats::pullGlobalInfoAtom(AStatsEventList* data) {
423 ATRACE_CALL();
424
425 std::lock_guard<std::mutex> lock(mLock);
426 // flush cpuVulkanVersion and glesVersion to builtin driver stats
427 interceptSystemDriverStatsLocked();
428
429 if (data) {
430 for (const auto& ele : mGlobalStats) {
Salud Lemus30108fa2020-07-11 00:02:19 +0000431 android::util::addAStatsEvent(
432 data,
433 android::util::GPU_STATS_GLOBAL_INFO,
434 ele.second.driverPackageName.c_str(),
435 ele.second.driverVersionName.c_str(),
436 ele.second.driverVersionCode,
437 ele.second.driverBuildTime,
438 ele.second.glLoadingCount,
439 ele.second.glLoadingFailureCount,
440 ele.second.vkLoadingCount,
441 ele.second.vkLoadingFailureCount,
442 ele.second.vulkanVersion,
443 ele.second.cpuVulkanVersion,
444 ele.second.glesVersion,
445 ele.second.angleLoadingCount,
446 ele.second.angleLoadingFailureCount);
Yiwei Zhangb59a1272020-02-04 14:58:01 -0800447 }
448 }
449
450 mGlobalStats.clear();
451
452 return AStatsManager_PULL_SUCCESS;
453}
454
455AStatsManager_PullAtomCallbackReturn GpuStats::pullAtomCallback(int32_t atomTag,
456 AStatsEventList* data,
457 void* cookie) {
458 ATRACE_CALL();
459
460 GpuStats* pGpuStats = reinterpret_cast<GpuStats*>(cookie);
461 if (atomTag == android::util::GPU_STATS_GLOBAL_INFO) {
462 return pGpuStats->pullGlobalInfoAtom(data);
Yiwei Zhang29f85932020-02-04 17:14:54 -0800463 } else if (atomTag == android::util::GPU_STATS_APP_INFO) {
464 return pGpuStats->pullAppInfoAtom(data);
Yiwei Zhangb59a1272020-02-04 14:58:01 -0800465 }
466
467 return AStatsManager_PULL_SKIP;
468}
469
Yiwei Zhang2d4c1882019-02-24 22:28:08 -0800470} // namespace android