blob: 8faa80a24a584c826fb03901d9cc7f8d08808f76 [file] [log] [blame]
John Reckba6adf62015-02-19 14:36:50 -08001/*
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
John Reckc87be992015-02-20 10:57:22 -080031enum class FrameInfoIndex {
John Reckba6adf62015-02-19 14:36:50 -080032 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
John Reckc87be992015-02-20 10:57:22 -080050};
John Reckba6adf62015-02-19 14:36:50 -080051
John Reckc87be992015-02-20 10:57:22 -080052enum class FrameInfoFlags {
John Reckba6adf62015-02-19 14:36:50 -080053 kWindowLayoutChanged = 1 << 0,
54 kRTAnimation = 1 << 1,
55 kSurfaceCanvas = 1 << 2,
John Reck240ff622015-04-28 13:50:00 -070056 kSkippedFrame = 1 << 3,
John Reckc87be992015-02-20 10:57:22 -080057};
58MAKE_FLAGS_ENUM(FrameInfoFlags)
John Reckba6adf62015-02-19 14:36:50 -080059
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) {
John Reckc87be992015-02-20 10:57:22 -080067 set(FrameInfoIndex::kVsync) = vsyncTime;
68 set(FrameInfoIndex::kIntendedVsync) = intendedVsync;
John Reckbf3c6022015-06-02 15:55:00 -070069 // 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;
John Reckba6adf62015-02-19 14:36:50 -080075 return *this;
76 }
77
John Reckc87be992015-02-20 10:57:22 -080078 UiFrameInfoBuilder& addFlag(FrameInfoFlags flag) {
79 set(FrameInfoIndex::kFlags) |= static_cast<uint64_t>(flag);
John Reckba6adf62015-02-19 14:36:50 -080080 return *this;
81 }
82
83private:
John Reckc87be992015-02-20 10:57:22 -080084 inline int64_t& set(FrameInfoIndex index) {
85 return mBuffer[static_cast<int>(index)];
86 }
87
John Reckba6adf62015-02-19 14:36:50 -080088 int64_t* mBuffer;
89};
90
91class FrameInfo {
92public:
93 void importUiThreadInfo(int64_t* info);
94
95 void markSyncStart() {
John Reckc87be992015-02-20 10:57:22 -080096 set(FrameInfoIndex::kSyncStart) = systemTime(CLOCK_MONOTONIC);
John Reckba6adf62015-02-19 14:36:50 -080097 }
98
99 void markIssueDrawCommandsStart() {
John Reckc87be992015-02-20 10:57:22 -0800100 set(FrameInfoIndex::kIssueDrawCommandsStart) = systemTime(CLOCK_MONOTONIC);
John Reckba6adf62015-02-19 14:36:50 -0800101 }
102
103 void markSwapBuffers() {
John Reckc87be992015-02-20 10:57:22 -0800104 set(FrameInfoIndex::kSwapBuffers) = systemTime(CLOCK_MONOTONIC);
John Reckba6adf62015-02-19 14:36:50 -0800105 }
106
107 void markFrameCompleted() {
John Reckc87be992015-02-20 10:57:22 -0800108 set(FrameInfoIndex::kFrameCompleted) = systemTime(CLOCK_MONOTONIC);
John Reckba6adf62015-02-19 14:36:50 -0800109 }
110
John Reck240ff622015-04-28 13:50:00 -0700111 void addFlag(FrameInfoFlags flag) {
112 set(FrameInfoIndex::kFlags) |= static_cast<uint64_t>(flag);
113 }
114
John Reckc87be992015-02-20 10:57:22 -0800115 int64_t operator[](FrameInfoIndex index) const {
John Reckba6adf62015-02-19 14:36:50 -0800116 if (index == FrameInfoIndex::kNumIndexes) return 0;
117 return mFrameInfo[static_cast<int>(index)];
118 }
119
120 int64_t operator[](int index) const {
John Reckc87be992015-02-20 10:57:22 -0800121 if (index < 0 || index >= static_cast<int>(FrameInfoIndex::kNumIndexes)) return 0;
122 return mFrameInfo[index];
John Reckba6adf62015-02-19 14:36:50 -0800123 }
124
125private:
John Reckc87be992015-02-20 10:57:22 -0800126 inline int64_t& set(FrameInfoIndex index) {
127 return mFrameInfo[static_cast<int>(index)];
128 }
129
130 int64_t mFrameInfo[static_cast<int>(FrameInfoIndex::kNumIndexes)];
John Reckba6adf62015-02-19 14:36:50 -0800131};
132
133} /* namespace uirenderer */
134} /* namespace android */
135
136#endif /* FRAMEINFO_H_ */