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

Commit c0086af0 authored by Jorim Jaggi's avatar Jorim Jaggi
Browse files

Change hwui jank detection to use deadline & gpu completion (2/2)

- Use GPU finish time as well as actual deadline to determine jank
rate.
- Use dynamic interval to adjust for 60/90hz switching
- Move frame metrics reporting into JankTracker to adjust the
deadline communicated to the app when in stuffing scenario.
- Adjust double-stuffing detection to be a bit more readable.

Test: GraphicsStatsValidationTest.java
Test: adb shell dumpsys gfxinfo
Test: FrameMetricsListenerTest
Test: Log output of FrameMetricsObserver
Bug: 169858044
Change-Id: Ia1cae9f0c5358d1cd3bf043289ea8b4d26154737
parent 5dad489a
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -152,6 +152,7 @@ bool DisplayEventDispatcher::processPendingEvents(nsecs_t* outTimestamp,
                    *outCount = ev.vsync.count;
                    *outCount = ev.vsync.count;
                    outVsyncEventData->id = ev.vsync.vsyncId;
                    outVsyncEventData->id = ev.vsync.vsyncId;
                    outVsyncEventData->deadlineTimestamp = ev.vsync.deadlineTimestamp;
                    outVsyncEventData->deadlineTimestamp = ev.vsync.deadlineTimestamp;
                    outVsyncEventData->frameInterval = ev.vsync.frameInterval;
                    break;
                    break;
                case DisplayEventReceiver::DISPLAY_EVENT_HOTPLUG:
                case DisplayEventReceiver::DISPLAY_EVENT_HOTPLUG:
                    dispatchHotplug(ev.header.timestamp, ev.header.displayId, ev.hotplug.connected);
                    dispatchHotplug(ev.header.timestamp, ev.header.displayId, ev.hotplug.connected);
+3 −0
Original line number Original line Diff line number Diff line
@@ -30,6 +30,9 @@ struct VsyncEventData {
    // The deadline in CLOCK_MONOTONIC that the app needs to complete its
    // The deadline in CLOCK_MONOTONIC that the app needs to complete its
    // frame by (both on the CPU and the GPU)
    // frame by (both on the CPU and the GPU)
    int64_t deadlineTimestamp = std::numeric_limits<int64_t>::max();
    int64_t deadlineTimestamp = std::numeric_limits<int64_t>::max();

    // The current frame interval in ns when this frame was scheduled.
    int64_t frameInterval = 0;
};
};


class DisplayEventDispatcher : public LooperCallback {
class DisplayEventDispatcher : public LooperCallback {
+1 −0
Original line number Original line Diff line number Diff line
@@ -75,6 +75,7 @@ public:
            uint32_t count;
            uint32_t count;
            nsecs_t expectedVSyncTimestamp __attribute__((aligned(8)));
            nsecs_t expectedVSyncTimestamp __attribute__((aligned(8)));
            nsecs_t deadlineTimestamp __attribute__((aligned(8)));
            nsecs_t deadlineTimestamp __attribute__((aligned(8)));
            nsecs_t frameInterval __attribute__((aligned(8)));
            int64_t vsyncId;
            int64_t vsyncId;
        };
        };


+2 −1
Original line number Original line Diff line number Diff line
@@ -34,7 +34,8 @@ TEST(DisplayEventStructLayoutTest, TestEventAlignment) {
    CHECK_OFFSET(DisplayEventReceiver::Event::VSync, count, 0);
    CHECK_OFFSET(DisplayEventReceiver::Event::VSync, count, 0);
    CHECK_OFFSET(DisplayEventReceiver::Event::VSync, expectedVSyncTimestamp, 8);
    CHECK_OFFSET(DisplayEventReceiver::Event::VSync, expectedVSyncTimestamp, 8);
    CHECK_OFFSET(DisplayEventReceiver::Event::VSync, deadlineTimestamp, 16);
    CHECK_OFFSET(DisplayEventReceiver::Event::VSync, deadlineTimestamp, 16);
    CHECK_OFFSET(DisplayEventReceiver::Event::VSync, vsyncId, 24);
    CHECK_OFFSET(DisplayEventReceiver::Event::VSync, frameInterval, 24);
    CHECK_OFFSET(DisplayEventReceiver::Event::VSync, vsyncId, 32);


    CHECK_OFFSET(DisplayEventReceiver::Event::Hotplug, connected, 0);
    CHECK_OFFSET(DisplayEventReceiver::Event::Hotplug, connected, 0);


+9 −1
Original line number Original line Diff line number Diff line
@@ -130,7 +130,7 @@ public:
    virtual ~Choreographer() override EXCLUDES(gChoreographers.lock);
    virtual ~Choreographer() override EXCLUDES(gChoreographers.lock);
    int64_t getVsyncId() const;
    int64_t getVsyncId() const;
    int64_t getFrameDeadline() const;
    int64_t getFrameDeadline() const;

    int64_t getFrameInterval() const;


private:
private:
    Choreographer(const Choreographer&) = delete;
    Choreographer(const Choreographer&) = delete;
@@ -418,6 +418,10 @@ int64_t Choreographer::getFrameDeadline() const {
    return mLastVsyncEventData.deadlineTimestamp;
    return mLastVsyncEventData.deadlineTimestamp;
}
}


int64_t Choreographer::getFrameInterval() const {
    return mLastVsyncEventData.frameInterval;
}

} // namespace android
} // namespace android
using namespace android;
using namespace android;


@@ -501,6 +505,10 @@ int64_t AChoreographer_getFrameDeadline(const AChoreographer* choreographer) {
    return AChoreographer_to_Choreographer(choreographer)->getFrameDeadline();
    return AChoreographer_to_Choreographer(choreographer)->getFrameDeadline();
}
}


int64_t AChoreographer_getFrameInterval(const AChoreographer* choreographer) {
    return AChoreographer_to_Choreographer(choreographer)->getFrameInterval();
}

} // namespace android
} // namespace android


/* Glue for the NDK interface */
/* Glue for the NDK interface */
Loading