• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 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 #ifndef JANKTRACKER_H_
17 #define JANKTRACKER_H_
18 
19 #include "FrameInfo.h"
20 #include "renderthread/TimeLord.h"
21 #include "utils/RingBuffer.h"
22 
23 #include <cutils/compiler.h>
24 #include <ui/DisplayInfo.h>
25 
26 #include <array>
27 #include <memory>
28 
29 namespace android {
30 namespace uirenderer {
31 
32 enum JankType {
33     kMissedVsync = 0,
34     kHighInputLatency,
35     kSlowUI,
36     kSlowSync,
37     kSlowRT,
38 
39     // must be last
40     NUM_BUCKETS,
41 };
42 
43 // Try to keep as small as possible, should match ASHMEM_SIZE in
44 // GraphicsStatsService.java
45 struct ProfileData {
46     std::array<uint32_t, NUM_BUCKETS> jankTypeCounts;
47     // See comments on kBucket* constants for what this holds
48     std::array<uint32_t, 57> frameCounts;
49     // Holds a histogram of frame times in 50ms increments from 150ms to 5s
50     std::array<uint16_t, 97> slowFrameCounts;
51 
52     uint32_t totalFrameCount;
53     uint32_t jankFrameCount;
54     nsecs_t statStartTime;
55 };
56 
57 // TODO: Replace DrawProfiler with this
58 class JankTracker {
59 public:
60     JankTracker(const DisplayInfo& displayInfo);
61     ~JankTracker();
62 
63     void addFrame(const FrameInfo& frame);
64 
dump(int fd)65     void dump(int fd) { dumpData(mData, fd); }
66     void reset();
67 
68     void switchStorageToAshmem(int ashmemfd);
69 
findPercentile(int p)70     uint32_t findPercentile(int p) { return findPercentile(mData, p); }
71 
72     ANDROID_API static void dumpBuffer(const void* buffer, size_t bufsize, int fd);
73 
74 private:
75     void freeData();
76     void setFrameInterval(nsecs_t frameIntervalNanos);
77 
78     static uint32_t findPercentile(const ProfileData* data, int p);
79     static void dumpData(const ProfileData* data, int fd);
80 
81     std::array<int64_t, NUM_BUCKETS> mThresholds;
82     int64_t mFrameInterval;
83     // The amount of time we will erase from the total duration to account
84     // for SF vsync offsets with HWC2 blocking dequeueBuffers.
85     // (Vsync + mDequeueBlockTolerance) is the point at which we expect
86     // SF to have released the buffer normally, so we will forgive up to that
87     // point in time by comparing to (IssueDrawCommandsStart + DequeueDuration)
88     // This is only used if we are in pipelined mode and are using HWC2,
89     // otherwise it's 0.
90     nsecs_t mDequeueTimeForgiveness = 0;
91     ProfileData* mData;
92     bool mIsMapped = false;
93 };
94 
95 } /* namespace uirenderer */
96 } /* namespace android */
97 
98 #endif /* JANKTRACKER_H_ */
99