diff options
author | 2014-10-09 12:47:01 -0700 | |
---|---|---|
committer | 2014-10-09 12:47:01 -0700 | |
commit | a32c6bce1b726b6038b97bb64daf8b1fb1eb94e0 (patch) | |
tree | 1d1b0904b078a88c609898c1ae9f48ddb7ead673 /src/gpu/GrLayerCache.cpp | |
parent | e01844540a1d7ab8d768c2b6ccacfcaf23489d51 (diff) |
Revert of Fix bug in plot locking system (patchset #3 id:80001 of https://codereview.chromium.org/640323002/)
Reason for revert:
Failing unit tests
Original issue's description:
> Fix bug in plot locking system
>
> In the new MultiPictureDraw tests a single hoisted layer is reused multiple times. The previous plot locking scheme allowed GrCachedLayer objects to be aggressively deleted prematurely leaving the reusing GrHoistedLayer objects with dangling pointers.
>
> This CL changes the plot locking system to add a pseudo-ref for each GrHoistedLayer.
>
> NOTRY=true
>
> Committed: https://skia.googlesource.com/skia/+/5c481666c9678f43e039ad605457be3854cf8de3
TBR=jvanverth@google.com
NOTREECHECKS=true
NOTRY=true
Review URL: https://codereview.chromium.org/643673004
Diffstat (limited to 'src/gpu/GrLayerCache.cpp')
-rw-r--r-- | src/gpu/GrLayerCache.cpp | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/src/gpu/GrLayerCache.cpp b/src/gpu/GrLayerCache.cpp index 50f7abe830..0481d144e5 100644 --- a/src/gpu/GrLayerCache.cpp +++ b/src/gpu/GrLayerCache.cpp @@ -153,12 +153,14 @@ bool GrLayerCache::lock(GrCachedLayer* layer, const GrTextureDesc& desc, bool do if (layer->locked()) { // This layer is already locked +#ifdef SK_DEBUG if (layer->isAtlased()) { - this->incPlotLock(layer->plot()->id()); + // It claims to be atlased SkASSERT(!dontAtlas); SkASSERT(layer->rect().width() == desc.fWidth); SkASSERT(layer->rect().height() == desc.fHeight); } +#endif return false; } @@ -166,7 +168,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); - this->incPlotLock(layer->plot()->id()); + fPlotLocks[layer->plot()->id()]++; return false; } else if (!dontAtlas && PlausiblyAtlasable(desc.fWidth, desc.fHeight)) { // Not in the atlas - will it fit? @@ -191,7 +193,7 @@ bool GrLayerCache::lock(GrCachedLayer* layer, const GrTextureDesc& desc, bool do layer->setTexture(fAtlas->getTexture(), bounds); layer->setPlot(plot); layer->setLocked(true); - this->incPlotLock(layer->plot()->id()); + fPlotLocks[layer->plot()->id()]++; return true; } @@ -217,7 +219,7 @@ bool GrLayerCache::lock(GrCachedLayer* layer, const GrTextureDesc& desc, bool do void GrLayerCache::unlock(GrCachedLayer* layer) { SkDEBUGCODE(GrAutoValidateLayer avl(fAtlas->getTexture(), layer);) - if (NULL == layer) { + if (NULL == layer || !layer->locked()) { // invalid or not locked return; } @@ -225,7 +227,8 @@ void GrLayerCache::unlock(GrCachedLayer* layer) { if (layer->isAtlased()) { const int plotID = layer->plot()->id(); - this->decPlotLock(plotID); + SkASSERT(fPlotLocks[plotID] > 0); + fPlotLocks[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 @@ -250,6 +253,9 @@ void GrLayerCache::unlock(GrCachedLayer* layer) { #ifdef SK_DEBUG void GrLayerCache::validate() const { + int plotLocks[kNumPlotsX * kNumPlotsY]; + memset(plotLocks, 0, sizeof(plotLocks)); + SkTDynamicHash<GrCachedLayer, GrCachedLayer::Key>::ConstIter iter(&fLayerHash); for (; !iter.done(); ++iter) { const GrCachedLayer* layer = &(*iter); @@ -264,7 +270,7 @@ void GrLayerCache::validate() const { SkASSERT(!pictInfo->fPlotUsage.isEmpty()); #endif } else { - // If there is no picture info for this picture then all of its + // If there is no picture info for this layer then all of its // layers should be non-atlased. SkASSERT(!layer->isAtlased()); } @@ -276,10 +282,14 @@ void GrLayerCache::validate() const { SkASSERT(pictInfo->fPlotUsage.contains(layer->plot())); if (layer->locked()) { - SkASSERT(fPlotLocks[layer->plot()->id()] > 0); + plotLocks[layer->plot()->id()]++; } } } + + for (int i = 0; i < kNumPlotsX*kNumPlotsY; ++i) { + SkASSERT(plotLocks[i] == fPlotLocks[i]); + } } class GrAutoValidateCache : ::SkNoncopyable { |