10102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang/* 20102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang * Copyright (C) 2018 The Android Open Source Project 30102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang * 40102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang * Licensed under the Apache License, Version 2.0 (the "License"); 50102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang * you may not use this file except in compliance with the License. 60102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang * You may obtain a copy of the License at 70102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang * 80102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang * http://www.apache.org/licenses/LICENSE-2.0 90102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang * 100102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang * Unless required by applicable law or agreed to in writing, software 110102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang * distributed under the License is distributed on an "AS IS" BASIS, 120102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang * See the License for the specific language governing permissions and 140102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang * limitations under the License. 150102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang */ 160102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang#pragma once 170102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang 180102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang#include <timestatsproto/TimeStatsProtoHeader.h> 190102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang 208a4015c8d7d0316fa422ed53db7e972310f6758bYiwei Zhang#include <optional> 210102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang#include <string> 220102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang#include <unordered_map> 230102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang#include <vector> 240102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang 250102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhangnamespace android { 260102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhangnamespace surfaceflinger { 270102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang 280102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhangclass TimeStatsHelper { 290102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhangpublic: 300102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang class Histogram { 310102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang public: 320102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang // Key is the delta time between timestamps 330102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang // Value is the number of appearances of that delta 340102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang std::unordered_map<int32_t, int32_t> hist; 350102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang 360102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang void insert(int32_t delta); 378a4015c8d7d0316fa422ed53db7e972310f6758bYiwei Zhang float averageTime() const; 388a4015c8d7d0316fa422ed53db7e972310f6758bYiwei Zhang std::string toString() const; 390102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang }; 400102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang 410102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang class TimeStatsLayer { 420102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang public: 430102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang std::string layerName; 440102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang std::string packageName; 450102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang int64_t statsStart = 0; 460102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang int64_t statsEnd = 0; 470102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang int32_t totalFrames = 0; 480102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang std::unordered_map<std::string, Histogram> deltas; 490102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang 508a4015c8d7d0316fa422ed53db7e972310f6758bYiwei Zhang std::string toString() const; 518a4015c8d7d0316fa422ed53db7e972310f6758bYiwei Zhang SFTimeStatsLayerProto toProto() const; 520102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang }; 530102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang 540102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang class TimeStatsGlobal { 550102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang public: 560102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang int64_t statsStart = 0; 570102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang int64_t statsEnd = 0; 580102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang int32_t totalFrames = 0; 590102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang int32_t missedFrames = 0; 600102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang int32_t clientCompositionFrames = 0; 610102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang std::unordered_map<std::string, TimeStatsLayer> stats; 620102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang 638a4015c8d7d0316fa422ed53db7e972310f6758bYiwei Zhang std::string toString(std::optional<uint32_t> maxLayers) const; 648a4015c8d7d0316fa422ed53db7e972310f6758bYiwei Zhang SFTimeStatsGlobalProto toProto(std::optional<uint32_t> maxLayers) const; 658a4015c8d7d0316fa422ed53db7e972310f6758bYiwei Zhang 668a4015c8d7d0316fa422ed53db7e972310f6758bYiwei Zhang private: 678a4015c8d7d0316fa422ed53db7e972310f6758bYiwei Zhang std::vector<TimeStatsLayer const*> generateDumpStats( 688a4015c8d7d0316fa422ed53db7e972310f6758bYiwei Zhang std::optional<uint32_t> maxLayers) const; 690102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang }; 700102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang}; 710102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang 720102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang} // namespace surfaceflinger 730102ad2d522de255efabd50adf6c6a27811344f4Yiwei Zhang} // namespace android 74