Merge "Don't crash Launcher on config change." into honeycomb
This commit is contained in:
@@ -129,7 +129,7 @@ DisplayList::~DisplayList() {
|
|||||||
mBitmapResources.clear();
|
mBitmapResources.clear();
|
||||||
|
|
||||||
for (size_t i = 0; i < mShaders.size(); i++) {
|
for (size_t i = 0; i < mShaders.size(); i++) {
|
||||||
delete mShaders.itemAt(i);
|
caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
|
||||||
}
|
}
|
||||||
mShaders.clear();
|
mShaders.clear();
|
||||||
|
|
||||||
@@ -181,7 +181,9 @@ void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorde
|
|||||||
|
|
||||||
const Vector<SkiaShader*> &shaders = recorder.getShaders();
|
const Vector<SkiaShader*> &shaders = recorder.getShaders();
|
||||||
for (size_t i = 0; i < shaders.size(); i++) {
|
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();
|
const Vector<SkPaint*> &paints = recorder.getPaints();
|
||||||
@@ -405,10 +407,14 @@ void DisplayListRenderer::reset() {
|
|||||||
}
|
}
|
||||||
mBitmapResources.clear();
|
mBitmapResources.clear();
|
||||||
|
|
||||||
mPaints.clear();
|
for (size_t i = 0; i < mShaders.size(); i++) {
|
||||||
mPaintMap.clear();
|
caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
|
||||||
|
}
|
||||||
mShaders.clear();
|
mShaders.clear();
|
||||||
mShaderMap.clear();
|
mShaderMap.clear();
|
||||||
|
|
||||||
|
mPaints.clear();
|
||||||
|
mPaintMap.clear();
|
||||||
mMatrices.clear();
|
mMatrices.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -417,6 +417,7 @@ private:
|
|||||||
shaderCopy = shader->copy();
|
shaderCopy = shader->copy();
|
||||||
mShaderMap.add(shader, shaderCopy);
|
mShaderMap.add(shader, shaderCopy);
|
||||||
mShaders.add(shaderCopy);
|
mShaders.add(shaderCopy);
|
||||||
|
Caches::getInstance().resourceCache.incrementRefcount(shaderCopy);
|
||||||
}
|
}
|
||||||
|
|
||||||
addInt((int) shaderCopy);
|
addInt((int) shaderCopy);
|
||||||
|
|||||||
@@ -67,12 +67,12 @@ void ResourceCache::incrementRefcount(SkBitmap* bitmapResource) {
|
|||||||
|
|
||||||
void ResourceCache::incrementRefcount(SkiaShader* shaderResource) {
|
void ResourceCache::incrementRefcount(SkiaShader* shaderResource) {
|
||||||
shaderResource->getSkShader()->safeRef();
|
shaderResource->getSkShader()->safeRef();
|
||||||
incrementRefcount((void*)shaderResource, kShader);
|
incrementRefcount((void*) shaderResource, kShader);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResourceCache::incrementRefcount(SkiaColorFilter* filterResource) {
|
void ResourceCache::incrementRefcount(SkiaColorFilter* filterResource) {
|
||||||
filterResource->getSkColorFilter()->safeRef();
|
filterResource->getSkColorFilter()->safeRef();
|
||||||
incrementRefcount((void*)filterResource, kColorFilter);
|
incrementRefcount((void*) filterResource, kColorFilter);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResourceCache::decrementRefcount(void* resource) {
|
void ResourceCache::decrementRefcount(void* resource) {
|
||||||
@@ -91,17 +91,17 @@ void ResourceCache::decrementRefcount(void* resource) {
|
|||||||
void ResourceCache::decrementRefcount(SkBitmap* bitmapResource) {
|
void ResourceCache::decrementRefcount(SkBitmap* bitmapResource) {
|
||||||
bitmapResource->pixelRef()->safeUnref();
|
bitmapResource->pixelRef()->safeUnref();
|
||||||
bitmapResource->getColorTable()->safeUnref();
|
bitmapResource->getColorTable()->safeUnref();
|
||||||
decrementRefcount((void*)bitmapResource);
|
decrementRefcount((void*) bitmapResource);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResourceCache::decrementRefcount(SkiaShader* shaderResource) {
|
void ResourceCache::decrementRefcount(SkiaShader* shaderResource) {
|
||||||
shaderResource->getSkShader()->safeUnref();
|
shaderResource->getSkShader()->safeUnref();
|
||||||
decrementRefcount((void*)shaderResource);
|
decrementRefcount((void*) shaderResource);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResourceCache::decrementRefcount(SkiaColorFilter* filterResource) {
|
void ResourceCache::decrementRefcount(SkiaColorFilter* filterResource) {
|
||||||
filterResource->getSkColorFilter()->safeUnref();
|
filterResource->getSkColorFilter()->safeUnref();
|
||||||
decrementRefcount((void*)filterResource);
|
decrementRefcount((void*) filterResource);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResourceCache::recycle(SkBitmap* resource) {
|
void ResourceCache::recycle(SkBitmap* resource) {
|
||||||
|
|||||||
@@ -205,9 +205,12 @@ SkiaLinearGradientShader::~SkiaLinearGradientShader() {
|
|||||||
SkiaShader* SkiaLinearGradientShader::copy() {
|
SkiaShader* SkiaLinearGradientShader::copy() {
|
||||||
SkiaLinearGradientShader* copy = new SkiaLinearGradientShader();
|
SkiaLinearGradientShader* copy = new SkiaLinearGradientShader();
|
||||||
copy->copyFrom(*this);
|
copy->copyFrom(*this);
|
||||||
copy->mBounds = mBounds;
|
copy->mBounds = new float[4];
|
||||||
copy->mColors = mColors;
|
memcpy(copy->mBounds, mBounds, sizeof(float) * 4);
|
||||||
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;
|
copy->mCount = mCount;
|
||||||
return copy;
|
return copy;
|
||||||
}
|
}
|
||||||
@@ -270,8 +273,10 @@ SkiaCircularGradientShader::SkiaCircularGradientShader(float x, float y, float r
|
|||||||
SkiaShader* SkiaCircularGradientShader::copy() {
|
SkiaShader* SkiaCircularGradientShader::copy() {
|
||||||
SkiaCircularGradientShader* copy = new SkiaCircularGradientShader();
|
SkiaCircularGradientShader* copy = new SkiaCircularGradientShader();
|
||||||
copy->copyFrom(*this);
|
copy->copyFrom(*this);
|
||||||
copy->mColors = mColors;
|
copy->mColors = new uint32_t[mCount];
|
||||||
copy->mPositions = mPositions;
|
memcpy(copy->mColors, mColors, sizeof(uint32_t) * mCount);
|
||||||
|
copy->mPositions = new float[mCount];
|
||||||
|
memcpy(copy->mPositions, mPositions, sizeof(float) * mCount);
|
||||||
copy->mCount = mCount;
|
copy->mCount = mCount;
|
||||||
return copy;
|
return copy;
|
||||||
}
|
}
|
||||||
@@ -317,8 +322,10 @@ SkiaSweepGradientShader::~SkiaSweepGradientShader() {
|
|||||||
SkiaShader* SkiaSweepGradientShader::copy() {
|
SkiaShader* SkiaSweepGradientShader::copy() {
|
||||||
SkiaSweepGradientShader* copy = new SkiaSweepGradientShader();
|
SkiaSweepGradientShader* copy = new SkiaSweepGradientShader();
|
||||||
copy->copyFrom(*this);
|
copy->copyFrom(*this);
|
||||||
copy->mColors = mColors;
|
copy->mColors = new uint32_t[mCount];
|
||||||
copy->mPositions = mPositions;
|
memcpy(copy->mColors, mColors, sizeof(uint32_t) * mCount);
|
||||||
|
copy->mPositions = new float[mCount];
|
||||||
|
memcpy(copy->mPositions, mPositions, sizeof(float) * mCount);
|
||||||
copy->mCount = mCount;
|
copy->mCount = mCount;
|
||||||
return copy;
|
return copy;
|
||||||
}
|
}
|
||||||
@@ -362,15 +369,24 @@ void SkiaSweepGradientShader::updateTransforms(Program* program, const mat4& mod
|
|||||||
SkiaComposeShader::SkiaComposeShader(SkiaShader* first, SkiaShader* second,
|
SkiaComposeShader::SkiaComposeShader(SkiaShader* first, SkiaShader* second,
|
||||||
SkXfermode::Mode mode, SkShader* key):
|
SkXfermode::Mode mode, SkShader* key):
|
||||||
SkiaShader(kCompose, key, SkShader::kClamp_TileMode, SkShader::kClamp_TileMode,
|
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() {
|
SkiaShader* SkiaComposeShader::copy() {
|
||||||
SkiaComposeShader* copy = new SkiaComposeShader();
|
SkiaComposeShader* copy = new SkiaComposeShader();
|
||||||
copy->copyFrom(*this);
|
copy->copyFrom(*this);
|
||||||
copy->mFirst = mFirst;
|
copy->mFirst = mFirst->copy();
|
||||||
copy->mSecond = mSecond;
|
copy->mSecond = mSecond->copy();
|
||||||
copy->mMode = mMode;
|
copy->mMode = mMode;
|
||||||
|
copy->cleanup();
|
||||||
return copy;
|
return copy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -234,6 +234,7 @@ private:
|
|||||||
*/
|
*/
|
||||||
struct SkiaComposeShader: public SkiaShader {
|
struct SkiaComposeShader: public SkiaShader {
|
||||||
SkiaComposeShader(SkiaShader* first, SkiaShader* second, SkXfermode::Mode mode, SkShader* key);
|
SkiaComposeShader(SkiaShader* first, SkiaShader* second, SkXfermode::Mode mode, SkShader* key);
|
||||||
|
~SkiaComposeShader();
|
||||||
SkiaShader* copy();
|
SkiaShader* copy();
|
||||||
|
|
||||||
void set(TextureCache* textureCache, GradientCache* gradientCache);
|
void set(TextureCache* textureCache, GradientCache* gradientCache);
|
||||||
@@ -243,12 +244,18 @@ struct SkiaComposeShader: public SkiaShader {
|
|||||||
GLuint* textureUnit);
|
GLuint* textureUnit);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SkiaComposeShader() {
|
SkiaComposeShader(): mCleanup(false) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void cleanup() {
|
||||||
|
mCleanup = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
SkiaShader* mFirst;
|
SkiaShader* mFirst;
|
||||||
SkiaShader* mSecond;
|
SkiaShader* mSecond;
|
||||||
SkXfermode::Mode mMode;
|
SkXfermode::Mode mMode;
|
||||||
|
|
||||||
|
bool mCleanup;
|
||||||
}; // struct SkiaComposeShader
|
}; // struct SkiaComposeShader
|
||||||
|
|
||||||
}; // namespace uirenderer
|
}; // namespace uirenderer
|
||||||
|
|||||||
Reference in New Issue
Block a user