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

Commit e78b2ba0 authored by Dennis Kiilerich's avatar Dennis Kiilerich
Browse files

Add tracing for EventThread VSYNC state

This enables seeing whether VSYNC is synthetic, idle, or real VSYNC in Perfetto.

Bug: 342681202

Bug: 404073995

Flag: EXEMPT tracing only update

Test: verified in Perfetto with and without Android Auto Projected
Change-Id: Id303ec71155c61bd67aadd627aab5438ef5fdec8
parent e20c771a
Loading
Loading
Loading
Loading
+17 −4
Original line number Diff line number Diff line
@@ -298,6 +298,7 @@ EventThread::EventThread(const char* name, std::shared_ptr<scheduler::VsyncSched
                         IEventThreadCallback& callback, std::chrono::nanoseconds workDuration,
                         std::chrono::nanoseconds readyDuration)
      : mThreadName(name),
        mEventThreadStateName(base::StringPrintf("EventThreadState-%s", name)),
        mVsyncTracer(base::StringPrintf("VSYNC-%s", name), 0),
        mWorkDuration(base::StringPrintf("VsyncWorkDuration-%s", name), workDuration),
        mReadyDuration(readyDuration),
@@ -328,7 +329,7 @@ EventThread::EventThread(const char* name, std::shared_ptr<scheduler::VsyncSched
EventThread::~EventThread() {
    {
        std::lock_guard<std::mutex> lock(mMutex);
        mState = State::Quit;
        updateState(State::Quit);
        mCondition.notify_all();
    }
    mThread.join();
@@ -439,6 +440,8 @@ void EventThread::enableSyntheticVsync(bool enable) {
        return;
    }

    ALOGD("%s synthetic vsync", enable ? "Enabling" : "Disabling");

    mVSyncState->synthetic = enable;
    mCondition.notify_all();
}
@@ -564,17 +567,17 @@ void EventThread::threadMain(std::unique_lock<std::mutex>& lock) {
            const bool vsyncOmitted =
                    FlagManager::getInstance().no_vsyncs_on_screen_off() && mVSyncState->omitted;
            if (vsyncOmitted) {
                mState = State::Idle;
                updateState(State::Idle);
                SFTRACE_INT("VsyncPendingScreenOn", 1);
            } else {
                mState = mVSyncState->synthetic ? State::SyntheticVSync : State::VSync;
                updateState(mVSyncState->synthetic ? State::SyntheticVSync : State::VSync);
                if (FlagManager::getInstance().no_vsyncs_on_screen_off()) {
                    SFTRACE_INT("VsyncPendingScreenOn", 0);
                }
            }
        } else {
            ALOGW_IF(!mVSyncState, "Ignoring VSYNC request while display is disconnected");
            mState = State::Idle;
            updateState(State::Idle);
        }

        if (mState == State::VSync) {
@@ -820,6 +823,16 @@ void EventThread::dump(std::string& result) const {
    result += '\n';
}

void EventThread::updateState(State state) {
    if (state == mState) {
        return;
    }
    mState = state;

    SFTRACE_ASYNC_FOR_TRACK_END(mEventThreadStateName.c_str(), 0);
    SFTRACE_ASYNC_FOR_TRACK_BEGIN(mEventThreadStateName.c_str(), toCString(mState), 0);
}

const char* EventThread::toCString(State state) {
    switch (state) {
        case State::Idle:
+3 −0
Original line number Diff line number Diff line
@@ -225,6 +225,7 @@ private:
            std::shared_ptr<scheduler::VsyncSchedule>) EXCLUDES(mMutex);

    const char* const mThreadName;
    std::string mEventThreadStateName;
    TracedOrdinal<int> mVsyncTracer;
    TracedOrdinal<std::chrono::nanoseconds> mWorkDuration GUARDED_BY(mMutex);
    std::chrono::nanoseconds mReadyDuration GUARDED_BY(mMutex);
@@ -269,6 +270,8 @@ private:

    State mState GUARDED_BY(mMutex) = State::Idle;

    void updateState(State state) REQUIRES(mMutex);

    static const char* toCString(State);
};