1*d57664e9SAndroid Build Coastguard Worker /* 2*d57664e9SAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project 3*d57664e9SAndroid Build Coastguard Worker * 4*d57664e9SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*d57664e9SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*d57664e9SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*d57664e9SAndroid Build Coastguard Worker * 8*d57664e9SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*d57664e9SAndroid Build Coastguard Worker * 10*d57664e9SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*d57664e9SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*d57664e9SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*d57664e9SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*d57664e9SAndroid Build Coastguard Worker * limitations under the License. 15*d57664e9SAndroid Build Coastguard Worker */ 16*d57664e9SAndroid Build Coastguard Worker #ifndef JANKTRACKER_H_ 17*d57664e9SAndroid Build Coastguard Worker #define JANKTRACKER_H_ 18*d57664e9SAndroid Build Coastguard Worker 19*d57664e9SAndroid Build Coastguard Worker #include "FrameInfo.h" 20*d57664e9SAndroid Build Coastguard Worker #include "FrameMetricsReporter.h" 21*d57664e9SAndroid Build Coastguard Worker #include "ProfileData.h" 22*d57664e9SAndroid Build Coastguard Worker #include "ProfileDataContainer.h" 23*d57664e9SAndroid Build Coastguard Worker #include "renderthread/TimeLord.h" 24*d57664e9SAndroid Build Coastguard Worker #include "utils/RingBuffer.h" 25*d57664e9SAndroid Build Coastguard Worker 26*d57664e9SAndroid Build Coastguard Worker #include <cutils/compiler.h> 27*d57664e9SAndroid Build Coastguard Worker 28*d57664e9SAndroid Build Coastguard Worker #include <array> 29*d57664e9SAndroid Build Coastguard Worker #include <memory> 30*d57664e9SAndroid Build Coastguard Worker 31*d57664e9SAndroid Build Coastguard Worker namespace android { 32*d57664e9SAndroid Build Coastguard Worker namespace uirenderer { 33*d57664e9SAndroid Build Coastguard Worker 34*d57664e9SAndroid Build Coastguard Worker enum class JankTrackerType { 35*d57664e9SAndroid Build Coastguard Worker // The default, means there's no description set 36*d57664e9SAndroid Build Coastguard Worker Generic, 37*d57664e9SAndroid Build Coastguard Worker // The profile data represents a package 38*d57664e9SAndroid Build Coastguard Worker Package, 39*d57664e9SAndroid Build Coastguard Worker // The profile data is for a specific window 40*d57664e9SAndroid Build Coastguard Worker Window, 41*d57664e9SAndroid Build Coastguard Worker }; 42*d57664e9SAndroid Build Coastguard Worker 43*d57664e9SAndroid Build Coastguard Worker // Metadata about the ProfileData being collected 44*d57664e9SAndroid Build Coastguard Worker struct ProfileDataDescription { 45*d57664e9SAndroid Build Coastguard Worker JankTrackerType type; 46*d57664e9SAndroid Build Coastguard Worker std::string name; 47*d57664e9SAndroid Build Coastguard Worker }; 48*d57664e9SAndroid Build Coastguard Worker 49*d57664e9SAndroid Build Coastguard Worker // TODO: Replace DrawProfiler with this 50*d57664e9SAndroid Build Coastguard Worker class JankTracker { 51*d57664e9SAndroid Build Coastguard Worker public: 52*d57664e9SAndroid Build Coastguard Worker explicit JankTracker(ProfileDataContainer* globalData); 53*d57664e9SAndroid Build Coastguard Worker setDescription(JankTrackerType type,const std::string && name)54*d57664e9SAndroid Build Coastguard Worker void setDescription(JankTrackerType type, const std::string&& name) { 55*d57664e9SAndroid Build Coastguard Worker mDescription.type = type; 56*d57664e9SAndroid Build Coastguard Worker mDescription.name = name; 57*d57664e9SAndroid Build Coastguard Worker } 58*d57664e9SAndroid Build Coastguard Worker startFrame()59*d57664e9SAndroid Build Coastguard Worker FrameInfo* startFrame() { return &mFrames.next(); } 60*d57664e9SAndroid Build Coastguard Worker void finishFrame(FrameInfo& frame, std::unique_ptr<FrameMetricsReporter>& reporter, 61*d57664e9SAndroid Build Coastguard Worker int64_t frameNumber, int32_t surfaceId); 62*d57664e9SAndroid Build Coastguard Worker 63*d57664e9SAndroid Build Coastguard Worker // Calculates the 'legacy' jank information, i.e. with outdated refresh rate information and 64*d57664e9SAndroid Build Coastguard Worker // without GPU completion or deadlined information. 65*d57664e9SAndroid Build Coastguard Worker void calculateLegacyJank(FrameInfo& frame); dumpStats(int fd)66*d57664e9SAndroid Build Coastguard Worker void dumpStats(int fd) NO_THREAD_SAFETY_ANALYSIS { dumpData(fd, &mDescription, mData.get()); } 67*d57664e9SAndroid Build Coastguard Worker void dumpFrames(int fd); 68*d57664e9SAndroid Build Coastguard Worker void reset(); 69*d57664e9SAndroid Build Coastguard Worker 70*d57664e9SAndroid Build Coastguard Worker // Exposed for FrameInfoVisualizer 71*d57664e9SAndroid Build Coastguard Worker // TODO: Figure out a better way to handle this frames()72*d57664e9SAndroid Build Coastguard Worker RingBuffer<FrameInfo, 120>& frames() { return mFrames; } 73*d57664e9SAndroid Build Coastguard Worker 74*d57664e9SAndroid Build Coastguard Worker private: 75*d57664e9SAndroid Build Coastguard Worker void recomputeThresholds(int64_t frameInterval); 76*d57664e9SAndroid Build Coastguard Worker static void dumpData(int fd, const ProfileDataDescription* description, 77*d57664e9SAndroid Build Coastguard Worker const ProfileData* data); 78*d57664e9SAndroid Build Coastguard Worker 79*d57664e9SAndroid Build Coastguard Worker // Last frame budget for which mThresholds were computed. 80*d57664e9SAndroid Build Coastguard Worker int64_t mThresholdsFrameBudget GUARDED_BY(mDataMutex); 81*d57664e9SAndroid Build Coastguard Worker std::array<int64_t, NUM_BUCKETS> mThresholds GUARDED_BY(mDataMutex); 82*d57664e9SAndroid Build Coastguard Worker 83*d57664e9SAndroid Build Coastguard Worker int64_t mFrameIntervalLegacy; 84*d57664e9SAndroid Build Coastguard Worker nsecs_t mSwapDeadlineLegacy = -1; 85*d57664e9SAndroid Build Coastguard Worker // The amount of time we will erase from the total duration to account 86*d57664e9SAndroid Build Coastguard Worker // for SF vsync offsets with HWC2 blocking dequeueBuffers. 87*d57664e9SAndroid Build Coastguard Worker // (Vsync + mDequeueBlockTolerance) is the point at which we expect 88*d57664e9SAndroid Build Coastguard Worker // SF to have released the buffer normally, so we will forgive up to that 89*d57664e9SAndroid Build Coastguard Worker // point in time by comparing to (IssueDrawCommandsStart + DequeueDuration) 90*d57664e9SAndroid Build Coastguard Worker // This is only used if we are in pipelined mode and are using HWC2, 91*d57664e9SAndroid Build Coastguard Worker // otherwise it's 0. 92*d57664e9SAndroid Build Coastguard Worker nsecs_t mDequeueTimeForgivenessLegacy = 0; 93*d57664e9SAndroid Build Coastguard Worker 94*d57664e9SAndroid Build Coastguard Worker nsecs_t mNextFrameStartUnstuffed GUARDED_BY(mDataMutex) = -1; 95*d57664e9SAndroid Build Coastguard Worker ProfileDataContainer mData GUARDED_BY(mDataMutex); 96*d57664e9SAndroid Build Coastguard Worker ProfileDataContainer* mGlobalData GUARDED_BY(mDataMutex); 97*d57664e9SAndroid Build Coastguard Worker ProfileDataDescription mDescription; 98*d57664e9SAndroid Build Coastguard Worker 99*d57664e9SAndroid Build Coastguard Worker // Ring buffer large enough for 2 seconds worth of frames 100*d57664e9SAndroid Build Coastguard Worker RingBuffer<FrameInfo, 120> mFrames; 101*d57664e9SAndroid Build Coastguard Worker 102*d57664e9SAndroid Build Coastguard Worker // Mutex to protect acccess to mData and mGlobalData obtained from mGlobalData->getDataMutex 103*d57664e9SAndroid Build Coastguard Worker std::mutex& mDataMutex; 104*d57664e9SAndroid Build Coastguard Worker }; 105*d57664e9SAndroid Build Coastguard Worker 106*d57664e9SAndroid Build Coastguard Worker } /* namespace uirenderer */ 107*d57664e9SAndroid Build Coastguard Worker } /* namespace android */ 108*d57664e9SAndroid Build Coastguard Worker 109*d57664e9SAndroid Build Coastguard Worker #endif /* JANKTRACKER_H_ */ 110