Bug 1404232 - Add WebRenderCommandBuilder::ClearCachedResources() r=jrmuizel

This commit is contained in:
sotaro
2017-10-19 13:03:08 +09:00
parent 189349f133
commit 52b9aabb07
5 changed files with 34 additions and 5 deletions

View File

@@ -492,7 +492,7 @@ WebRenderCommandBuilder::GenerateFallbackData(nsDisplayItem* aItem,
needPaint = !invalidRegion.IsEmpty();
}
if (needPaint) {
if (needPaint || !fallbackData->GetKey()) {
gfx::SurfaceFormat format = aItem->GetType() == DisplayItemType::TYPE_MASK ?
gfx::SurfaceFormat::A8 : gfx::SurfaceFormat::B8G8R8A8;
if (gfxPrefs::WebRenderBlobImages()) {
@@ -638,5 +638,14 @@ WebRenderCommandBuilder::RemoveUnusedAndResetWebRenderUserData()
}
}
void
WebRenderCommandBuilder::ClearCachedResources()
{
for (auto iter = mWebRenderUserDatas.Iter(); !iter.Done(); iter.Next()) {
WebRenderUserData* data = iter.Get()->GetKey();
data->ClearCachedResources();
}
}
} // namespace layers
} // namespace mozilla

View File

@@ -94,6 +94,7 @@ public:
LayerRect& aImageRect);
void RemoveUnusedAndResetWebRenderUserData();
void ClearCachedResources();
// Those are data that we kept between transactions. We used to cache some
// data in the layer. But in layers free mode, we don't have layer which

View File

@@ -540,7 +540,8 @@ WebRenderLayerManager::ClearCachedResources(Layer* aSubtree)
void
WebRenderLayerManager::WrUpdated()
{
// Handle removing all obsoleted WebRenderUserData
mWebRenderCommandBuilder.ClearCachedResources();
DiscardLocalImages();
}
void

View File

@@ -53,17 +53,26 @@ WebRenderImageData::WebRenderImageData(WebRenderLayerManager* aWRManager, nsDisp
}
WebRenderImageData::~WebRenderImageData()
{
ClearCachedResources();
}
void
WebRenderImageData::ClearCachedResources()
{
if (mKey) {
mWRManager->AddImageKeyForDiscard(mKey.value());
mKey.reset();
}
if (mExternalImageId) {
WrBridge()->DeallocExternalImageId(mExternalImageId.ref());
mExternalImageId.reset();
}
if (mPipelineId) {
WrBridge()->RemovePipelineIdForCompositable(mPipelineId.ref());
mPipelineId.reset();
}
}
@@ -235,6 +244,15 @@ WebRenderCanvasData::WebRenderCanvasData(WebRenderLayerManager* aWRManager, nsDi
WebRenderCanvasData::~WebRenderCanvasData()
{
ClearCachedResources();
}
void
WebRenderCanvasData::ClearCachedResources()
{
if (mCanvasRenderer) {
mCanvasRenderer->ClearCachedResources();
}
}
WebRenderCanvasRendererAsync*

View File

@@ -56,7 +56,7 @@ public:
nsIFrame* GetFrame() { return mFrame; }
uint32_t GetDisplayItemKey() { return mDisplayItemKey; }
void RemoveFromTable();
virtual void ClearCachedResources() {};
protected:
virtual ~WebRenderUserData();
@@ -98,7 +98,7 @@ public:
bool aIsBackfaceVisible);
void CreateImageClientIfNeeded();
void ClearCachedResources() override;
protected:
void CreateExternalImageIfNeeded();
@@ -160,7 +160,7 @@ public:
static UserDataType Type() { return UserDataType::eCanvas; }
WebRenderCanvasRendererAsync* GetCanvasRenderer();
void ClearCachedResources() override;
protected:
UniquePtr<WebRenderCanvasRendererAsync> mCanvasRenderer;
};