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