| Index: src/gpu/GrLayerCache.cpp
|
| diff --git a/src/gpu/GrLayerCache.cpp b/src/gpu/GrLayerCache.cpp
|
| index 0481d144e585aa45758bfaa347446befbd2030dc..570b2d6eafef15a8558532aa2f785f869786d463 100644
|
| --- a/src/gpu/GrLayerCache.cpp
|
| +++ b/src/gpu/GrLayerCache.cpp
|
| @@ -16,7 +16,6 @@ void GrCachedLayer::validate(const GrTexture* backingTexture) const {
|
| SkASSERT(SK_InvalidGenID != fKey.pictureID());
|
| SkASSERT(fKey.start() >= 0);
|
|
|
| -
|
| if (fTexture) {
|
| // If the layer is in some texture then it must occupy some rectangle
|
| SkASSERT(!fRect.isEmpty());
|
| @@ -43,6 +42,15 @@ void GrCachedLayer::validate(const GrTexture* backingTexture) const {
|
| SkASSERT(fTexture);
|
| SkASSERT(!fRect.isEmpty());
|
| }
|
| +
|
| + // Unfortunately there is a brief time where a layer can be locked
|
| + // but not used, so we can only check the "used implies locked"
|
| + // invariant.
|
| + if (fUses > 0) {
|
| + SkASSERT(fLocked);
|
| + } else {
|
| + SkASSERT(0 == fUses);
|
| + }
|
| }
|
|
|
| class GrAutoValidateLayer : ::SkNoncopyable {
|
| @@ -81,6 +89,7 @@ GrLayerCache::~GrLayerCache() {
|
| SkTDynamicHash<GrCachedLayer, GrCachedLayer::Key>::Iter iter(&fLayerHash);
|
| for (; !iter.done(); ++iter) {
|
| GrCachedLayer* layer = &(*iter);
|
| + SkASSERT(0 == layer->uses());
|
| this->unlock(layer);
|
| SkDELETE(layer);
|
| }
|
| @@ -168,7 +177,7 @@ bool GrLayerCache::lock(GrCachedLayer* layer, const GrTextureDesc& desc, bool do
|
| // Hooray it is still in the atlas - make sure it stays there
|
| SkASSERT(!dontAtlas);
|
| layer->setLocked(true);
|
| - fPlotLocks[layer->plot()->id()]++;
|
| + this->incPlotLock(layer->plot()->id());
|
| return false;
|
| } else if (!dontAtlas && PlausiblyAtlasable(desc.fWidth, desc.fHeight)) {
|
| // Not in the atlas - will it fit?
|
| @@ -193,7 +202,7 @@ bool GrLayerCache::lock(GrCachedLayer* layer, const GrTextureDesc& desc, bool do
|
| layer->setTexture(fAtlas->getTexture(), bounds);
|
| layer->setPlot(plot);
|
| layer->setLocked(true);
|
| - fPlotLocks[layer->plot()->id()]++;
|
| + this->incPlotLock(layer->plot()->id());
|
| return true;
|
| }
|
|
|
| @@ -227,8 +236,7 @@ void GrLayerCache::unlock(GrCachedLayer* layer) {
|
| if (layer->isAtlased()) {
|
| const int plotID = layer->plot()->id();
|
|
|
| - SkASSERT(fPlotLocks[plotID] > 0);
|
| - fPlotLocks[plotID]--;
|
| + this->decPlotLock(plotID);
|
| // At this point we could aggressively clear out un-locked plots but
|
| // by delaying we may be able to reuse some of the atlased layers later.
|
| #if DISABLE_CACHING
|
| @@ -270,7 +278,7 @@ void GrLayerCache::validate() const {
|
| SkASSERT(!pictInfo->fPlotUsage.isEmpty());
|
| #endif
|
| } else {
|
| - // If there is no picture info for this layer then all of its
|
| + // If there is no picture info for this picture then all of its
|
| // layers should be non-atlased.
|
| SkASSERT(!layer->isAtlased());
|
| }
|
| @@ -321,6 +329,7 @@ void GrLayerCache::purge(uint32_t pictureID) {
|
| }
|
|
|
| for (int i = 0; i < toBeRemoved.count(); ++i) {
|
| + SkASSERT(0 == toBeRemoved[i]->uses());
|
| this->unlock(toBeRemoved[i]);
|
| fLayerHash.remove(GrCachedLayer::GetKey(*toBeRemoved[i]));
|
| SkDELETE(toBeRemoved[i]);
|
| @@ -366,6 +375,7 @@ void GrLayerCache::purgePlot(GrPlot* plot) {
|
| }
|
|
|
| for (int i = 0; i < toBeRemoved.count(); ++i) {
|
| + SkASSERT(0 == toBeRemoved[i]->uses());
|
| SkASSERT(!toBeRemoved[i]->locked());
|
|
|
| uint32_t pictureIDToRemove = toBeRemoved[i]->pictureID();
|
|
|