From 4bda6bfaa6b8cb775f18f2453720d05f4cb29152 Mon Sep 17 00:00:00 2001 From: Matt Sarett Date: Mon, 7 Nov 2016 15:43:41 -0500 Subject: [PATCH] Add debug memory tracking to SkiaGLPipeline Test: Sample output is below D/OpenGLRenderer: Resource Cache Usage: D/OpenGLRenderer: 32 items out of 8192 maximum items D/OpenGLRenderer: 4635572 bytes (4.42 MB) out of 96.00 MB maximum This is less verbose than OpenGL memory debug output for two reasons: (1) SkiaGL has less caches. (2) SkiaGL does not support printing on cache additions/evictions. This seems like more of an internal debugging tool rather than a user-facing debug feature. I think it's best to leave this unimplemented until we find that it might be useful. BUG:32370375 Change-Id: Ib063f1c2a7f88e9840341b1001d227f556d88f26 --- libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp | 5 +++++ libs/hwui/pipeline/skia/SkiaPipeline.cpp | 14 ++++++++++++++ libs/hwui/pipeline/skia/SkiaPipeline.h | 3 +++ libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp | 5 +++++ 4 files changed, 27 insertions(+) diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp index 494f14d2a75b7..7d4cf423b1a1f 100644 --- a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp +++ b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp @@ -95,6 +95,11 @@ bool SkiaOpenGLPipeline::draw(const Frame& frame, const SkRect& screenDirty, profileCanvas->flush(); } + // Log memory statistics + if (CC_UNLIKELY(Properties::debugLevel != kDebugDisabled)) { + dumpResourceCacheUsage(); + } + return true; } diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.cpp b/libs/hwui/pipeline/skia/SkiaPipeline.cpp index 03fa266a5c205..1b50531c9a182 100644 --- a/libs/hwui/pipeline/skia/SkiaPipeline.cpp +++ b/libs/hwui/pipeline/skia/SkiaPipeline.cpp @@ -253,6 +253,20 @@ void SkiaPipeline::renderFrame(const LayerUpdateQueue& layers, const SkRect& cli canvas->flush(); } +void SkiaPipeline::dumpResourceCacheUsage() const { + int resources, maxResources; + size_t bytes, maxBytes; + mRenderThread.getGrContext()->getResourceCacheUsage(&resources, &bytes); + mRenderThread.getGrContext()->getResourceCacheLimits(&maxResources, &maxBytes); + + SkString log("Resource Cache Usage:\n"); + log.appendf("%8d items out of %d maximum items\n", resources, maxResources); + log.appendf("%8zu bytes (%.2f MB) out of %.2f MB maximum\n", + bytes, bytes * (1.0f / (1024.0f * 1024.0f)), maxBytes * (1.0f / (1024.0f * 1024.0f))); + + ALOGD("%s", log.c_str()); +} + } /* namespace skiapipeline */ } /* namespace uirenderer */ } /* namespace android */ diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.h b/libs/hwui/pipeline/skia/SkiaPipeline.h index 160046af63a6e..a16fabfe31e9d 100644 --- a/libs/hwui/pipeline/skia/SkiaPipeline.h +++ b/libs/hwui/pipeline/skia/SkiaPipeline.h @@ -96,7 +96,10 @@ public: mSpotShadowAlpha = lightInfo.spotShadowAlpha; mLightCenter = lightGeometry.center; } + protected: + void dumpResourceCacheUsage() const; + renderthread::RenderThread& mRenderThread; private: diff --git a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp index 8fffe91cfe396..da8f504edb7bb 100644 --- a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp +++ b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp @@ -81,6 +81,11 @@ bool SkiaVulkanPipeline::draw(const Frame& frame, const SkRect& screenDirty, profileCanvas->flush(); } + // Log memory statistics + if (CC_UNLIKELY(Properties::debugLevel != kDebugDisabled)) { + dumpResourceCacheUsage(); + } + return true; }