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

Commit b7f6f3e5 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add per-buffer perfetto trace points for SurfaceFlinger frame events"

parents a3f8b26a 2e1608ff
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -60,11 +60,14 @@ cc_defaults {
    ],
    static_libs: [
        "libcompositionengine",
        "libperfetto_client_experimental",
        "librenderengine",
        "libserviceutils",
        "libtimestats",
        "libtrace_proto",
        "libvr_manager",
        "libvrflinger",
        "perfetto_src_tracing_ipc",
    ],
    header_libs: [
        "android.hardware.graphics.composer@2.1-command-buffer",
@@ -73,8 +76,10 @@ cc_defaults {
    ],
    export_static_lib_headers: [
        "libcompositionengine",
        "libperfetto_client_experimental",
        "librenderengine",
        "libserviceutils",
        "libtimestats",
    ],
    export_shared_lib_headers: [
        "android.hardware.graphics.allocator@2.0",
@@ -160,7 +165,6 @@ filegroup {
        "SurfaceFlinger.cpp",
        "SurfaceInterceptor.cpp",
        "SurfaceTracing.cpp",
        "TimeStats/TimeStats.cpp",
        "TransactionCompletedThread.cpp",
    ],
}
@@ -230,7 +234,6 @@ cc_binary {

subdirs = [
    "layerproto",
    "TimeStats/timestatsproto",
    "tests",
]

+5 −0
Original line number Diff line number Diff line
@@ -314,12 +314,17 @@ bool BufferLayer::onPostComposition(const std::optional<DisplayId>& displayId,

    if (presentFence->isValid()) {
        mFlinger->mTimeStats->setPresentFence(layerID, mCurrentFrameNumber, presentFence);
        mFlinger->mTimeStats->traceFence(layerID, getCurrentBufferId(), mCurrentFrameNumber,
                                         presentFence, TimeStats::FrameEvent::PRESENT_FENCE);
        mFrameTracker.setActualPresentFence(std::shared_ptr<FenceTime>(presentFence));
    } else if (displayId && mFlinger->getHwComposer().isConnected(*displayId)) {
        // The HWC doesn't support present fences, so use the refresh
        // timestamp instead.
        const nsecs_t actualPresentTime = mFlinger->getHwComposer().getRefreshTimestamp(*displayId);
        mFlinger->mTimeStats->setPresentTime(layerID, mCurrentFrameNumber, actualPresentTime);
        mFlinger->mTimeStats->traceTimestamp(layerID, getCurrentBufferId(), mCurrentFrameNumber,
                                             actualPresentTime,
                                             TimeStats::FrameEvent::PRESENT_FENCE);
        mFrameTracker.setActualPresentTime(actualPresentTime);
    }

+20 −0
Original line number Diff line number Diff line
@@ -45,6 +45,14 @@ BufferQueueLayer::~BufferQueueLayer() {

void BufferQueueLayer::onLayerDisplayed(const sp<Fence>& releaseFence) {
    mConsumer->setReleaseFence(releaseFence);

    // Prevent tracing the same release multiple times.
    if (mPreviousFrameNumber != mPreviousReleasedFrameNumber) {
        mFlinger->mTimeStats->traceFence(getSequence(), mPreviousBufferId, mPreviousFrameNumber,
                                         std::make_shared<FenceTime>(releaseFence),
                                         TimeStats::FrameEvent::RELEASE_FENCE);
        mPreviousReleasedFrameNumber = mPreviousFrameNumber;
    }
}

void BufferQueueLayer::setTransformHint(uint32_t orientation) const {
@@ -355,9 +363,15 @@ status_t BufferQueueLayer::updateTexImage(bool& recomputeVisibleRegions, nsecs_t
            mQueuedFrames--;
        }

        uint64_t bufferID = mQueueItems[0].mGraphicBuffer->getId();
        mFlinger->mTimeStats->setAcquireFence(layerID, currentFrameNumber,
                                              mQueueItems[0].mFenceTime);
        mFlinger->mTimeStats->traceFence(layerID, bufferID, currentFrameNumber,
                                         mQueueItems[0].mFenceTime,
                                         TimeStats::FrameEvent::ACQUIRE_FENCE);
        mFlinger->mTimeStats->setLatchTime(layerID, currentFrameNumber, latchTime);
        mFlinger->mTimeStats->traceTimestamp(layerID, bufferID, currentFrameNumber, latchTime,
                                             TimeStats::FrameEvent::LATCH);

        mQueueItems.removeAt(0);
    }
@@ -373,6 +387,7 @@ status_t BufferQueueLayer::updateTexImage(bool& recomputeVisibleRegions, nsecs_t

status_t BufferQueueLayer::updateActiveBuffer() {
    // update the active buffer
    mPreviousBufferId = getCurrentBufferId();
    mActiveBuffer = mConsumer->getCurrentBuffer(&mActiveBufferSlot, &mActiveBufferFence);
    auto& layerCompositionState = getCompositionLayer()->editState().frontEnd;
    layerCompositionState.buffer = mActiveBuffer;
@@ -413,6 +428,11 @@ void BufferQueueLayer::latchPerFrameState(
// -----------------------------------------------------------------------

void BufferQueueLayer::onFrameAvailable(const BufferItem& item) {
    const int32_t layerID = getSequence();
    mFlinger->mTimeStats->traceNewLayer(layerID, getName().c_str());
    mFlinger->mTimeStats->traceTimestamp(layerID, item.mGraphicBuffer->getId(), item.mFrameNumber,
                                         systemTime(), TimeStats::FrameEvent::POST);

    ATRACE_CALL();
    // Add this buffer from our internal queue tracker
    { // Autolock scope
+3 −0
Original line number Diff line number Diff line
@@ -128,6 +128,9 @@ private:
    uint64_t mPreviousFrameNumber{0};
    bool mUpdateTexImageFailed{false};

    uint64_t mPreviousBufferId = 0;
    uint64_t mPreviousReleasedFrameNumber = 0;

    // Local copy of the queued contents of the incoming BufferQueue
    mutable Mutex mQueueItemLock;
    Condition mQueueItemCondition;
+20 −1
Original line number Diff line number Diff line
@@ -87,6 +87,14 @@ void BufferStateLayer::onLayerDisplayed(const sp<Fence>& releaseFence) {
            break;
        }
    }

    // Prevent tracing the same release multiple times.
    if (mPreviousFrameNumber != mPreviousReleasedFrameNumber) {
        mFlinger->mTimeStats->traceFence(getSequence(), mPreviousBufferId, mPreviousFrameNumber,
                                         std::make_shared<FenceTime>(releaseFence),
                                         TimeStats::FrameEvent::RELEASE_FENCE);
        mPreviousReleasedFrameNumber = mPreviousFrameNumber;
    }
}

void BufferStateLayer::setTransformHint(uint32_t /*orientation*/) const {
@@ -226,7 +234,11 @@ bool BufferStateLayer::setBuffer(const sp<GraphicBuffer>& buffer, nsecs_t postTi
    mCurrentState.modified = true;
    setTransactionFlags(eTransactionNeeded);

    mFlinger->mTimeStats->setPostTime(getSequence(), mFrameNumber, getName().c_str(), postTime);
    const int32_t layerID = getSequence();
    mFlinger->mTimeStats->setPostTime(layerID, mFrameNumber, getName().c_str(), postTime);
    mFlinger->mTimeStats->traceNewLayer(layerID, getName().c_str());
    mFlinger->mTimeStats->traceTimestamp(layerID, buffer->getId(), mFrameNumber, postTime,
                                         TimeStats::FrameEvent::POST);
    mCurrentState.desiredPresentTime = desiredPresentTime;

    if (mFlinger->mUseSmart90ForVideo) {
@@ -561,8 +573,13 @@ status_t BufferStateLayer::updateTexImage(bool& /*recomputeVisibleRegions*/, nse
        }
    }

    const uint64_t bufferID = getCurrentBufferId();
    mFlinger->mTimeStats->setAcquireFence(layerID, mFrameNumber, getCurrentFenceTime());
    mFlinger->mTimeStats->traceFence(layerID, bufferID, mFrameNumber, getCurrentFenceTime(),
                                     TimeStats::FrameEvent::ACQUIRE_FENCE);
    mFlinger->mTimeStats->setLatchTime(layerID, mFrameNumber, latchTime);
    mFlinger->mTimeStats->traceTimestamp(layerID, bufferID, mFrameNumber, latchTime,
                                         TimeStats::FrameEvent::LATCH);

    mCurrentStateModified = false;

@@ -576,6 +593,7 @@ status_t BufferStateLayer::updateActiveBuffer() {
        return BAD_VALUE;
    }

    mPreviousBufferId = getCurrentBufferId();
    mActiveBuffer = s.buffer;
    mActiveBufferFence = s.acquireFence;
    auto& layerCompositionState = getCompositionLayer()->editState().frontEnd;
@@ -586,6 +604,7 @@ status_t BufferStateLayer::updateActiveBuffer() {

status_t BufferStateLayer::updateFrameNumber(nsecs_t /*latchTime*/) {
    // TODO(marissaw): support frame history events
    mPreviousFrameNumber = mCurrentFrameNumber;
    mCurrentFrameNumber = mFrameNumber;
    return NO_ERROR;
}
Loading