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

Commit 4b505376 authored by caiqinl's avatar caiqinl Committed by Digish Pandya
Browse files

Fix native memory leak caused by small HWUI path cache creation

HWUI calculates the texture size as w*h*bpp. In some cases, the
calculated path cache is small, but the actual memory allocated
in driver is 4k/8k/16k, much bigger than HWUI calculates.

Example: a 5*65 alpha texture, HWUI think it is 5*65*1 = 325 bytes,
but driver allocates 8K. An app can allocates up to 32M path textures,
which actually consumes 32M*(8*1024/325) = 806M memory.

Here we limit the number of path texture in the cache to 256, it
should be a pretty generous global limit.

Change-Id: I890819b73bb0b7f63e96bc3d9d0ff9469c16838c
parent e40ab185
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -138,7 +138,7 @@ static void drawPath(const SkPath *path, const SkPaint* paint, SkBitmap& bitmap,

PathCache::PathCache():
        mCache(LruCache<PathDescription, PathTexture*>::kUnlimitedCapacity),
        mSize(0), mMaxSize(MB(DEFAULT_PATH_CACHE_SIZE)) {
        mSize(0), mMaxSize(MB(DEFAULT_PATH_CACHE_SIZE)), mTexNum(0) {
    char property[PROPERTY_VALUE_MAX];
    if (property_get(PROPERTY_PATH_CACHE_SIZE, property, nullptr) > 0) {
        INIT_LOGD("  Setting %s cache size to %sMB", name, property);
@@ -202,6 +202,7 @@ void PathCache::removeTexture(PathTexture* texture) {
                        "the cache in an inconsistent state", size);
            }
            mSize -= size;
            mTexNum--;
        }

        PATH_LOGD("PathCache::delete name, size, mSize = %d, %d, %d",
@@ -228,7 +229,7 @@ void PathCache::purgeCache(uint32_t width, uint32_t height) {
}

void PathCache::trim() {
    while (mSize > mMaxSize) {
    while (mSize > mMaxSize || mTexNum > DEFAULT_PATH_TEXTURE_CAP) {
        mCache.removeOldest();
    }
}
@@ -299,6 +300,7 @@ void PathCache::generateTexture(SkBitmap& bitmap, Texture* texture) {

    texture->setFilter(GL_LINEAR);
    texture->setWrap(GL_CLAMP_TO_EDGE);
    mTexNum++;
}

///////////////////////////////////////////////////////////////////////////////
+6 −0
Original line number Diff line number Diff line
@@ -306,6 +306,12 @@ private:

    bool mDebugEnabled;

    /**
     * Driver allocated 4k/8k/16k memory for small path cache,
     * limit the number of PathTexture in case occupy too much memory in hardware.
     */
    uint32_t mTexNum;

    sp<PathProcessor> mProcessor;

    Vector<uint32_t> mGarbage;
+3 −0
Original line number Diff line number Diff line
@@ -249,6 +249,9 @@ enum DebugLevel {
#define DEFAULT_TEXT_BLACK_GAMMA_THRESHOLD 64
#define DEFAULT_TEXT_WHITE_GAMMA_THRESHOLD 192

// cap to 256 to limite paths in the path cache
#define DEFAULT_PATH_TEXTURE_CAP 256

///////////////////////////////////////////////////////////////////////////////
// Misc
///////////////////////////////////////////////////////////////////////////////