FrameInfo.h revision bf3c602284f9a344faf185c3a5e94a264ba44c4f
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 // Pretend the other fields are all at vsync, too, so that naive 70 // duration calculations end up being 0 instead of very large 71 set(FrameInfoIndex::kHandleInputStart) = vsyncTime; 72 set(FrameInfoIndex::kAnimationStart) = vsyncTime; 73 set(FrameInfoIndex::kPerformTraversalsStart) = vsyncTime; 74 set(FrameInfoIndex::kDrawStart) = vsyncTime; 75 return *this; 76 } 77 78 UiFrameInfoBuilder& addFlag(FrameInfoFlags flag) { 79 set(FrameInfoIndex::kFlags) |= static_cast<uint64_t>(flag); 80 return *this; 81 } 82 83private: 84 inline int64_t& set(FrameInfoIndex index) { 85 return mBuffer[static_cast<int>(index)]; 86 } 87 88 int64_t* mBuffer; 89}; 90 91class FrameInfo { 92public: 93 void importUiThreadInfo(int64_t* info); 94 95 void markSyncStart() { 96 set(FrameInfoIndex::kSyncStart) = systemTime(CLOCK_MONOTONIC); 97 } 98 99 void markIssueDrawCommandsStart() { 100 set(FrameInfoIndex::kIssueDrawCommandsStart) = systemTime(CLOCK_MONOTONIC); 101 } 102 103 void markSwapBuffers() { 104 set(FrameInfoIndex::kSwapBuffers) = systemTime(CLOCK_MONOTONIC); 105 } 106 107 void markFrameCompleted() { 108 set(FrameInfoIndex::kFrameCompleted) = systemTime(CLOCK_MONOTONIC); 109 } 110 111 void addFlag(FrameInfoFlags flag) { 112 set(FrameInfoIndex::kFlags) |= static_cast<uint64_t>(flag); 113 } 114 115 int64_t operator[](FrameInfoIndex index) const { 116 if (index == FrameInfoIndex::kNumIndexes) return 0; 117 return mFrameInfo[static_cast<int>(index)]; 118 } 119 120 int64_t operator[](int index) const { 121 if (index < 0 || index >= static_cast<int>(FrameInfoIndex::kNumIndexes)) return 0; 122 return mFrameInfo[index]; 123 } 124 125private: 126 inline int64_t& set(FrameInfoIndex index) { 127 return mFrameInfo[static_cast<int>(index)]; 128 } 129 130 int64_t mFrameInfo[static_cast<int>(FrameInfoIndex::kNumIndexes)]; 131}; 132 133} /* namespace uirenderer */ 134} /* namespace android */ 135 136#endif /* FRAMEINFO_H_ */ 137