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
This commit is contained in:
@@ -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++;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Reference in New Issue
Block a user