FrameInfo.h revision 41300274cf8efde2ca95d3c767b214d1edb97f8d
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 FRAMEINFO_H_ 17ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#define FRAMEINFO_H_ 18ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 19ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#include "utils/Macros.h" 20ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 21ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#include <cutils/compiler.h> 22ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#include <utils/Timers.h> 23ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 24ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#include <memory.h> 254db3d17debef68f72d23999d69ae68b75f59dda3John Reck#include <string> 26ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 27ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Recknamespace android { 28ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Recknamespace uirenderer { 29ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 30ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#define UI_THREAD_FRAME_INFO_SIZE 9 31ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 32c87be99c6ead0720a8918ea38ce3b25e5c49e1c6John Reckenum class FrameInfoIndex { 331b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik Flags = 0, 341b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik IntendedVsync, 351b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik Vsync, 361b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik OldestInputEvent, 371b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik NewestInputEvent, 381b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik HandleInputStart, 391b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik AnimationStart, 401b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik PerformTraversalsStart, 411b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik DrawStart, 42ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck // End of UI frame info 43ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 441b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik SyncStart, 451b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik IssueDrawCommandsStart, 461b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik SwapBuffers, 471b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik FrameCompleted, 48ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 49ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck // Must be the last value! 501b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik NumIndexes 51c87be99c6ead0720a8918ea38ce3b25e5c49e1c6John Reck}; 52ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 532a8bb05a31ddd0d44d8513cba9fbd9b4ef9b97f6John Reckextern const std::string FrameInfoNames[]; 544db3d17debef68f72d23999d69ae68b75f59dda3John Reck 551b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craiknamespace FrameInfoFlags { 561b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik enum { 571b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik WindowLayoutChanged = 1 << 0, 581b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik RTAnimation = 1 << 1, 591b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik SurfaceCanvas = 1 << 2, 601b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik SkippedFrame = 1 << 3, 611b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik }; 62c87be99c6ead0720a8918ea38ce3b25e5c49e1c6John Reck}; 63ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 64ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reckclass ANDROID_API UiFrameInfoBuilder { 65ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reckpublic: 66ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck UiFrameInfoBuilder(int64_t* buffer) : mBuffer(buffer) { 67ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck memset(mBuffer, 0, UI_THREAD_FRAME_INFO_SIZE * sizeof(int64_t)); 68ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck } 69ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 70ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck UiFrameInfoBuilder& setVsync(nsecs_t vsyncTime, nsecs_t intendedVsync) { 711b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik set(FrameInfoIndex::Vsync) = vsyncTime; 721b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik set(FrameInfoIndex::IntendedVsync) = intendedVsync; 73bf3c602284f9a344faf185c3a5e94a264ba44c4fJohn Reck // Pretend the other fields are all at vsync, too, so that naive 74bf3c602284f9a344faf185c3a5e94a264ba44c4fJohn Reck // duration calculations end up being 0 instead of very large 751b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik set(FrameInfoIndex::HandleInputStart) = vsyncTime; 761b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik set(FrameInfoIndex::AnimationStart) = vsyncTime; 771b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik set(FrameInfoIndex::PerformTraversalsStart) = vsyncTime; 781b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik set(FrameInfoIndex::DrawStart) = vsyncTime; 79ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck return *this; 80ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck } 81ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 821b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik UiFrameInfoBuilder& addFlag(int frameInfoFlag) { 831b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik set(FrameInfoIndex::Flags) |= static_cast<uint64_t>(frameInfoFlag); 84ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck return *this; 85ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck } 86ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 87ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reckprivate: 88c87be99c6ead0720a8918ea38ce3b25e5c49e1c6John Reck inline int64_t& set(FrameInfoIndex index) { 89c87be99c6ead0720a8918ea38ce3b25e5c49e1c6John Reck return mBuffer[static_cast<int>(index)]; 90c87be99c6ead0720a8918ea38ce3b25e5c49e1c6John Reck } 91c87be99c6ead0720a8918ea38ce3b25e5c49e1c6John Reck 92ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck int64_t* mBuffer; 93ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck}; 94ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 95ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reckclass FrameInfo { 96ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reckpublic: 97ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck void importUiThreadInfo(int64_t* info); 98ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 99ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck void markSyncStart() { 1001b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik set(FrameInfoIndex::SyncStart) = systemTime(CLOCK_MONOTONIC); 101ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck } 102ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 103ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck void markIssueDrawCommandsStart() { 1041b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik set(FrameInfoIndex::IssueDrawCommandsStart) = systemTime(CLOCK_MONOTONIC); 105ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck } 106ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 107ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck void markSwapBuffers() { 1081b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik set(FrameInfoIndex::SwapBuffers) = systemTime(CLOCK_MONOTONIC); 109ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck } 110ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 111ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck void markFrameCompleted() { 1121b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik set(FrameInfoIndex::FrameCompleted) = systemTime(CLOCK_MONOTONIC); 113ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck } 114ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 1151b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik void addFlag(int frameInfoFlag) { 1161b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik set(FrameInfoIndex::Flags) |= static_cast<uint64_t>(frameInfoFlag); 117240ff6246a29602539fd0295274e1c769e743a2eJohn Reck } 118240ff6246a29602539fd0295274e1c769e743a2eJohn Reck 11941300274cf8efde2ca95d3c767b214d1edb97f8dJohn Reck inline int64_t operator[](FrameInfoIndex index) const { 1201b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik if (index == FrameInfoIndex::NumIndexes) return 0; 121ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck return mFrameInfo[static_cast<int>(index)]; 122ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck } 123ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 12441300274cf8efde2ca95d3c767b214d1edb97f8dJohn Reck inline int64_t operator[](int index) const { 1251b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik if (index < 0 || index >= static_cast<int>(FrameInfoIndex::NumIndexes)) return 0; 126c87be99c6ead0720a8918ea38ce3b25e5c49e1c6John Reck return mFrameInfo[index]; 127ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck } 128ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 12941300274cf8efde2ca95d3c767b214d1edb97f8dJohn Reck inline int64_t duration(FrameInfoIndex start, FrameInfoIndex end) const { 13041300274cf8efde2ca95d3c767b214d1edb97f8dJohn Reck int64_t endtime = mFrameInfo[static_cast<int>(end)]; 13141300274cf8efde2ca95d3c767b214d1edb97f8dJohn Reck int64_t starttime = mFrameInfo[static_cast<int>(start)]; 13241300274cf8efde2ca95d3c767b214d1edb97f8dJohn Reck int64_t gap = endtime - starttime; 13341300274cf8efde2ca95d3c767b214d1edb97f8dJohn Reck gap = starttime > 0 ? gap : 0; 13441300274cf8efde2ca95d3c767b214d1edb97f8dJohn Reck return gap > 0 ? gap : 0; 13541300274cf8efde2ca95d3c767b214d1edb97f8dJohn Reck } 13641300274cf8efde2ca95d3c767b214d1edb97f8dJohn Reck 13741300274cf8efde2ca95d3c767b214d1edb97f8dJohn Reck inline int64_t totalDuration() const { 13841300274cf8efde2ca95d3c767b214d1edb97f8dJohn Reck return duration(FrameInfoIndex::IntendedVsync, FrameInfoIndex::FrameCompleted); 13941300274cf8efde2ca95d3c767b214d1edb97f8dJohn Reck } 14041300274cf8efde2ca95d3c767b214d1edb97f8dJohn Reck 141ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reckprivate: 142c87be99c6ead0720a8918ea38ce3b25e5c49e1c6John Reck inline int64_t& set(FrameInfoIndex index) { 143c87be99c6ead0720a8918ea38ce3b25e5c49e1c6John Reck return mFrameInfo[static_cast<int>(index)]; 144c87be99c6ead0720a8918ea38ce3b25e5c49e1c6John Reck } 145c87be99c6ead0720a8918ea38ce3b25e5c49e1c6John Reck 1461b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik int64_t mFrameInfo[static_cast<int>(FrameInfoIndex::NumIndexes)]; 147ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck}; 148ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 149ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck} /* namespace uirenderer */ 150ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck} /* namespace android */ 151ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 152ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#endif /* FRAMEINFO_H_ */ 153