Loading services/surfaceflinger/HdrLayerInfoReporter.cpp +19 −0 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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 services/surfaceflinger/HdrLayerInfoReporter.h +15 −0 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading @@ -79,6 +81,8 @@ public: return !mListeners.empty(); } void dump(std::string& result) const; private: mutable std::mutex mMutex; Loading @@ -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 services/surfaceflinger/SurfaceFlinger.cpp +11 −0 Original line number Diff line number Diff line Loading @@ -5750,6 +5750,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)}, Loading Loading @@ -6058,6 +6059,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; Loading Loading @@ -6222,6 +6231,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); Loading services/surfaceflinger/SurfaceFlinger.h +1 −0 Original line number Diff line number Diff line Loading @@ -1086,6 +1086,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, Loading services/surfaceflinger/Tracing/LayerTracing.cpp +3 −2 Original line number Diff line number Diff line Loading @@ -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 Loading
services/surfaceflinger/HdrLayerInfoReporter.cpp +19 −0 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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
services/surfaceflinger/HdrLayerInfoReporter.h +15 −0 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading @@ -79,6 +81,8 @@ public: return !mListeners.empty(); } void dump(std::string& result) const; private: mutable std::mutex mMutex; Loading @@ -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
services/surfaceflinger/SurfaceFlinger.cpp +11 −0 Original line number Diff line number Diff line Loading @@ -5750,6 +5750,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)}, Loading Loading @@ -6058,6 +6059,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; Loading Loading @@ -6222,6 +6231,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); Loading
services/surfaceflinger/SurfaceFlinger.h +1 −0 Original line number Diff line number Diff line Loading @@ -1086,6 +1086,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, Loading
services/surfaceflinger/Tracing/LayerTracing.cpp +3 −2 Original line number Diff line number Diff line Loading @@ -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