Loading libs/hwui/FrameInfo.h +25 −16 Original line number Diff line number Diff line Loading @@ -28,7 +28,7 @@ namespace uirenderer { #define UI_THREAD_FRAME_INFO_SIZE 9 HWUI_ENUM(FrameInfoIndex, enum class FrameInfoIndex { kFlags = 0, kIntendedVsync, kVsync, Loading @@ -47,13 +47,14 @@ HWUI_ENUM(FrameInfoIndex, // Must be the last value! kNumIndexes ); }; HWUI_ENUM(FrameInfoFlags, enum class FrameInfoFlags { kWindowLayoutChanged = 1 << 0, kRTAnimation = 1 << 1, kSurfaceCanvas = 1 << 2, ); }; MAKE_FLAGS_ENUM(FrameInfoFlags) class ANDROID_API UiFrameInfoBuilder { public: Loading @@ -62,17 +63,21 @@ public: } UiFrameInfoBuilder& setVsync(nsecs_t vsyncTime, nsecs_t intendedVsync) { mBuffer[FrameInfoIndex::kVsync] = vsyncTime; mBuffer[FrameInfoIndex::kIntendedVsync] = intendedVsync; set(FrameInfoIndex::kVsync) = vsyncTime; set(FrameInfoIndex::kIntendedVsync) = intendedVsync; return *this; } UiFrameInfoBuilder& addFlag(FrameInfoFlagsEnum flag) { mBuffer[FrameInfoIndex::kFlags] |= static_cast<uint64_t>(flag); UiFrameInfoBuilder& addFlag(FrameInfoFlags flag) { set(FrameInfoIndex::kFlags) |= static_cast<uint64_t>(flag); return *this; } private: inline int64_t& set(FrameInfoIndex index) { return mBuffer[static_cast<int>(index)]; } int64_t* mBuffer; }; Loading @@ -81,33 +86,37 @@ public: void importUiThreadInfo(int64_t* info); void markSyncStart() { mFrameInfo[FrameInfoIndex::kSyncStart] = systemTime(CLOCK_MONOTONIC); set(FrameInfoIndex::kSyncStart) = systemTime(CLOCK_MONOTONIC); } void markIssueDrawCommandsStart() { mFrameInfo[FrameInfoIndex::kIssueDrawCommandsStart] = systemTime(CLOCK_MONOTONIC); set(FrameInfoIndex::kIssueDrawCommandsStart) = systemTime(CLOCK_MONOTONIC); } void markSwapBuffers() { mFrameInfo[FrameInfoIndex::kSwapBuffers] = systemTime(CLOCK_MONOTONIC); set(FrameInfoIndex::kSwapBuffers) = systemTime(CLOCK_MONOTONIC); } void markFrameCompleted() { mFrameInfo[FrameInfoIndex::kFrameCompleted] = systemTime(CLOCK_MONOTONIC); set(FrameInfoIndex::kFrameCompleted) = systemTime(CLOCK_MONOTONIC); } int64_t operator[](FrameInfoIndexEnum index) const { int64_t operator[](FrameInfoIndex index) const { if (index == FrameInfoIndex::kNumIndexes) return 0; return mFrameInfo[static_cast<int>(index)]; } int64_t operator[](int index) const { if (index < 0 || index >= FrameInfoIndex::kNumIndexes) return 0; return mFrameInfo[static_cast<int>(index)]; if (index < 0 || index >= static_cast<int>(FrameInfoIndex::kNumIndexes)) return 0; return mFrameInfo[index]; } private: int64_t mFrameInfo[FrameInfoIndex::kNumIndexes]; inline int64_t& set(FrameInfoIndex index) { return mFrameInfo[static_cast<int>(index)]; } int64_t mFrameInfo[static_cast<int>(FrameInfoIndex::kNumIndexes)]; }; } /* namespace uirenderer */ Loading libs/hwui/JankTracker.cpp +5 −5 Original line number Diff line number Diff line Loading @@ -30,8 +30,8 @@ static const char* JANK_TYPE_NAMES[] = { }; struct Comparison { FrameInfoIndexEnum start; FrameInfoIndexEnum end; FrameInfoIndex start; FrameInfoIndex end; }; static const Comparison COMPARISONS[] = { Loading Loading @@ -91,15 +91,15 @@ void JankTracker::setFrameInterval(nsecs_t frameInterval) { } void JankTracker::addFrame(const FrameInfo& frame) { using namespace FrameInfoIndex; mTotalFrameCount++; // Fast-path for jank-free frames int64_t totalDuration = frame[kFrameCompleted] - frame[kIntendedVsync]; int64_t totalDuration = frame[FrameInfoIndex::kFrameCompleted] - frame[FrameInfoIndex::kIntendedVsync]; if (CC_LIKELY(totalDuration < mFrameInterval)) { return; } if (frame[kFlags] & EXEMPT_FRAMES_FLAGS) { if (frame[FrameInfoIndex::kFlags] & EXEMPT_FRAMES_FLAGS) { return; } Loading libs/hwui/renderthread/CanvasContext.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -399,7 +399,7 @@ void CanvasContext::dumpFrames(int fd) { continue; } fprintf(file, "\n"); for (int i = 0; i < FrameInfoIndex::kNumIndexes; i++) { for (int i = 0; i < static_cast<int>(FrameInfoIndex::kNumIndexes); i++) { fprintf(file, "%" PRId64 ",", frame[i]); } } Loading libs/hwui/renderthread/DrawFrameTask.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -114,7 +114,8 @@ void DrawFrameTask::run() { bool DrawFrameTask::syncFrameState(TreeInfo& info) { ATRACE_CALL(); mRenderThread->timeLord().vsyncReceived(mFrameInfo[FrameInfoIndex::kVsync]); int64_t vsync = mFrameInfo[static_cast<int>(FrameInfoIndex::kVsync)]; mRenderThread->timeLord().vsyncReceived(vsync); mContext->makeCurrent(); Caches::getInstance().textureCache.resetMarkInUse(); Loading libs/hwui/renderthread/RenderProxy.cpp +3 −2 Original line number Diff line number Diff line Loading @@ -52,10 +52,11 @@ namespace renderthread { MethodInvokeRenderTask* task = new MethodInvokeRenderTask((RunnableMethod) Bridge_ ## method); \ ARGS(method) *args = (ARGS(method) *) task->payload() HWUI_ENUM(DumpFlags, enum class DumpFlags { kFrameStats = 1 << 0, kReset = 1 << 1, ); }; MAKE_FLAGS_ENUM(DumpFlags) CREATE_BRIDGE4(createContext, RenderThread* thread, bool translucent, RenderNode* rootRenderNode, IContextFactory* contextFactory) { Loading Loading
libs/hwui/FrameInfo.h +25 −16 Original line number Diff line number Diff line Loading @@ -28,7 +28,7 @@ namespace uirenderer { #define UI_THREAD_FRAME_INFO_SIZE 9 HWUI_ENUM(FrameInfoIndex, enum class FrameInfoIndex { kFlags = 0, kIntendedVsync, kVsync, Loading @@ -47,13 +47,14 @@ HWUI_ENUM(FrameInfoIndex, // Must be the last value! kNumIndexes ); }; HWUI_ENUM(FrameInfoFlags, enum class FrameInfoFlags { kWindowLayoutChanged = 1 << 0, kRTAnimation = 1 << 1, kSurfaceCanvas = 1 << 2, ); }; MAKE_FLAGS_ENUM(FrameInfoFlags) class ANDROID_API UiFrameInfoBuilder { public: Loading @@ -62,17 +63,21 @@ public: } UiFrameInfoBuilder& setVsync(nsecs_t vsyncTime, nsecs_t intendedVsync) { mBuffer[FrameInfoIndex::kVsync] = vsyncTime; mBuffer[FrameInfoIndex::kIntendedVsync] = intendedVsync; set(FrameInfoIndex::kVsync) = vsyncTime; set(FrameInfoIndex::kIntendedVsync) = intendedVsync; return *this; } UiFrameInfoBuilder& addFlag(FrameInfoFlagsEnum flag) { mBuffer[FrameInfoIndex::kFlags] |= static_cast<uint64_t>(flag); UiFrameInfoBuilder& addFlag(FrameInfoFlags flag) { set(FrameInfoIndex::kFlags) |= static_cast<uint64_t>(flag); return *this; } private: inline int64_t& set(FrameInfoIndex index) { return mBuffer[static_cast<int>(index)]; } int64_t* mBuffer; }; Loading @@ -81,33 +86,37 @@ public: void importUiThreadInfo(int64_t* info); void markSyncStart() { mFrameInfo[FrameInfoIndex::kSyncStart] = systemTime(CLOCK_MONOTONIC); set(FrameInfoIndex::kSyncStart) = systemTime(CLOCK_MONOTONIC); } void markIssueDrawCommandsStart() { mFrameInfo[FrameInfoIndex::kIssueDrawCommandsStart] = systemTime(CLOCK_MONOTONIC); set(FrameInfoIndex::kIssueDrawCommandsStart) = systemTime(CLOCK_MONOTONIC); } void markSwapBuffers() { mFrameInfo[FrameInfoIndex::kSwapBuffers] = systemTime(CLOCK_MONOTONIC); set(FrameInfoIndex::kSwapBuffers) = systemTime(CLOCK_MONOTONIC); } void markFrameCompleted() { mFrameInfo[FrameInfoIndex::kFrameCompleted] = systemTime(CLOCK_MONOTONIC); set(FrameInfoIndex::kFrameCompleted) = systemTime(CLOCK_MONOTONIC); } int64_t operator[](FrameInfoIndexEnum index) const { int64_t operator[](FrameInfoIndex index) const { if (index == FrameInfoIndex::kNumIndexes) return 0; return mFrameInfo[static_cast<int>(index)]; } int64_t operator[](int index) const { if (index < 0 || index >= FrameInfoIndex::kNumIndexes) return 0; return mFrameInfo[static_cast<int>(index)]; if (index < 0 || index >= static_cast<int>(FrameInfoIndex::kNumIndexes)) return 0; return mFrameInfo[index]; } private: int64_t mFrameInfo[FrameInfoIndex::kNumIndexes]; inline int64_t& set(FrameInfoIndex index) { return mFrameInfo[static_cast<int>(index)]; } int64_t mFrameInfo[static_cast<int>(FrameInfoIndex::kNumIndexes)]; }; } /* namespace uirenderer */ Loading
libs/hwui/JankTracker.cpp +5 −5 Original line number Diff line number Diff line Loading @@ -30,8 +30,8 @@ static const char* JANK_TYPE_NAMES[] = { }; struct Comparison { FrameInfoIndexEnum start; FrameInfoIndexEnum end; FrameInfoIndex start; FrameInfoIndex end; }; static const Comparison COMPARISONS[] = { Loading Loading @@ -91,15 +91,15 @@ void JankTracker::setFrameInterval(nsecs_t frameInterval) { } void JankTracker::addFrame(const FrameInfo& frame) { using namespace FrameInfoIndex; mTotalFrameCount++; // Fast-path for jank-free frames int64_t totalDuration = frame[kFrameCompleted] - frame[kIntendedVsync]; int64_t totalDuration = frame[FrameInfoIndex::kFrameCompleted] - frame[FrameInfoIndex::kIntendedVsync]; if (CC_LIKELY(totalDuration < mFrameInterval)) { return; } if (frame[kFlags] & EXEMPT_FRAMES_FLAGS) { if (frame[FrameInfoIndex::kFlags] & EXEMPT_FRAMES_FLAGS) { return; } Loading
libs/hwui/renderthread/CanvasContext.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -399,7 +399,7 @@ void CanvasContext::dumpFrames(int fd) { continue; } fprintf(file, "\n"); for (int i = 0; i < FrameInfoIndex::kNumIndexes; i++) { for (int i = 0; i < static_cast<int>(FrameInfoIndex::kNumIndexes); i++) { fprintf(file, "%" PRId64 ",", frame[i]); } } Loading
libs/hwui/renderthread/DrawFrameTask.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -114,7 +114,8 @@ void DrawFrameTask::run() { bool DrawFrameTask::syncFrameState(TreeInfo& info) { ATRACE_CALL(); mRenderThread->timeLord().vsyncReceived(mFrameInfo[FrameInfoIndex::kVsync]); int64_t vsync = mFrameInfo[static_cast<int>(FrameInfoIndex::kVsync)]; mRenderThread->timeLord().vsyncReceived(vsync); mContext->makeCurrent(); Caches::getInstance().textureCache.resetMarkInUse(); Loading
libs/hwui/renderthread/RenderProxy.cpp +3 −2 Original line number Diff line number Diff line Loading @@ -52,10 +52,11 @@ namespace renderthread { MethodInvokeRenderTask* task = new MethodInvokeRenderTask((RunnableMethod) Bridge_ ## method); \ ARGS(method) *args = (ARGS(method) *) task->payload() HWUI_ENUM(DumpFlags, enum class DumpFlags { kFrameStats = 1 << 0, kReset = 1 << 1, ); }; MAKE_FLAGS_ENUM(DumpFlags) CREATE_BRIDGE4(createContext, RenderThread* thread, bool translucent, RenderNode* rootRenderNode, IContextFactory* contextFactory) { Loading