| Index: src/gpu/GrLayerCache.cpp
|
| diff --git a/src/gpu/GrLayerCache.cpp b/src/gpu/GrLayerCache.cpp
|
| index b6e4e2e54c62148fba51d1bb11f2cbff0b04a7e1..ccb5bb0be48661de61f055d9960e711bfef883e5 100644
|
| --- a/src/gpu/GrLayerCache.cpp
|
| +++ b/src/gpu/GrLayerCache.cpp
|
| @@ -81,6 +81,7 @@
|
|
|
| GrLayerCache::GrLayerCache(GrContext* context)
|
| : fContext(context) {
|
| + this->initAtlas();
|
| memset(fPlotLocks, 0, sizeof(fPlotLocks));
|
| }
|
|
|
| @@ -119,6 +120,11 @@
|
|
|
| // 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,7 +170,6 @@
|
|
|
| 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);
|
| @@ -173,19 +178,12 @@
|
| }
|
|
|
| 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) {
|
| @@ -258,7 +256,7 @@
|
| 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 !GR_CACHE_HOISTED_LAYERS
|
| +#if DISABLE_CACHING
|
| // 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
|
| @@ -357,7 +355,6 @@
|
|
|
| bool GrLayerCache::purgePlot() {
|
| SkDEBUGCODE(GrAutoValidateCache avc(this);)
|
| - SkASSERT(fAtlas);
|
|
|
| GrAtlas::PlotIter iter;
|
| GrPlot* plot;
|
| @@ -412,12 +409,7 @@
|
| 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);
|
| @@ -427,10 +419,7 @@
|
|
|
| this->purgePlot(plot);
|
| }
|
| -
|
| - fContext->discardRenderTarget(fAtlas->getTexture()->asRenderTarget());
|
| -}
|
| -#endif
|
| +}
|
|
|
| class GrPictureDeletionListener : public SkPicture::DeletionListener {
|
| virtual void onDeletion(uint32_t pictureID) SK_OVERRIDE{
|
| @@ -459,14 +448,12 @@
|
| #ifdef SK_DEVELOPER
|
| void GrLayerCache::writeLayersToDisk(const SkString& dirName) {
|
|
|
| - if (fAtlas) {
|
| - GrTexture* atlasTexture = fAtlas->getTexture();
|
| - if (NULL != atlasTexture) {
|
| - SkString fileName(dirName);
|
| - fileName.append("\\atlas.png");
|
| -
|
| - atlasTexture->surfacePriv().savePixels(fileName.c_str());
|
| - }
|
| + GrTexture* atlasTexture = fAtlas->getTexture();
|
| + if (NULL != atlasTexture) {
|
| + SkString fileName(dirName);
|
| + fileName.append("\\atlas.png");
|
| +
|
| + atlasTexture->surfacePriv().savePixels(fileName.c_str());
|
| }
|
|
|
| SkTDynamicHash<GrCachedLayer, GrCachedLayer::Key>::Iter iter(&fLayerHash);
|
|
|