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

Commit d05a745a authored by Alec Mouri's avatar Alec Mouri
Browse files

Add metrics for logging SurfaceControl events

Currently, we log whenever dataspaces change on a layer. We also log
when a layer is destroyed, so that we can log its last dataspace.

Bug: 329474645
Flag: EXEMPT logging
Test: GraphicsAtomTests

Change-Id: I06f4591a1b523cb565923c7d6e4103f0e294d8ad
parent aa2d404b
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -82,6 +82,7 @@ cc_defaults {
        "libpowermanager",
        "libprocessgroup",
        "libprotobuf-cpp-lite",
        "libstatslog_surfaceflinger",
        "libsync",
        "libui",
        "libutils",
@@ -314,3 +315,37 @@ cc_library_shared {
        "libSurfaceFlingerProperties",
    ],
}

cc_library {
    name: "libstatslog_surfaceflinger",
    generated_sources: ["statslog_surfaceflinger.cpp"],
    generated_headers: ["statslog_surfaceflinger.h"],
    export_generated_headers: ["statslog_surfaceflinger.h"],
    shared_libs: [
        "libbinder",
        "libstatsbootstrap",
        "libutils",
        "android.os.statsbootstrap_aidl-cpp",
    ],
}

genrule {
    name: "statslog_surfaceflinger.h",
    tools: ["stats-log-api-gen"],
    cmd: "$(location stats-log-api-gen) --header $(genDir)/statslog_surfaceflinger.h" +
        " --module surfaceflinger --namespace android,surfaceflinger,stats --bootstrap",
    out: [
        "statslog_surfaceflinger.h",
    ],
}

genrule {
    name: "statslog_surfaceflinger.cpp",
    tools: ["stats-log-api-gen"],
    cmd: "$(location stats-log-api-gen) --cpp $(genDir)/statslog_surfaceflinger.cpp" +
        " --module surfaceflinger --namespace android,surfaceflinger,stats" +
        " --importHeader statslog_surfaceflinger.h --bootstrap",
    out: [
        "statslog_surfaceflinger.cpp",
    ],
}
+18 −1
Original line number Diff line number Diff line
@@ -186,6 +186,14 @@ Layer::~Layer() {
    mFrameTracker.logAndResetStats(mName);
    mFlinger->onLayerDestroyed(this);

    const auto currentTime = std::chrono::steady_clock::now();
    if (mBufferInfo.mTimeSinceDataspaceUpdate > std::chrono::steady_clock::time_point::min()) {
        mFlinger->mLayerEvents.emplace_back(mOwnerUid, getSequence(), mBufferInfo.mDataspace,
                                            std::chrono::duration_cast<std::chrono::milliseconds>(
                                                    currentTime -
                                                    mBufferInfo.mTimeSinceDataspaceUpdate));
    }

    if (mDrawingState.sidebandStream != nullptr) {
        mFlinger->mTunnelModeEnabledReporter->decrementTunnelModeCount();
    }
@@ -1323,8 +1331,17 @@ void Layer::gatherBufferInfo() {
            }
        }
    }
    if (lastDataspace != mBufferInfo.mDataspace) {
    if (lastDataspace != mBufferInfo.mDataspace ||
        mBufferInfo.mTimeSinceDataspaceUpdate == std::chrono::steady_clock::time_point::min()) {
        mFlinger->mHdrLayerInfoChanged = true;
        const auto currentTime = std::chrono::steady_clock::now();
        if (mBufferInfo.mTimeSinceDataspaceUpdate > std::chrono::steady_clock::time_point::min()) {
            mFlinger->mLayerEvents
                    .emplace_back(mOwnerUid, getSequence(), lastDataspace,
                                  std::chrono::duration_cast<std::chrono::milliseconds>(
                                          currentTime - mBufferInfo.mTimeSinceDataspaceUpdate));
        }
        mBufferInfo.mTimeSinceDataspaceUpdate = currentTime;
    }
    if (mBufferInfo.mDesiredHdrSdrRatio != mDrawingState.desiredHdrSdrRatio) {
        mBufferInfo.mDesiredHdrSdrRatio = mDrawingState.desiredHdrSdrRatio;
+2 −0
Original line number Diff line number Diff line
@@ -242,6 +242,8 @@ public:
        sp<Fence> mFence;
        uint32_t mTransform{0};
        ui::Dataspace mDataspace{ui::Dataspace::UNKNOWN};
        std::chrono::steady_clock::time_point mTimeSinceDataspaceUpdate =
                std::chrono::steady_clock::time_point::min();
        Rect mCrop;
        PixelFormat mPixelFormat{PIXEL_FORMAT_NONE};
        bool mTransformToDisplayInverse{false};
+14 −0
Original line number Diff line number Diff line
@@ -83,6 +83,7 @@
#include <renderengine/RenderEngine.h>
#include <renderengine/impl/ExternalTexture.h>
#include <scheduler/FrameTargeter.h>
#include <statslog_surfaceflinger.h>
#include <sys/types.h>
#include <ui/ColorSpace.h>
#include <ui/DebugUtils.h>
@@ -3157,6 +3158,19 @@ void SurfaceFlinger::onCompositionPresented(PhysicalDisplayId pacesetterId,
        mAddingHDRLayerInfoListener = false;
    }

    for (const auto& layerEvent : mLayerEvents) {
        auto result =
                stats::stats_write(stats::SURFACE_CONTROL_EVENT,
                                   static_cast<int32_t>(layerEvent.uid),
                                   static_cast<int64_t>(layerEvent.timeSinceLastEvent.count()),
                                   static_cast<int32_t>(layerEvent.dataspace));
        if (result < 0) {
            ALOGW("Failed to report layer event with error: %d", result);
        }
    }

    mLayerEvents.clear();

    if (haveNewListeners || mHdrLayerInfoChanged) {
        for (auto& [compositionDisplay, listener] : hdrInfoListeners) {
            HdrLayerInfoReporter::HdrLayerInfo info;
+8 −0
Original line number Diff line number Diff line
@@ -1221,6 +1221,14 @@ private:

    bool mHdrLayerInfoChanged = false;

    struct LayerEvent {
        uid_t uid;
        int32_t layerId;
        ui::Dataspace dataspace;
        std::chrono::milliseconds timeSinceLastEvent;
    };
    std::vector<LayerEvent> mLayerEvents;

    // Used to ensure we omit a callback when HDR layer info listener is newly added but the
    // scene hasn't changed
    bool mAddingHDRLayerInfoListener = false;
Loading