diff --git a/gfx/layers/basic/BasicLayers.cpp b/gfx/layers/basic/BasicLayers.cpp index 3be710bd31db..a5ddfafcd44b 100644 --- a/gfx/layers/basic/BasicLayers.cpp +++ b/gfx/layers/basic/BasicLayers.cpp @@ -112,6 +112,13 @@ public: float aOpacity) {} virtual ShadowableLayer* AsShadowableLayer() { return nsnull; } + + /** + * Layers will get this call when their layer manager is destroyed, this + * indicates they should clear resources they don't really need after their + * LayerManager ceases to exist. + */ + virtual void ClearCachedResources() {} }; static BasicImplData* @@ -290,6 +297,8 @@ public: LayerManager::DrawThebesLayerCallback aCallback, void* aCallbackData, float aOpacity); + + virtual void ClearCachedResources() { mBuffer.Clear(); mValidRegion.SetEmpty(); } virtual already_AddRefed CreateBuffer(Buffer::ContentType aType, const nsIntSize& aSize) @@ -856,6 +865,8 @@ BasicLayerManager::~BasicLayerManager() { NS_ASSERTION(!InTransaction(), "Died during transaction?"); + ClearCachedResources(); + mRoot = nsnull; MOZ_COUNT_DTOR(BasicLayerManager); @@ -1078,6 +1089,25 @@ BasicLayerManager::PaintLayer(Layer* aLayer, } } +void +BasicLayerManager::ClearCachedResources() +{ + if (mRoot) { + ClearLayer(mRoot); + } + + mCachedSurface.Expire(); +} +void +BasicLayerManager::ClearLayer(Layer* aLayer) +{ + ToData(aLayer)->ClearResources(); + for (Layer* child = aLayer->GetFirstChild(); child; + child = child->GetNextSibling()) { + ClearLayer(child); + } +} + already_AddRefed BasicLayerManager::CreateThebesLayer() { diff --git a/gfx/layers/basic/BasicLayers.h b/gfx/layers/basic/BasicLayers.h index 460dde8215d7..b7890918565e 100644 --- a/gfx/layers/basic/BasicLayers.h +++ b/gfx/layers/basic/BasicLayers.h @@ -156,6 +156,9 @@ public: virtual const char* Name() const { return "Basic"; } #endif // MOZ_LAYERS_HAVE_LOG + // Clear the cached contents of this layer. + void ClearCachedResources(); + protected: #ifdef DEBUG enum TransactionPhase { @@ -171,6 +174,9 @@ private: void* aCallbackData, float aOpacity); + // Clear the contents of a layer + void ClearLayer(Layer* aLayer); + already_AddRefed PushGroupWithCachedSurface(gfxContext *aTarget, gfxASurface::gfxContentType aContent, gfxPoint *aSavedOffset);