Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 75781c2f authored by Ady Abraham's avatar Ady Abraham
Browse files

hwui: improve RenderThread jank classificaion

Mark UI frames that didn't make it to their expected presentation
due to RenderThread animations as dropped.

Screenshot from Perfetto: https://screenshot.googleplex.com/3pQuNaDYAhHLYu7

Bug: 210605870
Test: manual
Change-Id: I709b2bacbafb8027d97f2fcc39831de7735fc3ff
Merged-In: I709b2bacbafb8027d97f2fcc39831de7735fc3ff
parent aae87b94
Loading
Loading
Loading
Loading
+22 −5
Original line number Diff line number Diff line
@@ -405,8 +405,17 @@ void CanvasContext::prepareTree(TreeInfo& info, int64_t* uiFrameInfo, int64_t sy

    // If the previous frame was dropped we don't need to hold onto it, so
    // just keep using the previous frame's structure instead
    if (!wasSkipped(mCurrentFrameInfo)) {
    if (wasSkipped(mCurrentFrameInfo)) {
        // Use the oldest skipped frame in case we skip more than a single frame
        if (!mSkippedFrameInfo) {
            mSkippedFrameInfo.emplace();
            mSkippedFrameInfo->vsyncId =
                mCurrentFrameInfo->get(FrameInfoIndex::FrameTimelineVsyncId);
            mSkippedFrameInfo->startTime = mCurrentFrameInfo->get(FrameInfoIndex::FrameStartTime);
        }
    } else {
        mCurrentFrameInfo = mJankTracker.startFrame();
        mSkippedFrameInfo.reset();
    }

    mCurrentFrameInfo->importUiThreadInfo(uiFrameInfo);
@@ -602,10 +611,18 @@ void CanvasContext::draw(bool solelyTextureViewUpdates) {
        if (vsyncId != UiFrameInfoBuilder::INVALID_VSYNC_ID) {
            const auto inputEventId =
                    static_cast<int32_t>(mCurrentFrameInfo->get(FrameInfoIndex::InputEventId));
            native_window_set_frame_timeline_info(
                    mNativeSurface->getNativeWindow(), frameCompleteNr, vsyncId, inputEventId,
                    mCurrentFrameInfo->get(FrameInfoIndex::FrameStartTime),
                    solelyTextureViewUpdates);
            const ANativeWindowFrameTimelineInfo ftl = {
                    .frameNumber = frameCompleteNr,
                    .frameTimelineVsyncId = vsyncId,
                    .inputEventId = inputEventId,
                    .startTimeNanos = mCurrentFrameInfo->get(FrameInfoIndex::FrameStartTime),
                    .useForRefreshRateSelection = solelyTextureViewUpdates,
                    .skippedFrameVsyncId = mSkippedFrameInfo ? mSkippedFrameInfo->vsyncId
                                                             : UiFrameInfoBuilder::INVALID_VSYNC_ID,
                    .skippedFrameStartTimeNanos =
                            mSkippedFrameInfo ? mSkippedFrameInfo->startTime : 0,
            };
            native_window_set_frame_timeline_info(mNativeSurface->getNativeWindow(), ftl);
        }
    }

+6 −0
Original line number Diff line number Diff line
@@ -366,6 +366,12 @@ private:

    ColorMode mColorMode = ColorMode::Default;
    float mTargetSdrHdrRatio = 1.f;

    struct SkippedFrameInfo {
        int64_t vsyncId;
        int64_t startTime;
    };
    std::optional<SkippedFrameInfo> mSkippedFrameInfo;
};

} /* namespace renderthread */