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