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

Commit 2a3d29dc authored by John Reck's avatar John Reck
Browse files

Add dump of hdr event history

Track & dump the HDRLayerInfo callback history to
aid debugging when HDR brightness changes aren't
happening

Bug: 234181960
Test: adb shell dumpsys surfaceflinger --hdrinfo
Change-Id: Ia8376517877d4c7844af6be4d488299554c164f5
parent eabdb615
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -18,14 +18,22 @@
#define LOG_TAG "HdrLayerInfoReporter"
#define ATRACE_TAG ATRACE_TAG_GRAPHICS

#include <android-base/stringprintf.h>
#include <inttypes.h>
#include <utils/Trace.h>

#include "HdrLayerInfoReporter.h"

namespace android {

using base::StringAppendF;

void HdrLayerInfoReporter::dispatchHdrLayerInfo(const HdrLayerInfo& info) {
    ATRACE_CALL();
    if (mHdrInfoHistory.size() == 0 || mHdrInfoHistory.back().info != info) {
        mHdrInfoHistory.next() = EventHistoryEntry{info};
    }

    std::vector<sp<gui::IHdrLayerInfoListener>> toInvoke;
    {
        std::scoped_lock lock(mMutex);
@@ -62,4 +70,15 @@ void HdrLayerInfoReporter::removeListener(const sp<gui::IHdrLayerInfoListener>&
    mListeners.erase(wp<IBinder>(IInterface::asBinder(listener)));
}

void HdrLayerInfoReporter::dump(std::string& result) const {
    for (size_t i = 0; i < mHdrInfoHistory.size(); i++) {
        const auto& event = mHdrInfoHistory[i];
        const auto& info = event.info;
        StringAppendF(&result,
                      "%" PRId64 ": numHdrLayers(%d), size(%dx%d), flags(%X), desiredRatio(%.2f)\n",
                      event.timestamp, info.numberOfHdrLayers, info.maxW, info.maxH, info.flags,
                      info.maxDesiredHdrSdrRatio);
    }
}

} // namespace android
 No newline at end of file
+15 −0
Original line number Diff line number Diff line
@@ -19,9 +19,11 @@
#include <android-base/thread_annotations.h>
#include <android/gui/IHdrLayerInfoListener.h>
#include <binder/IBinder.h>
#include <utils/Timers.h>

#include <unordered_map>

#include "Utils/RingBuffer.h"
#include "WpHash.h"

namespace android {
@@ -79,6 +81,8 @@ public:
        return !mListeners.empty();
    }

    void dump(std::string& result) const;

private:
    mutable std::mutex mMutex;

@@ -88,6 +92,17 @@ private:
    };

    std::unordered_map<wp<IBinder>, TrackedListener, WpHash> mListeners GUARDED_BY(mMutex);

    struct EventHistoryEntry {
        nsecs_t timestamp = -1;
        HdrLayerInfo info;

        EventHistoryEntry() {}

        EventHistoryEntry(const HdrLayerInfo& info) : info(info) { timestamp = systemTime(); }
    };

    utils::RingBuffer<EventHistoryEntry, 32> mHdrInfoHistory;
};

} // namespace android
 No newline at end of file
+11 −0
Original line number Diff line number Diff line
@@ -5806,6 +5806,7 @@ status_t SurfaceFlinger::doDump(int fd, const DumpArgs& args, bool asProto) {
                {"--edid"s, argsDumper(&SurfaceFlinger::dumpRawDisplayIdentificationData)},
                {"--events"s, dumper(&SurfaceFlinger::dumpEvents)},
                {"--frametimeline"s, argsDumper(&SurfaceFlinger::dumpFrameTimeline)},
                {"--hdrinfo"s, dumper(&SurfaceFlinger::dumpHdrInfo)},
                {"--hwclayers"s, dumper(&SurfaceFlinger::dumpHwcLayersMinidumpLockedLegacy)},
                {"--latency"s, argsDumper(&SurfaceFlinger::dumpStatsLocked)},
                {"--latency-clear"s, argsDumper(&SurfaceFlinger::clearStatsLocked)},
@@ -6114,6 +6115,14 @@ void SurfaceFlinger::dumpWideColorInfo(std::string& result) const {
    result.append("\n");
}

void SurfaceFlinger::dumpHdrInfo(std::string& result) const {
    for (const auto& [displayId, listener] : mHdrLayerInfoListeners) {
        StringAppendF(&result, "HDR events for display %" PRIu64 "\n", displayId.value);
        listener->dump(result);
        result.append("\n");
    }
}

LayersProto SurfaceFlinger::dumpDrawingStateProto(uint32_t traceFlags) const {
    std::unordered_set<uint64_t> stackIdsToSkip;

@@ -6278,6 +6287,8 @@ void SurfaceFlinger::dumpAllLocked(const DumpArgs& args, const std::string& comp
    result.append("\nWide-Color information:\n");
    dumpWideColorInfo(result);

    dumpHdrInfo(result);

    colorizer.bold(result);
    result.append("Sync configuration: ");
    colorizer.reset(result);
+1 −0
Original line number Diff line number Diff line
@@ -1088,6 +1088,7 @@ private:
    void dumpDisplayIdentificationData(std::string& result) const REQUIRES(mStateLock);
    void dumpRawDisplayIdentificationData(const DumpArgs&, std::string& result) const;
    void dumpWideColorInfo(std::string& result) const REQUIRES(mStateLock);
    void dumpHdrInfo(std::string& result) const REQUIRES(mStateLock);

    LayersProto dumpDrawingStateProto(uint32_t traceFlags) const;
    void dumpOffscreenLayersProto(LayersProto& layersProto,
+3 −2
Original line number Diff line number Diff line
@@ -27,12 +27,13 @@
#include <utils/Trace.h>

#include "LayerTracing.h"
#include "RingBuffer.h"
#include "TransactionRingBuffer.h"

namespace android {

LayerTracing::LayerTracing()
      : mBuffer(std::make_unique<RingBuffer<LayersTraceFileProto, LayersTraceProto>>()) {}
      : mBuffer(std::make_unique<TransactionRingBuffer<LayersTraceFileProto, LayersTraceProto>>()) {
}

LayerTracing::~LayerTracing() = default;

Loading