Bug 1453801 - Part 1. Ensure WebRenderUserData objects are freed after a tab switch. r=sotaro

This commit is contained in:
Andrew Osmond 2018-04-23 07:57:13 -04:00
Родитель 23863f75f8
Коммит 5ee6ae6297
3 изменённых файлов: 14 добавлений и 61 удалений

Просмотреть файл

@ -1070,10 +1070,7 @@ void
WebRenderCommandBuilder::Destroy()
{
mLastCanvasDatas.Clear();
RemoveUnusedAndResetWebRenderUserData();
// UserDatas should only be in the used state during a call to WebRenderCommandBuilder::BuildWebRenderCommands
// The should always be false upon return from BuildWebRenderCommands().
MOZ_RELEASE_ASSERT(mWebRenderUserDatas.Count() == 0);
ClearCachedResources();
}
void
@ -1830,10 +1827,10 @@ WebRenderCommandBuilder::RemoveUnusedAndResetWebRenderUserData()
void
WebRenderCommandBuilder::ClearCachedResources()
{
for (auto iter = mWebRenderUserDatas.Iter(); !iter.Done(); iter.Next()) {
WebRenderUserData* data = iter.Get()->GetKey();
data->ClearCachedResources();
}
RemoveUnusedAndResetWebRenderUserData();
// UserDatas should only be in the used state during a call to WebRenderCommandBuilder::BuildWebRenderCommands
// The should always be false upon return from BuildWebRenderCommands().
MOZ_RELEASE_ASSERT(mWebRenderUserDatas.Count() == 0);
}

Просмотреть файл

@ -67,7 +67,15 @@ WebRenderImageData::WebRenderImageData(WebRenderLayerManager* aWRManager, nsDisp
WebRenderImageData::~WebRenderImageData()
{
DoClearCachedResources();
ClearImageKey();
if (mExternalImageId) {
WrBridge()->DeallocExternalImageId(mExternalImageId.ref());
}
if (mPipelineId) {
WrBridge()->RemovePipelineIdForCompositable(mPipelineId.ref());
}
}
void
@ -84,32 +92,6 @@ WebRenderImageData::ClearImageKey()
mOwnsKey = false;
}
void
WebRenderImageData::ClearCachedResources()
{
DoClearCachedResources();
}
void
WebRenderImageData::DoClearCachedResources()
{
ClearImageKey();
if (mExternalImageId) {
WrBridge()->DeallocExternalImageId(mExternalImageId.ref());
mExternalImageId.reset();
}
if (mPipelineId) {
WrBridge()->RemovePipelineIdForCompositable(mPipelineId.ref());
mPipelineId.reset();
}
if (mImageClient) {
mImageClient = nullptr;
}
}
Maybe<wr::ImageKey>
WebRenderImageData::UpdateImageKey(ImageContainer* aContainer,
wr::IpcResourceUpdateQueue& aResources,
@ -275,14 +257,6 @@ WebRenderFallbackData::~WebRenderFallbackData()
{
}
void
WebRenderFallbackData::ClearCachedResources()
{
WebRenderImageData::ClearCachedResources();
mBasicLayerManager = nullptr;
mInvalid = true;
}
nsDisplayItemGeometry*
WebRenderFallbackData::GetGeometry()
{
@ -319,18 +293,6 @@ WebRenderCanvasData::WebRenderCanvasData(WebRenderLayerManager* aWRManager, nsDi
}
WebRenderCanvasData::~WebRenderCanvasData()
{
DoClearCachedResources();
}
void
WebRenderCanvasData::ClearCachedResources()
{
DoClearCachedResources();
}
void
WebRenderCanvasData::DoClearCachedResources()
{
if (mCanvasRenderer) {
mCanvasRenderer->ClearCachedResources();

Просмотреть файл

@ -62,7 +62,6 @@ public:
nsIFrame* GetFrame() { return mFrame; }
uint32_t GetDisplayItemKey() { return mDisplayItemKey; }
void RemoveFromTable();
virtual void ClearCachedResources() {};
virtual nsDisplayItemGeometry* GetGeometry() { return nullptr; }
protected:
virtual ~WebRenderUserData();
@ -126,7 +125,6 @@ public:
bool aIsBackfaceVisible);
void CreateImageClientIfNeeded();
void ClearCachedResources() override;
bool IsAsync()
{
@ -136,7 +134,6 @@ public:
protected:
void ClearImageKey();
void CreateExternalImageIfNeeded();
void DoClearCachedResources();
wr::MaybeExternalImageId mExternalImageId;
Maybe<wr::ImageKey> mKey;
@ -155,7 +152,6 @@ public:
virtual WebRenderFallbackData* AsFallbackData() override { return this; }
virtual UserDataType GetType() override { return UserDataType::eFallback; }
static UserDataType Type() { return UserDataType::eFallback; }
void ClearCachedResources() override;
nsDisplayItemGeometry* GetGeometry() override;
void SetGeometry(nsAutoPtr<nsDisplayItemGeometry> aGeometry);
nsRect GetBounds() { return mBounds; }
@ -200,9 +196,7 @@ public:
void ClearCanvasRenderer();
WebRenderCanvasRendererAsync* GetCanvasRenderer();
WebRenderCanvasRendererAsync* CreateCanvasRenderer();
void ClearCachedResources() override;
protected:
void DoClearCachedResources();
UniquePtr<WebRenderCanvasRendererAsync> mCanvasRenderer;
};