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

Commit 21d94322 authored by Alec Mouri's avatar Alec Mouri
Browse files

Assign previous release fence to previous frame ID

...as otherwise the release timestamps for EGL/Vk timing apis are
shifted by one frame.

Bug: 295456126
Bug: 301055892
Bug: 303385401
Bug: 310927247
Test: Log and inspect timestamps
Change-Id: If1d8a525053591f15b95aeec8dc0bad8a13e6833
parent ecbfa077
Loading
Loading
Loading
Loading
+17 −7
Original line number Original line Diff line number Diff line
@@ -41,6 +41,8 @@
#include <android-base/thread_annotations.h>
#include <android-base/thread_annotations.h>
#include <chrono>
#include <chrono>


#include <com_android_graphics_libgui_flags.h>

using namespace com::android::graphics::libgui;
using namespace com::android::graphics::libgui;
using namespace std::chrono_literals;
using namespace std::chrono_literals;


@@ -102,12 +104,11 @@ void BLASTBufferItemConsumer::addAndGetFrameTimestamps(const NewFrameEventsEntry
    }
    }
}
}


void BLASTBufferItemConsumer::updateFrameTimestamps(uint64_t frameNumber, nsecs_t refreshStartTime,
void BLASTBufferItemConsumer::updateFrameTimestamps(
                                                    const sp<Fence>& glDoneFence,
        uint64_t frameNumber, uint64_t previousFrameNumber, nsecs_t refreshStartTime,
                                                    const sp<Fence>& presentFence,
        const sp<Fence>& glDoneFence, const sp<Fence>& presentFence,
                                                    const sp<Fence>& prevReleaseFence,
        const sp<Fence>& prevReleaseFence, CompositorTiming compositorTiming, nsecs_t latchTime,
                                                    CompositorTiming compositorTiming,
        nsecs_t dequeueReadyTime) {
                                                    nsecs_t latchTime, nsecs_t dequeueReadyTime) {
    Mutex::Autolock lock(mMutex);
    Mutex::Autolock lock(mMutex);


    // if the producer is not connected, don't bother updating,
    // if the producer is not connected, don't bother updating,
@@ -118,7 +119,15 @@ void BLASTBufferItemConsumer::updateFrameTimestamps(uint64_t frameNumber, nsecs_
    std::shared_ptr<FenceTime> releaseFenceTime = std::make_shared<FenceTime>(prevReleaseFence);
    std::shared_ptr<FenceTime> releaseFenceTime = std::make_shared<FenceTime>(prevReleaseFence);


    mFrameEventHistory.addLatch(frameNumber, latchTime);
    mFrameEventHistory.addLatch(frameNumber, latchTime);
    if (flags::frametimestamps_previousrelease()) {
        if (previousFrameNumber > 0) {
            mFrameEventHistory.addRelease(previousFrameNumber, dequeueReadyTime,
                                          std::move(releaseFenceTime));
        }
    } else {
        mFrameEventHistory.addRelease(frameNumber, dequeueReadyTime, std::move(releaseFenceTime));
        mFrameEventHistory.addRelease(frameNumber, dequeueReadyTime, std::move(releaseFenceTime));
    }

    mFrameEventHistory.addPreComposition(frameNumber, refreshStartTime);
    mFrameEventHistory.addPreComposition(frameNumber, refreshStartTime);
    mFrameEventHistory.addPostComposition(frameNumber, glDoneFenceTime, presentFenceTime,
    mFrameEventHistory.addPostComposition(frameNumber, glDoneFenceTime, presentFenceTime,
                                          compositorTiming);
                                          compositorTiming);
@@ -364,6 +373,7 @@ void BLASTBufferQueue::transactionCallback(nsecs_t /*latchTime*/, const sp<Fence
                if (stat.latchTime > 0) {
                if (stat.latchTime > 0) {
                    mBufferItemConsumer
                    mBufferItemConsumer
                            ->updateFrameTimestamps(stat.frameEventStats.frameNumber,
                            ->updateFrameTimestamps(stat.frameEventStats.frameNumber,
                                                    stat.frameEventStats.previousFrameNumber,
                                                    stat.frameEventStats.refreshStartTime,
                                                    stat.frameEventStats.refreshStartTime,
                                                    stat.frameEventStats.gpuCompositionDoneFence,
                                                    stat.frameEventStats.gpuCompositionDoneFence,
                                                    stat.presentFence, stat.previousReleaseFence,
                                                    stat.presentFence, stat.previousReleaseFence,
+14 −0
Original line number Original line Diff line number Diff line
@@ -25,6 +25,10 @@
#include <gui/LayerState.h>
#include <gui/LayerState.h>
#include <private/gui/ParcelUtils.h>
#include <private/gui/ParcelUtils.h>


#include <com_android_graphics_libgui_flags.h>

using namespace com::android::graphics::libgui;

namespace android {
namespace android {


namespace { // Anonymous
namespace { // Anonymous
@@ -49,6 +53,11 @@ status_t FrameEventHistoryStats::writeToParcel(Parcel* output) const {
    status_t err = output->writeUint64(frameNumber);
    status_t err = output->writeUint64(frameNumber);
    if (err != NO_ERROR) return err;
    if (err != NO_ERROR) return err;


    if (flags::frametimestamps_previousrelease()) {
        err = output->writeUint64(previousFrameNumber);
        if (err != NO_ERROR) return err;
    }

    if (gpuCompositionDoneFence) {
    if (gpuCompositionDoneFence) {
        err = output->writeBool(true);
        err = output->writeBool(true);
        if (err != NO_ERROR) return err;
        if (err != NO_ERROR) return err;
@@ -79,6 +88,11 @@ status_t FrameEventHistoryStats::readFromParcel(const Parcel* input) {
    status_t err = input->readUint64(&frameNumber);
    status_t err = input->readUint64(&frameNumber);
    if (err != NO_ERROR) return err;
    if (err != NO_ERROR) return err;


    if (flags::frametimestamps_previousrelease()) {
        err = input->readUint64(&previousFrameNumber);
        if (err != NO_ERROR) return err;
    }

    bool hasFence = false;
    bool hasFence = false;
    err = input->readBool(&hasFence);
    err = input->readBool(&hasFence);
    if (err != NO_ERROR) return err;
    if (err != NO_ERROR) return err;
+2 −2
Original line number Original line Diff line number Diff line
@@ -141,8 +141,8 @@ void BufferQueueFuzzer::invokeBlastBufferQueue() {
    CompositorTiming compTiming;
    CompositorTiming compTiming;
    sp<Fence> previousFence = new Fence(memfd_create("pfd", MFD_ALLOW_SEALING));
    sp<Fence> previousFence = new Fence(memfd_create("pfd", MFD_ALLOW_SEALING));
    sp<Fence> gpuFence = new Fence(memfd_create("gfd", MFD_ALLOW_SEALING));
    sp<Fence> gpuFence = new Fence(memfd_create("gfd", MFD_ALLOW_SEALING));
    FrameEventHistoryStats frameStats(frameNumber, gpuFence, compTiming,
    FrameEventHistoryStats frameStats(frameNumber, mFdp.ConsumeIntegral<uint64_t>(), gpuFence,
                                      mFdp.ConsumeIntegral<int64_t>(),
                                      compTiming, mFdp.ConsumeIntegral<int64_t>(),
                                      mFdp.ConsumeIntegral<int64_t>());
                                      mFdp.ConsumeIntegral<int64_t>());
    std::vector<SurfaceControlStats> stats;
    std::vector<SurfaceControlStats> stats;
    sp<Fence> presentFence = new Fence(memfd_create("fd", MFD_ALLOW_SEALING));
    sp<Fence> presentFence = new Fence(memfd_create("fd", MFD_ALLOW_SEALING));
+2 −2
Original line number Original line Diff line number Diff line
@@ -50,8 +50,8 @@ public:
    void onDisconnect() override EXCLUDES(mMutex);
    void onDisconnect() override EXCLUDES(mMutex);
    void addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps,
    void addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps,
                                  FrameEventHistoryDelta* outDelta) override EXCLUDES(mMutex);
                                  FrameEventHistoryDelta* outDelta) override EXCLUDES(mMutex);
    void updateFrameTimestamps(uint64_t frameNumber, nsecs_t refreshStartTime,
    void updateFrameTimestamps(uint64_t frameNumber, uint64_t previousFrameNumber,
                               const sp<Fence>& gpuCompositionDoneFence,
                               nsecs_t refreshStartTime, const sp<Fence>& gpuCompositionDoneFence,
                               const sp<Fence>& presentFence, const sp<Fence>& prevReleaseFence,
                               const sp<Fence>& presentFence, const sp<Fence>& prevReleaseFence,
                               CompositorTiming compositorTiming, nsecs_t latchTime,
                               CompositorTiming compositorTiming, nsecs_t latchTime,
                               nsecs_t dequeueReadyTime) EXCLUDES(mMutex);
                               nsecs_t dequeueReadyTime) EXCLUDES(mMutex);
+5 −2
Original line number Original line Diff line number Diff line
@@ -95,15 +95,18 @@ public:
    status_t readFromParcel(const Parcel* input) override;
    status_t readFromParcel(const Parcel* input) override;


    FrameEventHistoryStats() = default;
    FrameEventHistoryStats() = default;
    FrameEventHistoryStats(uint64_t fn, const sp<Fence>& gpuCompFence, CompositorTiming compTiming,
    FrameEventHistoryStats(uint64_t frameNumber, uint64_t previousFrameNumber,
                           const sp<Fence>& gpuCompFence, CompositorTiming compTiming,
                           nsecs_t refreshTime, nsecs_t dequeueReadyTime)
                           nsecs_t refreshTime, nsecs_t dequeueReadyTime)
          : frameNumber(fn),
          : frameNumber(frameNumber),
            previousFrameNumber(previousFrameNumber),
            gpuCompositionDoneFence(gpuCompFence),
            gpuCompositionDoneFence(gpuCompFence),
            compositorTiming(compTiming),
            compositorTiming(compTiming),
            refreshStartTime(refreshTime),
            refreshStartTime(refreshTime),
            dequeueReadyTime(dequeueReadyTime) {}
            dequeueReadyTime(dequeueReadyTime) {}


    uint64_t frameNumber;
    uint64_t frameNumber;
    uint64_t previousFrameNumber;
    sp<Fence> gpuCompositionDoneFence;
    sp<Fence> gpuCompositionDoneFence;
    CompositorTiming compositorTiming;
    CompositorTiming compositorTiming;
    nsecs_t refreshStartTime;
    nsecs_t refreshStartTime;
Loading