FrameInfo.h revision 240ff6246a29602539fd0295274e1c769e743a2e
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 FRAMEINFO_H_ 17#define FRAMEINFO_H_ 18 19#include "utils/Macros.h" 20 21#include <cutils/compiler.h> 22#include <utils/Timers.h> 23 24#include <memory.h> 25 26namespace android { 27namespace uirenderer { 28 29#define UI_THREAD_FRAME_INFO_SIZE 9 30 31enum class FrameInfoIndex { 32 kFlags = 0, 33 kIntendedVsync, 34 kVsync, 35 kOldestInputEvent, 36 kNewestInputEvent, 37 kHandleInputStart, 38 kAnimationStart, 39 kPerformTraversalsStart, 40 kDrawStart, 41 // End of UI frame info 42 43 kSyncStart, 44 kIssueDrawCommandsStart, 45 kSwapBuffers, 46 kFrameCompleted, 47 48 // Must be the last value! 49 kNumIndexes 50}; 51 52enum class FrameInfoFlags { 53 kWindowLayoutChanged = 1 << 0, 54 kRTAnimation = 1 << 1, 55 kSurfaceCanvas = 1 << 2, 56 kSkippedFrame = 1 << 3, 57}; 58MAKE_FLAGS_ENUM(FrameInfoFlags) 59 60class ANDROID_API UiFrameInfoBuilder { 61public: 62 UiFrameInfoBuilder(int64_t* buffer) : mBuffer(buffer) { 63 memset(mBuffer, 0, UI_THREAD_FRAME_INFO_SIZE * sizeof(int64_t)); 64 } 65 66 UiFrameInfoBuilder& setVsync(nsecs_t vsyncTime, nsecs_t intendedVsync) { 67 set(FrameInfoIndex::kVsync) = vsyncTime; 68 set(FrameInfoIndex::kIntendedVsync) = intendedVsync; 69 return *this; 70 } 71 72 UiFrameInfoBuilder& addFlag(FrameInfoFlags flag) { 73 set(FrameInfoIndex::kFlags) |= static_cast<uint64_t>(flag); 74 return *this; 75 } 76 77private: 78 inline int64_t& set(FrameInfoIndex index) { 79 return mBuffer[static_cast<int>(index)]; 80 } 81 82 int64_t* mBuffer; 83}; 84 85class FrameInfo { 86public: 87 void importUiThreadInfo(int64_t* info); 88 89 void markSyncStart() { 90 set(FrameInfoIndex::kSyncStart) = systemTime(CLOCK_MONOTONIC); 91 } 92 93 void markIssueDrawCommandsStart() { 94 set(FrameInfoIndex::kIssueDrawCommandsStart) = systemTime(CLOCK_MONOTONIC); 95 } 96 97 void markSwapBuffers() { 98 set(FrameInfoIndex::kSwapBuffers) = systemTime(CLOCK_MONOTONIC); 99 } 100 101 void markFrameCompleted() { 102 set(FrameInfoIndex::kFrameCompleted) = systemTime(CLOCK_MONOTONIC); 103 } 104 105 void addFlag(FrameInfoFlags flag) { 106 set(FrameInfoIndex::kFlags) |= static_cast<uint64_t>(flag); 107 } 108 109 int64_t operator[](FrameInfoIndex index) const { 110 if (index == FrameInfoIndex::kNumIndexes) return 0; 111 return mFrameInfo[static_cast<int>(index)]; 112 } 113 114 int64_t operator[](int index) const { 115 if (index < 0 || index >= static_cast<int>(FrameInfoIndex::kNumIndexes)) return 0; 116 return mFrameInfo[index]; 117 } 118 119private: 120 inline int64_t& set(FrameInfoIndex index) { 121 return mFrameInfo[static_cast<int>(index)]; 122 } 123 124 int64_t mFrameInfo[static_cast<int>(FrameInfoIndex::kNumIndexes)]; 125}; 126 127} /* namespace uirenderer */ 128} /* namespace android */ 129 130#endif /* FRAMEINFO_H_ */ 131