JankTracker.h revision 379f264bb62ace2cf2053d4765307234bf66552f
1ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck/*
2ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * Copyright (C) 2015 The Android Open Source Project
3ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck *
4ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * Licensed under the Apache License, Version 2.0 (the "License");
5ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * you may not use this file except in compliance with the License.
6ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * You may obtain a copy of the License at
7ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck *
8ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck *      http://www.apache.org/licenses/LICENSE-2.0
9ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck *
10ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * Unless required by applicable law or agreed to in writing, software
11ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * distributed under the License is distributed on an "AS IS" BASIS,
12ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * See the License for the specific language governing permissions and
14ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * limitations under the License.
15ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck */
16ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#ifndef JANKTRACKER_H_
17ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#define JANKTRACKER_H_
18ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
19ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#include "FrameInfo.h"
20ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#include "renderthread/TimeLord.h"
21ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#include "utils/RingBuffer.h"
22ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
23edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck#include <cutils/compiler.h>
24edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck
25b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck#include <array>
26ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#include <memory>
27ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
28ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Recknamespace android {
29ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Recknamespace uirenderer {
30ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
31ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reckenum JankType {
32ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    kMissedVsync = 0,
33ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    kHighInputLatency,
34ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    kSlowUI,
35ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    kSlowSync,
36ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    kSlowRT,
37ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
38ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    // must be last
39ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    NUM_BUCKETS,
40ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck};
41ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
42edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck// Try to keep as small as possible, should match ASHMEM_SIZE in
43edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck// GraphicsStatsService.java
44edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reckstruct ProfileData {
45edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck    std::array<uint32_t, NUM_BUCKETS> jankTypeCounts;
46edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck    // See comments on kBucket* constants for what this holds
47379f264bb62ace2cf2053d4765307234bf66552fJohn Reck    std::array<uint32_t, 55> frameCounts;
48edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck
49edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck    uint32_t totalFrameCount;
50edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck    uint32_t jankFrameCount;
51379f264bb62ace2cf2053d4765307234bf66552fJohn Reck    nsecs_t statStartTime;
52ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck};
53ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
54ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck// TODO: Replace DrawProfiler with this
55ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reckclass JankTracker {
56ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reckpublic:
57ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    JankTracker(nsecs_t frameIntervalNanos);
58edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck    ~JankTracker();
59ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
60ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    void addFrame(const FrameInfo& frame);
61ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
62edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck    void dump(int fd) { dumpData(mData, fd); }
63ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    void reset();
64ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
65edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck    void switchStorageToAshmem(int ashmemfd);
66edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck
67edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck    uint32_t findPercentile(int p) { return findPercentile(mData, p); }
68edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck
69edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck    ANDROID_API static void dumpBuffer(const void* buffer, size_t bufsize, int fd);
70edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck
71ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reckprivate:
72edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck    void freeData();
73edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck    void setFrameInterval(nsecs_t frameIntervalNanos);
74e70c5754d01f2ab0ff47ea3eabaa88aca5ed2a36John Reck
75edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck    static uint32_t findPercentile(const ProfileData* data, int p);
76edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck    static void dumpData(const ProfileData* data, int fd);
77ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
78edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck    std::array<int64_t, NUM_BUCKETS> mThresholds;
79ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    int64_t mFrameInterval;
80edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck    ProfileData* mData;
81edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck    bool mIsMapped = false;
82ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck};
83ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
84ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck} /* namespace uirenderer */
85ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck} /* namespace android */
86ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
87ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#endif /* JANKTRACKER_H_ */
88