FrameInfo.h revision 41300274cf8efde2ca95d3c767b214d1edb97f8d
1ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck/*
2ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * Copyright (C) 2015 The Android Open Source Project
3ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck *
4ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * Licensed under the Apache License, Version 2.0 (the "License");
5ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * you may not use this file except in compliance with the License.
6ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * You may obtain a copy of the License at
7ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck *
8ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck *      http://www.apache.org/licenses/LICENSE-2.0
9ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck *
10ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * Unless required by applicable law or agreed to in writing, software
11ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * distributed under the License is distributed on an "AS IS" BASIS,
12ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * See the License for the specific language governing permissions and
14ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck * limitations under the License.
15ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck */
16ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#ifndef FRAMEINFO_H_
17ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#define FRAMEINFO_H_
18ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
19ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#include "utils/Macros.h"
20ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
21ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#include <cutils/compiler.h>
22ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#include <utils/Timers.h>
23ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
24ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#include <memory.h>
254db3d17debef68f72d23999d69ae68b75f59dda3John Reck#include <string>
26ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
27ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Recknamespace android {
28ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Recknamespace uirenderer {
29ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
30ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#define UI_THREAD_FRAME_INFO_SIZE 9
31ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
32c87be99c6ead0720a8918ea38ce3b25e5c49e1c6John Reckenum class FrameInfoIndex {
331b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik    Flags = 0,
341b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik    IntendedVsync,
351b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik    Vsync,
361b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik    OldestInputEvent,
371b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik    NewestInputEvent,
381b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik    HandleInputStart,
391b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik    AnimationStart,
401b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik    PerformTraversalsStart,
411b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik    DrawStart,
42ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    // End of UI frame info
43ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
441b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik    SyncStart,
451b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik    IssueDrawCommandsStart,
461b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik    SwapBuffers,
471b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik    FrameCompleted,
48ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
49ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    // Must be the last value!
501b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik    NumIndexes
51c87be99c6ead0720a8918ea38ce3b25e5c49e1c6John Reck};
52ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
532a8bb05a31ddd0d44d8513cba9fbd9b4ef9b97f6John Reckextern const std::string FrameInfoNames[];
544db3d17debef68f72d23999d69ae68b75f59dda3John Reck
551b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craiknamespace FrameInfoFlags {
561b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik    enum {
571b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik        WindowLayoutChanged = 1 << 0,
581b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik        RTAnimation = 1 << 1,
591b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik        SurfaceCanvas = 1 << 2,
601b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik        SkippedFrame = 1 << 3,
611b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik    };
62c87be99c6ead0720a8918ea38ce3b25e5c49e1c6John Reck};
63ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
64ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reckclass ANDROID_API UiFrameInfoBuilder {
65ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reckpublic:
66ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    UiFrameInfoBuilder(int64_t* buffer) : mBuffer(buffer) {
67ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck        memset(mBuffer, 0, UI_THREAD_FRAME_INFO_SIZE * sizeof(int64_t));
68ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    }
69ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
70ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    UiFrameInfoBuilder& setVsync(nsecs_t vsyncTime, nsecs_t intendedVsync) {
711b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik        set(FrameInfoIndex::Vsync) = vsyncTime;
721b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik        set(FrameInfoIndex::IntendedVsync) = intendedVsync;
73bf3c602284f9a344faf185c3a5e94a264ba44c4fJohn Reck        // Pretend the other fields are all at vsync, too, so that naive
74bf3c602284f9a344faf185c3a5e94a264ba44c4fJohn Reck        // duration calculations end up being 0 instead of very large
751b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik        set(FrameInfoIndex::HandleInputStart) = vsyncTime;
761b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik        set(FrameInfoIndex::AnimationStart) = vsyncTime;
771b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik        set(FrameInfoIndex::PerformTraversalsStart) = vsyncTime;
781b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik        set(FrameInfoIndex::DrawStart) = vsyncTime;
79ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck        return *this;
80ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    }
81ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
821b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik    UiFrameInfoBuilder& addFlag(int frameInfoFlag) {
831b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik        set(FrameInfoIndex::Flags) |= static_cast<uint64_t>(frameInfoFlag);
84ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck        return *this;
85ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    }
86ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
87ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reckprivate:
88c87be99c6ead0720a8918ea38ce3b25e5c49e1c6John Reck    inline int64_t& set(FrameInfoIndex index) {
89c87be99c6ead0720a8918ea38ce3b25e5c49e1c6John Reck        return mBuffer[static_cast<int>(index)];
90c87be99c6ead0720a8918ea38ce3b25e5c49e1c6John Reck    }
91c87be99c6ead0720a8918ea38ce3b25e5c49e1c6John Reck
92ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    int64_t* mBuffer;
93ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck};
94ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
95ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reckclass FrameInfo {
96ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reckpublic:
97ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    void importUiThreadInfo(int64_t* info);
98ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
99ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    void markSyncStart() {
1001b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik        set(FrameInfoIndex::SyncStart) = systemTime(CLOCK_MONOTONIC);
101ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    }
102ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
103ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    void markIssueDrawCommandsStart() {
1041b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik        set(FrameInfoIndex::IssueDrawCommandsStart) = systemTime(CLOCK_MONOTONIC);
105ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    }
106ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
107ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    void markSwapBuffers() {
1081b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik        set(FrameInfoIndex::SwapBuffers) = systemTime(CLOCK_MONOTONIC);
109ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    }
110ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
111ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    void markFrameCompleted() {
1121b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik        set(FrameInfoIndex::FrameCompleted) = systemTime(CLOCK_MONOTONIC);
113ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    }
114ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
1151b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik    void addFlag(int frameInfoFlag) {
1161b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik        set(FrameInfoIndex::Flags) |= static_cast<uint64_t>(frameInfoFlag);
117240ff6246a29602539fd0295274e1c769e743a2eJohn Reck    }
118240ff6246a29602539fd0295274e1c769e743a2eJohn Reck
11941300274cf8efde2ca95d3c767b214d1edb97f8dJohn Reck    inline int64_t operator[](FrameInfoIndex index) const {
1201b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik        if (index == FrameInfoIndex::NumIndexes) return 0;
121ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck        return mFrameInfo[static_cast<int>(index)];
122ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    }
123ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
12441300274cf8efde2ca95d3c767b214d1edb97f8dJohn Reck    inline int64_t operator[](int index) const {
1251b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik        if (index < 0 || index >= static_cast<int>(FrameInfoIndex::NumIndexes)) return 0;
126c87be99c6ead0720a8918ea38ce3b25e5c49e1c6John Reck        return mFrameInfo[index];
127ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    }
128ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
12941300274cf8efde2ca95d3c767b214d1edb97f8dJohn Reck    inline int64_t duration(FrameInfoIndex start, FrameInfoIndex end) const {
13041300274cf8efde2ca95d3c767b214d1edb97f8dJohn Reck        int64_t endtime = mFrameInfo[static_cast<int>(end)];
13141300274cf8efde2ca95d3c767b214d1edb97f8dJohn Reck        int64_t starttime = mFrameInfo[static_cast<int>(start)];
13241300274cf8efde2ca95d3c767b214d1edb97f8dJohn Reck        int64_t gap = endtime - starttime;
13341300274cf8efde2ca95d3c767b214d1edb97f8dJohn Reck        gap = starttime > 0 ? gap : 0;
13441300274cf8efde2ca95d3c767b214d1edb97f8dJohn Reck        return gap > 0 ? gap : 0;
13541300274cf8efde2ca95d3c767b214d1edb97f8dJohn Reck    }
13641300274cf8efde2ca95d3c767b214d1edb97f8dJohn Reck
13741300274cf8efde2ca95d3c767b214d1edb97f8dJohn Reck    inline int64_t totalDuration() const {
13841300274cf8efde2ca95d3c767b214d1edb97f8dJohn Reck        return duration(FrameInfoIndex::IntendedVsync, FrameInfoIndex::FrameCompleted);
13941300274cf8efde2ca95d3c767b214d1edb97f8dJohn Reck    }
14041300274cf8efde2ca95d3c767b214d1edb97f8dJohn Reck
141ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reckprivate:
142c87be99c6ead0720a8918ea38ce3b25e5c49e1c6John Reck    inline int64_t& set(FrameInfoIndex index) {
143c87be99c6ead0720a8918ea38ce3b25e5c49e1c6John Reck        return mFrameInfo[static_cast<int>(index)];
144c87be99c6ead0720a8918ea38ce3b25e5c49e1c6John Reck    }
145c87be99c6ead0720a8918ea38ce3b25e5c49e1c6John Reck
1461b54fb27ac48495ed0b33868fda5776fb49fe0f3Chris Craik    int64_t mFrameInfo[static_cast<int>(FrameInfoIndex::NumIndexes)];
147ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck};
148ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
149ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck} /* namespace uirenderer */
150ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck} /* namespace android */
151ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
152ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#endif /* FRAMEINFO_H_ */
153