diff options
Diffstat (limited to 'libs/hwui/FrameInfo.h')
-rw-r--r-- | libs/hwui/FrameInfo.h | 92 |
1 files changed, 57 insertions, 35 deletions
diff --git a/libs/hwui/FrameInfo.h b/libs/hwui/FrameInfo.h index c8189b8..23339ce 100644 --- a/libs/hwui/FrameInfo.h +++ b/libs/hwui/FrameInfo.h @@ -22,6 +22,7 @@ #include <utils/Timers.h> #include <memory.h> +#include <string> namespace android { namespace uirenderer { @@ -29,33 +30,36 @@ namespace uirenderer { #define UI_THREAD_FRAME_INFO_SIZE 9 enum class FrameInfoIndex { - kFlags = 0, - kIntendedVsync, - kVsync, - kOldestInputEvent, - kNewestInputEvent, - kHandleInputStart, - kAnimationStart, - kPerformTraversalsStart, - kDrawStart, + Flags = 0, + IntendedVsync, + Vsync, + OldestInputEvent, + NewestInputEvent, + HandleInputStart, + AnimationStart, + PerformTraversalsStart, + DrawStart, // End of UI frame info - kSyncStart, - kIssueDrawCommandsStart, - kSwapBuffers, - kFrameCompleted, + SyncStart, + IssueDrawCommandsStart, + SwapBuffers, + FrameCompleted, // Must be the last value! - kNumIndexes + NumIndexes }; -enum class FrameInfoFlags { - kWindowLayoutChanged = 1 << 0, - kRTAnimation = 1 << 1, - kSurfaceCanvas = 1 << 2, - kSkippedFrame = 1 << 3, +extern const std::string FrameInfoNames[]; + +namespace FrameInfoFlags { + enum { + WindowLayoutChanged = 1 << 0, + RTAnimation = 1 << 1, + SurfaceCanvas = 1 << 2, + SkippedFrame = 1 << 3, + }; }; -MAKE_FLAGS_ENUM(FrameInfoFlags) class ANDROID_API UiFrameInfoBuilder { public: @@ -64,13 +68,19 @@ public: } UiFrameInfoBuilder& setVsync(nsecs_t vsyncTime, nsecs_t intendedVsync) { - set(FrameInfoIndex::kVsync) = vsyncTime; - set(FrameInfoIndex::kIntendedVsync) = intendedVsync; + set(FrameInfoIndex::Vsync) = vsyncTime; + set(FrameInfoIndex::IntendedVsync) = intendedVsync; + // Pretend the other fields are all at vsync, too, so that naive + // duration calculations end up being 0 instead of very large + set(FrameInfoIndex::HandleInputStart) = vsyncTime; + set(FrameInfoIndex::AnimationStart) = vsyncTime; + set(FrameInfoIndex::PerformTraversalsStart) = vsyncTime; + set(FrameInfoIndex::DrawStart) = vsyncTime; return *this; } - UiFrameInfoBuilder& addFlag(FrameInfoFlags flag) { - set(FrameInfoIndex::kFlags) |= static_cast<uint64_t>(flag); + UiFrameInfoBuilder& addFlag(int frameInfoFlag) { + set(FrameInfoIndex::Flags) |= static_cast<uint64_t>(frameInfoFlag); return *this; } @@ -87,41 +97,53 @@ public: void importUiThreadInfo(int64_t* info); void markSyncStart() { - set(FrameInfoIndex::kSyncStart) = systemTime(CLOCK_MONOTONIC); + set(FrameInfoIndex::SyncStart) = systemTime(CLOCK_MONOTONIC); } void markIssueDrawCommandsStart() { - set(FrameInfoIndex::kIssueDrawCommandsStart) = systemTime(CLOCK_MONOTONIC); + set(FrameInfoIndex::IssueDrawCommandsStart) = systemTime(CLOCK_MONOTONIC); } void markSwapBuffers() { - set(FrameInfoIndex::kSwapBuffers) = systemTime(CLOCK_MONOTONIC); + set(FrameInfoIndex::SwapBuffers) = systemTime(CLOCK_MONOTONIC); } void markFrameCompleted() { - set(FrameInfoIndex::kFrameCompleted) = systemTime(CLOCK_MONOTONIC); + set(FrameInfoIndex::FrameCompleted) = systemTime(CLOCK_MONOTONIC); } - void addFlag(FrameInfoFlags flag) { - set(FrameInfoIndex::kFlags) |= static_cast<uint64_t>(flag); + void addFlag(int frameInfoFlag) { + set(FrameInfoIndex::Flags) |= static_cast<uint64_t>(frameInfoFlag); } - int64_t operator[](FrameInfoIndex index) const { - if (index == FrameInfoIndex::kNumIndexes) return 0; + inline int64_t operator[](FrameInfoIndex index) const { + if (index == FrameInfoIndex::NumIndexes) return 0; return mFrameInfo[static_cast<int>(index)]; } - int64_t operator[](int index) const { - if (index < 0 || index >= static_cast<int>(FrameInfoIndex::kNumIndexes)) return 0; + inline int64_t operator[](int index) const { + if (index < 0 || index >= static_cast<int>(FrameInfoIndex::NumIndexes)) return 0; return mFrameInfo[index]; } + inline int64_t duration(FrameInfoIndex start, FrameInfoIndex end) const { + int64_t endtime = mFrameInfo[static_cast<int>(end)]; + int64_t starttime = mFrameInfo[static_cast<int>(start)]; + int64_t gap = endtime - starttime; + gap = starttime > 0 ? gap : 0; + return gap > 0 ? gap : 0; + } + + inline int64_t totalDuration() const { + return duration(FrameInfoIndex::IntendedVsync, FrameInfoIndex::FrameCompleted); + } + private: inline int64_t& set(FrameInfoIndex index) { return mFrameInfo[static_cast<int>(index)]; } - int64_t mFrameInfo[static_cast<int>(FrameInfoIndex::kNumIndexes)]; + int64_t mFrameInfo[static_cast<int>(FrameInfoIndex::NumIndexes)]; }; } /* namespace uirenderer */ |