Loading libs/hwui/Caches.cpp +2 −8 Original line number Diff line number Diff line Loading @@ -195,12 +195,7 @@ void Caches::dumpMemoryUsage(String8 &log) { log.appendFormat(" PatchCache %8d / %8d\n", patchCache.getSize(), patchCache.getMaxSize()); const uint32_t sizeA8 = fontRenderer.getFontRendererSize(GL_ALPHA); const uint32_t sizeRGBA = fontRenderer.getFontRendererSize(GL_RGBA); log.appendFormat(" FontRenderer A8 %8d / %8d\n", sizeA8, sizeA8); log.appendFormat(" FontRenderer RGBA %8d / %8d\n", sizeRGBA, sizeRGBA); log.appendFormat(" FontRenderer total %8d / %8d\n", sizeA8 + sizeRGBA, sizeA8 + sizeRGBA); fontRenderer.dumpMemoryUsage(log); log.appendFormat("Other:\n"); log.appendFormat(" FboCache %8d / %8d\n", Loading @@ -213,8 +208,7 @@ void Caches::dumpMemoryUsage(String8 &log) { total += tessellationCache.getSize(); total += dropShadowCache.getSize(); total += patchCache.getSize(); total += fontRenderer.getFontRendererSize(GL_ALPHA); total += fontRenderer.getFontRendererSize(GL_RGBA); total += fontRenderer.getSize(); log.appendFormat("Total memory usage:\n"); log.appendFormat(" %d bytes, %.2f MB\n", total, total / 1024.0f / 1024.0f); Loading libs/hwui/FontRenderer.cpp +53 −4 Original line number Diff line number Diff line Loading @@ -747,19 +747,68 @@ static uint32_t calculateCacheSize(const std::vector<CacheTexture*>& cacheTextur return size; } uint32_t FontRenderer::getCacheSize(GLenum format) const { static uint32_t calculateFreeCacheSize(const std::vector<CacheTexture*>& cacheTextures) { uint32_t size = 0; for (uint32_t i = 0; i < cacheTextures.size(); i++) { CacheTexture* cacheTexture = cacheTextures[i]; if (cacheTexture && cacheTexture->getPixelBuffer()) { size += cacheTexture->calculateFreeMemory(); } } return size; } const std::vector<CacheTexture*>& FontRenderer::cacheTexturesForFormat(GLenum format) const { switch (format) { case GL_ALPHA: { return calculateCacheSize(mACacheTextures); return mACacheTextures; } case GL_RGBA: { return calculateCacheSize(mRGBACacheTextures); return mRGBACacheTextures; } default: { return 0; LOG_ALWAYS_FATAL("Unsupported format: %d", format); // Impossible to hit this, but the compiler doesn't know that return *(new std::vector<CacheTexture*>()); } } } static void dumpTextures(String8& log, const char* tag, const std::vector<CacheTexture*>& cacheTextures) { for (uint32_t i = 0; i < cacheTextures.size(); i++) { CacheTexture* cacheTexture = cacheTextures[i]; if (cacheTexture && cacheTexture->getPixelBuffer()) { uint32_t free = cacheTexture->calculateFreeMemory(); uint32_t total = cacheTexture->getPixelBuffer()->getSize(); log.appendFormat(" %-4s texture %d %8d / %8d\n", tag, i, total - free, total); } } } void FontRenderer::dumpMemoryUsage(String8& log) const { const uint32_t sizeA8 = getCacheSize(GL_ALPHA); const uint32_t usedA8 = sizeA8 - getFreeCacheSize(GL_ALPHA); const uint32_t sizeRGBA = getCacheSize(GL_RGBA); const uint32_t usedRGBA = sizeRGBA - getFreeCacheSize(GL_RGBA); log.appendFormat(" FontRenderer A8 %8d / %8d\n", usedA8, sizeA8); dumpTextures(log, "A8", cacheTexturesForFormat(GL_ALPHA)); log.appendFormat(" FontRenderer RGBA %8d / %8d\n", usedRGBA, sizeRGBA); dumpTextures(log, "RGBA", cacheTexturesForFormat(GL_RGBA)); log.appendFormat(" FontRenderer total %8d / %8d\n", usedA8 + usedRGBA, sizeA8 + sizeRGBA); } uint32_t FontRenderer::getCacheSize(GLenum format) const { return calculateCacheSize(cacheTexturesForFormat(format)); } uint32_t FontRenderer::getFreeCacheSize(GLenum format) const { return calculateFreeCacheSize(cacheTexturesForFormat(format)); } uint32_t FontRenderer::getSize() const { return getCacheSize(GL_ALPHA) + getCacheSize(GL_RGBA); } }; // namespace uirenderer }; // namespace android libs/hwui/FontRenderer.h +7 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ #include "font/Font.h" #include <utils/LruCache.h> #include <utils/String8.h> #include <utils/StrongPointer.h> #include <SkPaint.h> Loading Loading @@ -132,7 +133,8 @@ public: mLinearFiltering = linearFiltering; } uint32_t getCacheSize(GLenum format) const; uint32_t getSize() const; void dumpMemoryUsage(String8& log) const; private: friend class Font; Loading Loading @@ -175,6 +177,10 @@ private: mUploadTexture = true; } const std::vector<CacheTexture*>& cacheTexturesForFormat(GLenum format) const; uint32_t getCacheSize(GLenum format) const; uint32_t getFreeCacheSize(GLenum format) const; uint32_t mSmallCacheWidth; uint32_t mSmallCacheHeight; uint32_t mLargeCacheWidth; Loading libs/hwui/GammaFontRenderer.h +12 −2 Original line number Diff line number Diff line Loading @@ -22,6 +22,8 @@ #include <SkPaint.h> #include <utils/String8.h> namespace android { namespace uirenderer { Loading @@ -46,8 +48,16 @@ public: return *mRenderer; } uint32_t getFontRendererSize(GLenum format) const { return mRenderer ? mRenderer->getCacheSize(format) : 0; void dumpMemoryUsage(String8& log) const { if (mRenderer) { mRenderer->dumpMemoryUsage(log); } else { log.appendFormat("FontRenderer doesn't exist.\n"); } } uint32_t getSize() const { return mRenderer ? mRenderer->getSize() : 0; } void endPrecaching(); Loading libs/hwui/font/CacheTexture.cpp +12 −0 Original line number Diff line number Diff line Loading @@ -324,5 +324,17 @@ bool CacheTexture::fitBitmap(const SkGlyph& glyph, uint32_t* retOriginX, uint32_ return false; } uint32_t CacheTexture::calculateFreeMemory() const { CacheBlock* cacheBlock = mCacheBlocks; uint32_t free = 0; // currently only two formats are supported: GL_ALPHA or GL_RGBA; uint32_t bpp = mFormat == GL_RGBA ? 4 : 1; while (cacheBlock) { free += bpp * cacheBlock->mWidth * cacheBlock->mHeight; cacheBlock = cacheBlock->mNext; } return free; } }; // namespace uirenderer }; // namespace android Loading
libs/hwui/Caches.cpp +2 −8 Original line number Diff line number Diff line Loading @@ -195,12 +195,7 @@ void Caches::dumpMemoryUsage(String8 &log) { log.appendFormat(" PatchCache %8d / %8d\n", patchCache.getSize(), patchCache.getMaxSize()); const uint32_t sizeA8 = fontRenderer.getFontRendererSize(GL_ALPHA); const uint32_t sizeRGBA = fontRenderer.getFontRendererSize(GL_RGBA); log.appendFormat(" FontRenderer A8 %8d / %8d\n", sizeA8, sizeA8); log.appendFormat(" FontRenderer RGBA %8d / %8d\n", sizeRGBA, sizeRGBA); log.appendFormat(" FontRenderer total %8d / %8d\n", sizeA8 + sizeRGBA, sizeA8 + sizeRGBA); fontRenderer.dumpMemoryUsage(log); log.appendFormat("Other:\n"); log.appendFormat(" FboCache %8d / %8d\n", Loading @@ -213,8 +208,7 @@ void Caches::dumpMemoryUsage(String8 &log) { total += tessellationCache.getSize(); total += dropShadowCache.getSize(); total += patchCache.getSize(); total += fontRenderer.getFontRendererSize(GL_ALPHA); total += fontRenderer.getFontRendererSize(GL_RGBA); total += fontRenderer.getSize(); log.appendFormat("Total memory usage:\n"); log.appendFormat(" %d bytes, %.2f MB\n", total, total / 1024.0f / 1024.0f); Loading
libs/hwui/FontRenderer.cpp +53 −4 Original line number Diff line number Diff line Loading @@ -747,19 +747,68 @@ static uint32_t calculateCacheSize(const std::vector<CacheTexture*>& cacheTextur return size; } uint32_t FontRenderer::getCacheSize(GLenum format) const { static uint32_t calculateFreeCacheSize(const std::vector<CacheTexture*>& cacheTextures) { uint32_t size = 0; for (uint32_t i = 0; i < cacheTextures.size(); i++) { CacheTexture* cacheTexture = cacheTextures[i]; if (cacheTexture && cacheTexture->getPixelBuffer()) { size += cacheTexture->calculateFreeMemory(); } } return size; } const std::vector<CacheTexture*>& FontRenderer::cacheTexturesForFormat(GLenum format) const { switch (format) { case GL_ALPHA: { return calculateCacheSize(mACacheTextures); return mACacheTextures; } case GL_RGBA: { return calculateCacheSize(mRGBACacheTextures); return mRGBACacheTextures; } default: { return 0; LOG_ALWAYS_FATAL("Unsupported format: %d", format); // Impossible to hit this, but the compiler doesn't know that return *(new std::vector<CacheTexture*>()); } } } static void dumpTextures(String8& log, const char* tag, const std::vector<CacheTexture*>& cacheTextures) { for (uint32_t i = 0; i < cacheTextures.size(); i++) { CacheTexture* cacheTexture = cacheTextures[i]; if (cacheTexture && cacheTexture->getPixelBuffer()) { uint32_t free = cacheTexture->calculateFreeMemory(); uint32_t total = cacheTexture->getPixelBuffer()->getSize(); log.appendFormat(" %-4s texture %d %8d / %8d\n", tag, i, total - free, total); } } } void FontRenderer::dumpMemoryUsage(String8& log) const { const uint32_t sizeA8 = getCacheSize(GL_ALPHA); const uint32_t usedA8 = sizeA8 - getFreeCacheSize(GL_ALPHA); const uint32_t sizeRGBA = getCacheSize(GL_RGBA); const uint32_t usedRGBA = sizeRGBA - getFreeCacheSize(GL_RGBA); log.appendFormat(" FontRenderer A8 %8d / %8d\n", usedA8, sizeA8); dumpTextures(log, "A8", cacheTexturesForFormat(GL_ALPHA)); log.appendFormat(" FontRenderer RGBA %8d / %8d\n", usedRGBA, sizeRGBA); dumpTextures(log, "RGBA", cacheTexturesForFormat(GL_RGBA)); log.appendFormat(" FontRenderer total %8d / %8d\n", usedA8 + usedRGBA, sizeA8 + sizeRGBA); } uint32_t FontRenderer::getCacheSize(GLenum format) const { return calculateCacheSize(cacheTexturesForFormat(format)); } uint32_t FontRenderer::getFreeCacheSize(GLenum format) const { return calculateFreeCacheSize(cacheTexturesForFormat(format)); } uint32_t FontRenderer::getSize() const { return getCacheSize(GL_ALPHA) + getCacheSize(GL_RGBA); } }; // namespace uirenderer }; // namespace android
libs/hwui/FontRenderer.h +7 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ #include "font/Font.h" #include <utils/LruCache.h> #include <utils/String8.h> #include <utils/StrongPointer.h> #include <SkPaint.h> Loading Loading @@ -132,7 +133,8 @@ public: mLinearFiltering = linearFiltering; } uint32_t getCacheSize(GLenum format) const; uint32_t getSize() const; void dumpMemoryUsage(String8& log) const; private: friend class Font; Loading Loading @@ -175,6 +177,10 @@ private: mUploadTexture = true; } const std::vector<CacheTexture*>& cacheTexturesForFormat(GLenum format) const; uint32_t getCacheSize(GLenum format) const; uint32_t getFreeCacheSize(GLenum format) const; uint32_t mSmallCacheWidth; uint32_t mSmallCacheHeight; uint32_t mLargeCacheWidth; Loading
libs/hwui/GammaFontRenderer.h +12 −2 Original line number Diff line number Diff line Loading @@ -22,6 +22,8 @@ #include <SkPaint.h> #include <utils/String8.h> namespace android { namespace uirenderer { Loading @@ -46,8 +48,16 @@ public: return *mRenderer; } uint32_t getFontRendererSize(GLenum format) const { return mRenderer ? mRenderer->getCacheSize(format) : 0; void dumpMemoryUsage(String8& log) const { if (mRenderer) { mRenderer->dumpMemoryUsage(log); } else { log.appendFormat("FontRenderer doesn't exist.\n"); } } uint32_t getSize() const { return mRenderer ? mRenderer->getSize() : 0; } void endPrecaching(); Loading
libs/hwui/font/CacheTexture.cpp +12 −0 Original line number Diff line number Diff line Loading @@ -324,5 +324,17 @@ bool CacheTexture::fitBitmap(const SkGlyph& glyph, uint32_t* retOriginX, uint32_ return false; } uint32_t CacheTexture::calculateFreeMemory() const { CacheBlock* cacheBlock = mCacheBlocks; uint32_t free = 0; // currently only two formats are supported: GL_ALPHA or GL_RGBA; uint32_t bpp = mFormat == GL_RGBA ? 4 : 1; while (cacheBlock) { free += bpp * cacheBlock->mWidth * cacheBlock->mHeight; cacheBlock = cacheBlock->mNext; } return free; } }; // namespace uirenderer }; // namespace android