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

Commit bd7d07ec authored by Vishnu Nair's avatar Vishnu Nair
Browse files

Pass a valid fence time if the acquire fence has not signaled

When we try to latch a buffer with an unsignaled fence, we were passing
Fence::SIGNAL_TIME_PENDING (MAX_INT) as the acquire fence time,
marking all the app frametimeline as missed. This is a short term solution
to provide a reasonable value instead.

Flag: EXEMPT bugfix
Fixes: 344175037
Test: cb test + perfetto
Change-Id: Ia226589c177457f28540b040086903e518796436
parent 6da010d8
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -357,8 +357,12 @@ void SurfaceFrame::setActualQueueTime(nsecs_t actualQueueTime) {

void SurfaceFrame::setAcquireFenceTime(nsecs_t acquireFenceTime) {
    std::scoped_lock lock(mMutex);
    if (CC_UNLIKELY(acquireFenceTime == Fence::SIGNAL_TIME_PENDING)) {
        mActuals.endTime = mActualQueueTime;
    } else {
        mActuals.endTime = std::max(acquireFenceTime, mActualQueueTime);
    }
}

void SurfaceFrame::setDropTime(nsecs_t dropTime) {
    std::scoped_lock lock(mMutex);
+10 −0
Original line number Diff line number Diff line
@@ -458,6 +458,16 @@ TEST_F(FrameTimelineTest, surfaceFrameEndTimeAcquireFenceAfterQueue) {
    EXPECT_EQ(surfaceFrame->getActuals().endTime, 456);
}

TEST_F(FrameTimelineTest, surfaceFrameEndTimeAcquireFenceUnsignaled) {
    auto surfaceFrame = mFrameTimeline->createSurfaceFrameForToken({}, sPidOne, 0, sLayerIdOne,
                                                                   "acquireFenceAfterQueue",
                                                                   "acquireFenceAfterQueue",
                                                                   /*isBuffer*/ true, sGameMode);
    surfaceFrame->setActualQueueTime(123);
    surfaceFrame->setAcquireFenceTime(Fence::SIGNAL_TIME_PENDING);
    EXPECT_EQ(surfaceFrame->getActuals().endTime, 123);
}

TEST_F(FrameTimelineTest, surfaceFrameEndTimeAcquireFenceBeforeQueue) {
    auto surfaceFrame = mFrameTimeline->createSurfaceFrameForToken({}, sPidOne, 0, sLayerIdOne,
                                                                   "acquireFenceAfterQueue",