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