Bug 1446166. Ensure that WebRenderUserData's are removed when LayerManager is destroyed. r=kats
This lets us avoid having to check whether we have the right one when getting them.
MozReview-Commit-ID: 9YDiSd7AekB
--- a/gfx/layers/wr/WebRenderCommandBuilder.cpp
+++ b/gfx/layers/wr/WebRenderCommandBuilder.cpp
@@ -27,16 +27,19 @@ namespace mozilla {
namespace layers {
using namespace gfx;
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);
}
void
WebRenderCommandBuilder::EmptyTransaction()
{
// We need to update canvases that might have changed.
for (auto iter = mLastCanvasDatas.Iter(); !iter.Done(); iter.Next()) {
RefPtr<WebRenderCanvasData> canvasData = iter.Get()->GetKey();
--- a/gfx/layers/wr/WebRenderCommandBuilder.h
+++ b/gfx/layers/wr/WebRenderCommandBuilder.h
@@ -118,17 +118,17 @@ public:
frame->GetProperty(nsIFrame::WebRenderUserDataProperty());
if (!userDataTable) {
userDataTable = new nsIFrame::WebRenderUserDataTable();
frame->AddProperty(nsIFrame::WebRenderUserDataProperty(), userDataTable);
}
RefPtr<WebRenderUserData>& data = userDataTable->GetOrInsert(aItem->GetPerFrameKey());
- if (!data || (data->GetType() != T::Type()) || !data->IsDataValid(mManager)) {
+ if (!data || (data->GetType() != T::Type())) {
// To recreate a new user data, we should remove the data from the table first.
if (data) {
data->RemoveFromTable();
}
data = new T(mManager, aItem);
mWebRenderUserDatas.PutEntry(data);
if (aOutIsRecycled) {
*aOutIsRecycled = false;
@@ -154,17 +154,17 @@ public:
MOZ_ASSERT(aFrame);
nsIFrame::WebRenderUserDataTable* userDataTable =
aFrame->GetProperty(nsIFrame::WebRenderUserDataProperty());
if (!userDataTable) {
return nullptr;
}
RefPtr<WebRenderUserData> data = userDataTable->Get(aPerFrameKey);
- if (data && (data->GetType() == T::Type()) && data->IsDataValid(mManager)) {
+ if (data && (data->GetType() == T::Type())) {
RefPtr<T> result = static_cast<T*>(data.get());
return result.forget();
}
return nullptr;
}
private:
--- a/gfx/layers/wr/WebRenderUserData.cpp
+++ b/gfx/layers/wr/WebRenderUserData.cpp
@@ -46,22 +46,16 @@ WebRenderUserData::WebRenderUserData(Web
, mUsed(false)
{
}
WebRenderUserData::~WebRenderUserData()
{
}
-bool
-WebRenderUserData::IsDataValid(WebRenderLayerManager* aManager)
-{
- return aManager == mWRManager;
-}
-
void
WebRenderUserData::RemoveFromTable()
{
mTable->RemoveEntry(this);
}
WebRenderBridgeChild*
WebRenderUserData::WrBridge() const
--- a/gfx/layers/wr/WebRenderUserData.h
+++ b/gfx/layers/wr/WebRenderUserData.h
@@ -49,17 +49,16 @@ public:
enum class UserDataType {
eImage,
eFallback,
eAnimation,
eCanvas,
};
virtual UserDataType GetType() = 0;
- bool IsDataValid(WebRenderLayerManager* aManager);
bool IsUsed() { return mUsed; }
void SetUsed(bool aUsed) { mUsed = aUsed; }
nsIFrame* GetFrame() { return mFrame; }
uint32_t GetDisplayItemKey() { return mDisplayItemKey; }
void RemoveFromTable();
virtual void ClearCachedResources() {};
virtual nsDisplayItemGeometry* GetGeometry() { return nullptr; }
protected: