diff options
Diffstat (limited to 'libs')
| -rw-r--r-- | libs/hwui/DisplayListRenderer.cpp | 14 | ||||
| -rw-r--r-- | libs/hwui/DisplayListRenderer.h | 1 | ||||
| -rw-r--r-- | libs/hwui/ResourceCache.cpp | 10 | ||||
| -rw-r--r-- | libs/hwui/SkiaShader.cpp | 36 | ||||
| -rw-r--r-- | libs/hwui/SkiaShader.h | 9 |
5 files changed, 50 insertions, 20 deletions
diff --git a/libs/hwui/DisplayListRenderer.cpp b/libs/hwui/DisplayListRenderer.cpp index 747543f73009..e3593daeee07 100644 --- a/libs/hwui/DisplayListRenderer.cpp +++ b/libs/hwui/DisplayListRenderer.cpp @@ -129,7 +129,7 @@ DisplayList::~DisplayList() { mBitmapResources.clear(); for (size_t i = 0; i < mShaders.size(); i++) { - delete mShaders.itemAt(i); + caches.resourceCache.decrementRefcount(mShaders.itemAt(i)); } mShaders.clear(); @@ -181,7 +181,9 @@ void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorde const Vector<SkiaShader*> &shaders = recorder.getShaders(); for (size_t i = 0; i < shaders.size(); i++) { - mShaders.add(shaders.itemAt(i)); + SkiaShader* shader = shaders.itemAt(i); + mShaders.add(shader); + caches.resourceCache.incrementRefcount(shader); } const Vector<SkPaint*> &paints = recorder.getPaints(); @@ -405,10 +407,14 @@ void DisplayListRenderer::reset() { } mBitmapResources.clear(); - mPaints.clear(); - mPaintMap.clear(); + for (size_t i = 0; i < mShaders.size(); i++) { + caches.resourceCache.decrementRefcount(mShaders.itemAt(i)); + } mShaders.clear(); mShaderMap.clear(); + + mPaints.clear(); + mPaintMap.clear(); mMatrices.clear(); } diff --git a/libs/hwui/DisplayListRenderer.h b/libs/hwui/DisplayListRenderer.h index f183473fc8f5..71523349f0d3 100644 --- a/libs/hwui/DisplayListRenderer.h +++ b/libs/hwui/DisplayListRenderer.h @@ -417,6 +417,7 @@ private: shaderCopy = shader->copy(); mShaderMap.add(shader, shaderCopy); mShaders.add(shaderCopy); + Caches::getInstance().resourceCache.incrementRefcount(shaderCopy); } addInt((int) shaderCopy); diff --git a/libs/hwui/ResourceCache.cpp b/libs/hwui/ResourceCache.cpp index 00de39b3068b..70d117a3622b 100644 --- a/libs/hwui/ResourceCache.cpp +++ b/libs/hwui/ResourceCache.cpp @@ -67,12 +67,12 @@ void ResourceCache::incrementRefcount(SkBitmap* bitmapResource) { void ResourceCache::incrementRefcount(SkiaShader* shaderResource) { shaderResource->getSkShader()->safeRef(); - incrementRefcount((void*)shaderResource, kShader); + incrementRefcount((void*) shaderResource, kShader); } void ResourceCache::incrementRefcount(SkiaColorFilter* filterResource) { filterResource->getSkColorFilter()->safeRef(); - incrementRefcount((void*)filterResource, kColorFilter); + incrementRefcount((void*) filterResource, kColorFilter); } void ResourceCache::decrementRefcount(void* resource) { @@ -91,17 +91,17 @@ void ResourceCache::decrementRefcount(void* resource) { void ResourceCache::decrementRefcount(SkBitmap* bitmapResource) { bitmapResource->pixelRef()->safeUnref(); bitmapResource->getColorTable()->safeUnref(); - decrementRefcount((void*)bitmapResource); + decrementRefcount((void*) bitmapResource); } void ResourceCache::decrementRefcount(SkiaShader* shaderResource) { shaderResource->getSkShader()->safeUnref(); - decrementRefcount((void*)shaderResource); + decrementRefcount((void*) shaderResource); } void ResourceCache::decrementRefcount(SkiaColorFilter* filterResource) { filterResource->getSkColorFilter()->safeUnref(); - decrementRefcount((void*)filterResource); + decrementRefcount((void*) filterResource); } void ResourceCache::recycle(SkBitmap* resource) { diff --git a/libs/hwui/SkiaShader.cpp b/libs/hwui/SkiaShader.cpp index a1783df53c83..8878c709809e 100644 --- a/libs/hwui/SkiaShader.cpp +++ b/libs/hwui/SkiaShader.cpp @@ -205,9 +205,12 @@ SkiaLinearGradientShader::~SkiaLinearGradientShader() { SkiaShader* SkiaLinearGradientShader::copy() { SkiaLinearGradientShader* copy = new SkiaLinearGradientShader(); copy->copyFrom(*this); - copy->mBounds = mBounds; - copy->mColors = mColors; - copy->mPositions = mPositions; + copy->mBounds = new float[4]; + memcpy(copy->mBounds, mBounds, sizeof(float) * 4); + copy->mColors = new uint32_t[mCount]; + memcpy(copy->mColors, mColors, sizeof(uint32_t) * mCount); + copy->mPositions = new float[mCount]; + memcpy(copy->mPositions, mPositions, sizeof(float) * mCount); copy->mCount = mCount; return copy; } @@ -270,8 +273,10 @@ SkiaCircularGradientShader::SkiaCircularGradientShader(float x, float y, float r SkiaShader* SkiaCircularGradientShader::copy() { SkiaCircularGradientShader* copy = new SkiaCircularGradientShader(); copy->copyFrom(*this); - copy->mColors = mColors; - copy->mPositions = mPositions; + copy->mColors = new uint32_t[mCount]; + memcpy(copy->mColors, mColors, sizeof(uint32_t) * mCount); + copy->mPositions = new float[mCount]; + memcpy(copy->mPositions, mPositions, sizeof(float) * mCount); copy->mCount = mCount; return copy; } @@ -317,8 +322,10 @@ SkiaSweepGradientShader::~SkiaSweepGradientShader() { SkiaShader* SkiaSweepGradientShader::copy() { SkiaSweepGradientShader* copy = new SkiaSweepGradientShader(); copy->copyFrom(*this); - copy->mColors = mColors; - copy->mPositions = mPositions; + copy->mColors = new uint32_t[mCount]; + memcpy(copy->mColors, mColors, sizeof(uint32_t) * mCount); + copy->mPositions = new float[mCount]; + memcpy(copy->mPositions, mPositions, sizeof(float) * mCount); copy->mCount = mCount; return copy; } @@ -362,15 +369,24 @@ void SkiaSweepGradientShader::updateTransforms(Program* program, const mat4& mod SkiaComposeShader::SkiaComposeShader(SkiaShader* first, SkiaShader* second, SkXfermode::Mode mode, SkShader* key): SkiaShader(kCompose, key, SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, - NULL, first->blend() || second->blend()), mFirst(first), mSecond(second), mMode(mode) { + NULL, first->blend() || second->blend()), + mFirst(first), mSecond(second), mMode(mode), mCleanup(false) { +} + +SkiaComposeShader::~SkiaComposeShader() { + if (mCleanup) { + delete mFirst; + delete mSecond; + } } SkiaShader* SkiaComposeShader::copy() { SkiaComposeShader* copy = new SkiaComposeShader(); copy->copyFrom(*this); - copy->mFirst = mFirst; - copy->mSecond = mSecond; + copy->mFirst = mFirst->copy(); + copy->mSecond = mSecond->copy(); copy->mMode = mMode; + copy->cleanup(); return copy; } diff --git a/libs/hwui/SkiaShader.h b/libs/hwui/SkiaShader.h index 1ebde38b740b..89dd131f8ab2 100644 --- a/libs/hwui/SkiaShader.h +++ b/libs/hwui/SkiaShader.h @@ -234,6 +234,7 @@ private: */ struct SkiaComposeShader: public SkiaShader { SkiaComposeShader(SkiaShader* first, SkiaShader* second, SkXfermode::Mode mode, SkShader* key); + ~SkiaComposeShader(); SkiaShader* copy(); void set(TextureCache* textureCache, GradientCache* gradientCache); @@ -243,12 +244,18 @@ struct SkiaComposeShader: public SkiaShader { GLuint* textureUnit); private: - SkiaComposeShader() { + SkiaComposeShader(): mCleanup(false) { + } + + void cleanup() { + mCleanup = true; } SkiaShader* mFirst; SkiaShader* mSecond; SkXfermode::Mode mMode; + + bool mCleanup; }; // struct SkiaComposeShader }; // namespace uirenderer |