Index: src/gpu/GrLayerCache.cpp |
diff --git a/src/gpu/GrLayerCache.cpp b/src/gpu/GrLayerCache.cpp |
index d897c9dea55a558a646e94b35684280834bce351..a24c9e040b70bb7ecd3581e48cd9dacc4cd4c617 100644 |
--- a/src/gpu/GrLayerCache.cpp |
+++ b/src/gpu/GrLayerCache.cpp |
@@ -81,7 +81,6 @@ private: |
GrLayerCache::GrLayerCache(GrContext* context) |
: fContext(context) { |
- this->initAtlas(); |
memset(fPlotLocks, 0, sizeof(fPlotLocks)); |
} |
@@ -120,11 +119,6 @@ void GrLayerCache::freeAll() { |
// The atlas only lets go of its texture when the atlas is deleted. |
fAtlas.free(); |
- // GrLayerCache always assumes an atlas exists so recreate it. The atlas |
- // lazily allocates a replacement texture so reallocating a new |
- // atlas here won't disrupt a GrContext::abandonContext or freeGpuResources. |
- // TODO: Make GrLayerCache lazily allocate the atlas manager? |
- this->initAtlas(); |
} |
GrCachedLayer* GrLayerCache::createLayer(uint32_t pictureID, |
@@ -164,12 +158,13 @@ GrCachedLayer* GrLayerCache::findLayerOrCreate(uint32_t pictureID, |
bool GrLayerCache::tryToAtlas(GrCachedLayer* layer, |
const GrSurfaceDesc& desc, |
bool* needsRendering) { |
- SkDEBUGCODE(GrAutoValidateLayer avl(fAtlas->getTexture(), layer);) |
+ SkDEBUGCODE(GrAutoValidateLayer avl(fAtlas ? fAtlas->getTexture() : NULL, layer);) |
SkASSERT(PlausiblyAtlasable(desc.fWidth, desc.fHeight)); |
if (layer->locked()) { |
// This layer is already locked |
+ SkASSERT(fAtlas); |
SkASSERT(layer->isAtlased()); |
SkASSERT(layer->rect().width() == desc.fWidth); |
SkASSERT(layer->rect().height() == desc.fHeight); |
@@ -178,12 +173,19 @@ bool GrLayerCache::tryToAtlas(GrCachedLayer* layer, |
} |
if (layer->isAtlased()) { |
+ SkASSERT(fAtlas); |
// Hooray it is still in the atlas - make sure it stays there |
layer->setLocked(true); |
this->incPlotLock(layer->plot()->id()); |
*needsRendering = false; |
return true; |
} else { |
+ if (!fAtlas) { |
+ this->initAtlas(); |
+ if (!fAtlas) { |
+ return false; |
+ } |
+ } |
// Not in the atlas - will it fit? |
GrPictureInfo* pictInfo = fPictureHash.find(layer->pictureID()); |
if (NULL == pictInfo) { |
@@ -243,7 +245,7 @@ bool GrLayerCache::lock(GrCachedLayer* layer, const GrSurfaceDesc& desc, bool* n |
} |
void GrLayerCache::unlock(GrCachedLayer* layer) { |
- SkDEBUGCODE(GrAutoValidateLayer avl(fAtlas->getTexture(), layer);) |
+ SkDEBUGCODE(GrAutoValidateLayer avl(fAtlas ? fAtlas->getTexture() : NULL, layer);) |
if (NULL == layer || !layer->locked()) { |
// invalid or not locked |
@@ -256,7 +258,7 @@ void GrLayerCache::unlock(GrCachedLayer* layer) { |
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 |
+#if !GR_CACHE_HOISTED_LAYERS |
// This testing code aggressively removes the atlased layers. This |
// can be used to separate the performance contribution of less |
// render target pingponging from that due to the re-use of cached layers |
@@ -285,7 +287,7 @@ void GrLayerCache::validate() const { |
for (; !iter.done(); ++iter) { |
const GrCachedLayer* layer = &(*iter); |
- layer->validate(fAtlas->getTexture()); |
+ layer->validate(fAtlas.get() ? fAtlas->getTexture() : NULL); |
const GrPictureInfo* pictInfo = fPictureHash.find(layer->pictureID()); |
if (!pictInfo) { |
@@ -355,6 +357,7 @@ void GrLayerCache::purge(uint32_t pictureID) { |
bool GrLayerCache::purgePlot() { |
SkDEBUGCODE(GrAutoValidateCache avc(this);) |
+ SkASSERT(fAtlas); |
GrAtlas::PlotIter iter; |
GrPlot* plot; |
@@ -409,7 +412,12 @@ void GrLayerCache::purgePlot(GrPlot* plot) { |
plot->resetRects(); |
} |
+#if !GR_CACHE_HOISTED_LAYERS |
void GrLayerCache::purgeAll() { |
+ if (!fAtlas) { |
+ return; |
+ } |
+ |
GrAtlas::PlotIter iter; |
GrPlot* plot; |
for (plot = fAtlas->iterInit(&iter, GrAtlas::kLRUFirst_IterOrder); |
@@ -419,7 +427,10 @@ void GrLayerCache::purgeAll() { |
this->purgePlot(plot); |
} |
+ |
+ fContext->discardRenderTarget(fAtlas->getTexture()->asRenderTarget()); |
} |
+#endif |
class GrPictureDeletionListener : public SkPicture::DeletionListener { |
virtual void onDeletion(uint32_t pictureID) SK_OVERRIDE{ |
@@ -448,12 +459,14 @@ void GrLayerCache::processDeletedPictures() { |
#ifdef SK_DEVELOPER |
void GrLayerCache::writeLayersToDisk(const SkString& dirName) { |
- GrTexture* atlasTexture = fAtlas->getTexture(); |
- if (NULL != atlasTexture) { |
- SkString fileName(dirName); |
- fileName.append("\\atlas.png"); |
+ if (fAtlas) { |
+ GrTexture* atlasTexture = fAtlas->getTexture(); |
+ if (NULL != atlasTexture) { |
+ SkString fileName(dirName); |
+ fileName.append("\\atlas.png"); |
- atlasTexture->surfacePriv().savePixels(fileName.c_str()); |
+ atlasTexture->surfacePriv().savePixels(fileName.c_str()); |
+ } |
} |
SkTDynamicHash<GrCachedLayer, GrCachedLayer::Key>::Iter iter(&fLayerHash); |