From e22aec741f1530cde86c38989bcc2f87626b93b0 Mon Sep 17 00:00:00 2001 From: Dan Stoza Date: Mon, 1 Aug 2016 13:20:59 -0700 Subject: [PATCH] SF/HWC2: Add a layer minidump Adds a brief dump of visible HWC layers to replace functionality that was lost when moving from HWC1 to HWC2. Bug: 30242002 Change-Id: I7331517c7d1eb515b33d5db85cdaf23d8b9ae9d9 --- services/surfaceflinger/Layer.cpp | 74 ++++++++++++++++++++++++++---- services/surfaceflinger/Layer.h | 6 +++ services/surfaceflinger/SurfaceFlinger.cpp | 20 ++++++++ 3 files changed, 90 insertions(+), 10 deletions(-) diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 2a3c229c35..0f8da5d41e 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -591,19 +591,25 @@ void Layer::setGeometry( const Transform& tr(displayDevice->getTransform()); Rect transformedFrame = tr.transform(frame); auto error = hwcLayer->setDisplayFrame(transformedFrame); - ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set display frame " - "[%d, %d, %d, %d]: %s (%d)", mName.string(), transformedFrame.left, - transformedFrame.top, transformedFrame.right, - transformedFrame.bottom, to_string(error).c_str(), - static_cast(error)); + if (error != HWC2::Error::None) { + ALOGE("[%s] Failed to set display frame [%d, %d, %d, %d]: %s (%d)", + mName.string(), transformedFrame.left, transformedFrame.top, + transformedFrame.right, transformedFrame.bottom, + to_string(error).c_str(), static_cast(error)); + } else { + hwcInfo.displayFrame = transformedFrame; + } FloatRect sourceCrop = computeCrop(displayDevice); error = hwcLayer->setSourceCrop(sourceCrop); - ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set source crop " - "[%.3f, %.3f, %.3f, %.3f]: %s (%d)", mName.string(), - sourceCrop.left, sourceCrop.top, sourceCrop.right, - sourceCrop.bottom, to_string(error).c_str(), - static_cast(error)); + if (error != HWC2::Error::None) { + ALOGE("[%s] Failed to set source crop [%.3f, %.3f, %.3f, %.3f]: " + "%s (%d)", mName.string(), sourceCrop.left, sourceCrop.top, + sourceCrop.right, sourceCrop.bottom, to_string(error).c_str(), + static_cast(error)); + } else { + hwcInfo.sourceCrop = sourceCrop; + } error = hwcLayer->setPlaneAlpha(s.alpha); ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set plane alpha %.3f: " @@ -2230,6 +2236,54 @@ void Layer::dump(String8& result, Colorizer& colorizer) const } } +#ifdef USE_HWC2 +void Layer::miniDumpHeader(String8& result) { + result.append("----------------------------------------"); + result.append("---------------------------------------\n"); + result.append(" Layer name\n"); + result.append(" Z | "); + result.append(" Comp Type | "); + result.append(" Disp Frame (LTRB) | "); + result.append(" Source Crop (LTRB)\n"); + result.append("----------------------------------------"); + result.append("---------------------------------------\n"); +} + +void Layer::miniDump(String8& result, int32_t hwcId) const { + if (mHwcLayers.count(hwcId) == 0) { + return; + } + + String8 name; + if (mName.length() > 77) { + std::string shortened; + shortened.append(mName.string(), 36); + shortened.append("[...]"); + shortened.append(mName.string() + (mName.length() - 36), 36); + name = shortened.c_str(); + } else { + name = mName; + } + + result.appendFormat(" %s\n", name.string()); + + const Layer::State& layerState(getDrawingState()); + const HWCInfo& hwcInfo = mHwcLayers.at(hwcId); + result.appendFormat(" %10u | ", layerState.z); + result.appendFormat("%10s | ", + to_string(getCompositionType(hwcId)).c_str()); + const Rect& frame = hwcInfo.displayFrame; + result.appendFormat("%4d %4d %4d %4d | ", frame.left, frame.top, + frame.right, frame.bottom); + const FloatRect& crop = hwcInfo.sourceCrop; + result.appendFormat("%6.1f %6.1f %6.1f %6.1f\n", crop.left, crop.top, + crop.right, crop.bottom); + + result.append("- - - - - - - - - - - - - - - - - - - - "); + result.append("- - - - - - - - - - - - - - - - - - - -\n"); +} +#endif + void Layer::dumpFrameStats(String8& result) const { mFrameTracker.dumpStats(result); } diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index c070539da8..b1859486f9 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -402,6 +402,10 @@ public: /* always call base class first */ void dump(String8& result, Colorizer& colorizer) const; +#ifdef USE_HWC2 + static void miniDumpHeader(String8& result); + void miniDump(String8& result, int32_t hwcId) const; +#endif void dumpFrameStats(String8& result) const; void clearFrameStats(); void logFrameStats(); @@ -588,6 +592,8 @@ private: bool forceClientComposition; HWC2::Composition compositionType; bool clearClientTarget; + Rect displayFrame; + FloatRect sourceCrop; }; std::unordered_map mHwcLayers; #else diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index a36a8cdaf5..715ce9995a 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -3039,6 +3039,26 @@ void SurfaceFlinger::dumpAllLocked(const Vector& args, size_t& index, * VSYNC state */ mEventThread->dump(result); + result.append("\n"); + + /* + * HWC layer minidump + */ + for (size_t d = 0; d < mDisplays.size(); d++) { + const sp& displayDevice(mDisplays[d]); + int32_t hwcId = displayDevice->getHwcDisplayId(); + if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) { + continue; + } + + result.appendFormat("Display %d HWC layers:\n", hwcId); + Layer::miniDumpHeader(result); + for (size_t l = 0; l < count; l++) { + const sp& layer(currentLayers[l]); + layer->miniDump(result, hwcId); + } + result.append("\n"); + } /* * Dump HWComposer state -- 2.11.0