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