commit 23486e9fef03799f9784cce4a9bb735a5a43b2ef
parent 36d547da710414dfe95936277ce13252f4803dea
Author: Botond Ballo <botond@mozilla.com>
Date: Thu, 13 Nov 2025 04:59:02 +0000
Bug 1730749 - Allow using WebRenderUserData without a display item. r=mstange
The implementation only needs the display item's frame and its
"per frame key". In some cases these inputs can be known before
the display item instance itself is available. A later patch in
this series makes use of this.
Differential Revision: https://phabricator.services.mozilla.com/D254144
Diffstat:
4 files changed, 69 insertions(+), 14 deletions(-)
diff --git a/gfx/layers/wr/WebRenderCommandBuilder.cpp b/gfx/layers/wr/WebRenderCommandBuilder.cpp
@@ -1070,6 +1070,8 @@ void Grouper::PaintContainerItem(DIGroup* aGroup, nsDisplayItem* aItem,
class WebRenderGroupData : public WebRenderUserData {
public:
WebRenderGroupData(RenderRootStateManager* aWRManager, nsDisplayItem* aItem);
+ WebRenderGroupData(RenderRootStateManager* aWRManager,
+ uint32_t aDisplayItemKey, nsIFrame* aFrame);
virtual ~WebRenderGroupData();
WebRenderGroupData* AsGroupData() override { return this; }
@@ -3021,7 +3023,13 @@ void WebRenderCommandBuilder::ClearCachedResources() {
WebRenderGroupData::WebRenderGroupData(
RenderRootStateManager* aRenderRootStateManager, nsDisplayItem* aItem)
- : WebRenderUserData(aRenderRootStateManager, aItem) {
+ : WebRenderGroupData(aRenderRootStateManager, aItem->GetPerFrameKey(),
+ aItem->Frame()) {}
+
+WebRenderGroupData::WebRenderGroupData(
+ RenderRootStateManager* aRenderRootStateManager, uint32_t aDisplayItemKey,
+ nsIFrame* aFrame)
+ : WebRenderUserData(aRenderRootStateManager, aDisplayItemKey, aFrame) {
MOZ_COUNT_CTOR(WebRenderGroupData);
}
diff --git a/gfx/layers/wr/WebRenderCommandBuilder.h b/gfx/layers/wr/WebRenderCommandBuilder.h
@@ -138,22 +138,29 @@ class WebRenderCommandBuilder final {
already_AddRefed<T> CreateOrRecycleWebRenderUserData(
nsDisplayItem* aItem, bool* aOutIsRecycled = nullptr) {
MOZ_ASSERT(aItem);
- nsIFrame* frame = aItem->Frame();
+ return CreateOrRecycleWebRenderUserData<T>(aItem->GetPerFrameKey(),
+ aItem->Frame());
+ }
+ template <class T>
+ already_AddRefed<T> CreateOrRecycleWebRenderUserData(
+ uint32_t aDisplayItemKey, nsIFrame* aFrame,
+ bool* aOutIsRecycled = nullptr) {
if (aOutIsRecycled) {
*aOutIsRecycled = true;
}
WebRenderUserDataTable* userDataTable =
- frame->GetProperty(WebRenderUserDataProperty::Key());
+ aFrame->GetProperty(WebRenderUserDataProperty::Key());
if (!userDataTable) {
userDataTable = new WebRenderUserDataTable();
- frame->AddProperty(WebRenderUserDataProperty::Key(), userDataTable);
+ aFrame->AddProperty(WebRenderUserDataProperty::Key(), userDataTable);
}
RefPtr<WebRenderUserData>& data = userDataTable->LookupOrInsertWith(
- WebRenderUserDataKey(aItem->GetPerFrameKey(), T::Type()), [&] {
- auto data = MakeRefPtr<T>(GetRenderRootStateManager(), aItem);
+ WebRenderUserDataKey(aDisplayItemKey, T::Type()), [&] {
+ auto data = MakeRefPtr<T>(GetRenderRootStateManager(),
+ aDisplayItemKey, aFrame);
mWebRenderUserDatas.Insert(data);
if (aOutIsRecycled) {
*aOutIsRecycled = false;
diff --git a/gfx/layers/wr/WebRenderUserData.cpp b/gfx/layers/wr/WebRenderUserData.cpp
@@ -290,7 +290,15 @@ bool WebRenderImageProviderData::Invalidate(ImageProviderId aProviderId) const {
WebRenderFallbackData::WebRenderFallbackData(RenderRootStateManager* aManager,
nsDisplayItem* aItem)
- : WebRenderUserData(aManager, aItem), mOpacity(1.0f), mInvalid(false) {}
+ : WebRenderFallbackData(aManager, aItem->GetPerFrameKey(), aItem->Frame()) {
+}
+
+WebRenderFallbackData::WebRenderFallbackData(RenderRootStateManager* aManager,
+ uint32_t aDisplayItemKey,
+ nsIFrame* aFrame)
+ : WebRenderUserData(aManager, aDisplayItemKey, aFrame),
+ mOpacity(1.0f),
+ mInvalid(false) {}
WebRenderFallbackData::~WebRenderFallbackData() { ClearImageKey(); }
@@ -341,13 +349,24 @@ WebRenderImageData* WebRenderFallbackData::PaintIntoImage() {
WebRenderAPZAnimationData::WebRenderAPZAnimationData(
RenderRootStateManager* aManager, nsDisplayItem* aItem)
- : WebRenderUserData(aManager, aItem),
+ : WebRenderAPZAnimationData(aManager, aItem->GetPerFrameKey(),
+ aItem->Frame()) {}
+
+WebRenderAPZAnimationData::WebRenderAPZAnimationData(
+ RenderRootStateManager* aManager, uint32_t aDisplayItemKey,
+ nsIFrame* aFrame)
+ : WebRenderUserData(aManager, aDisplayItemKey, aFrame),
mAnimationId(AnimationHelper::GetNextCompositorAnimationsId()) {}
WebRenderAnimationData::WebRenderAnimationData(RenderRootStateManager* aManager,
nsDisplayItem* aItem)
: WebRenderUserData(aManager, aItem) {}
+WebRenderAnimationData::WebRenderAnimationData(RenderRootStateManager* aManager,
+ uint32_t aDisplayItemKey,
+ nsIFrame* aFrame)
+ : WebRenderUserData(aManager, aDisplayItemKey, aFrame) {}
+
WebRenderAnimationData::~WebRenderAnimationData() {
// It may be the case that nsDisplayItem that created this WebRenderUserData
// gets destroyed without getting a chance to discard the compositor animation
@@ -363,6 +382,11 @@ WebRenderCanvasData::WebRenderCanvasData(RenderRootStateManager* aManager,
nsDisplayItem* aItem)
: WebRenderUserData(aManager, aItem) {}
+WebRenderCanvasData::WebRenderCanvasData(RenderRootStateManager* aManager,
+ uint32_t aDisplayItemKey,
+ nsIFrame* aFrame)
+ : WebRenderUserData(aManager, aDisplayItemKey, aFrame) {}
+
WebRenderCanvasData::~WebRenderCanvasData() {
if (mCanvasRenderer) {
mCanvasRenderer->ClearCachedResources();
@@ -415,5 +439,16 @@ void DestroyWebRenderUserDataTable(WebRenderUserDataTable* aTable) {
delete aTable;
}
+WebRenderMaskData::WebRenderMaskData(RenderRootStateManager* aManager,
+ nsDisplayItem* aItem)
+ : WebRenderMaskData(aManager, aItem->GetPerFrameKey(), aItem->Frame()) {}
+WebRenderMaskData::WebRenderMaskData(RenderRootStateManager* aManager,
+ uint32_t aDisplayItemKey, nsIFrame* aFrame)
+ : WebRenderUserData(aManager, aDisplayItemKey, aFrame),
+ mMaskStyle(nsStyleImageLayers::LayerType::Mask),
+ mShouldHandleOpacity(false) {
+ MOZ_COUNT_CTOR(WebRenderMaskData);
+}
+
} // namespace layers
} // namespace mozilla
diff --git a/gfx/layers/wr/WebRenderUserData.h b/gfx/layers/wr/WebRenderUserData.h
@@ -216,6 +216,8 @@ class WebRenderImageProviderData final : public WebRenderUserData {
class WebRenderFallbackData : public WebRenderUserData {
public:
WebRenderFallbackData(RenderRootStateManager* aManager, nsDisplayItem* aItem);
+ WebRenderFallbackData(RenderRootStateManager* aManager,
+ uint32_t aDisplayItemKey, nsIFrame* aFrame);
virtual ~WebRenderFallbackData();
WebRenderFallbackData* AsFallbackData() override { return this; }
@@ -259,6 +261,8 @@ class WebRenderAPZAnimationData : public WebRenderUserData {
public:
WebRenderAPZAnimationData(RenderRootStateManager* aManager,
nsDisplayItem* aItem);
+ WebRenderAPZAnimationData(RenderRootStateManager* aManager,
+ uint32_t aDisplayItemKey, nsIFrame* aFrame);
virtual ~WebRenderAPZAnimationData() = default;
UserDataType GetType() override { return UserDataType::eAPZAnimation; }
@@ -273,6 +277,8 @@ class WebRenderAnimationData : public WebRenderUserData {
public:
WebRenderAnimationData(RenderRootStateManager* aManager,
nsDisplayItem* aItem);
+ WebRenderAnimationData(RenderRootStateManager* aManager,
+ uint32_t aDisplayItemKey, nsIFrame* aFrame);
virtual ~WebRenderAnimationData();
UserDataType GetType() override { return UserDataType::eAnimation; }
@@ -286,6 +292,8 @@ class WebRenderAnimationData : public WebRenderUserData {
class WebRenderCanvasData : public WebRenderUserData {
public:
WebRenderCanvasData(RenderRootStateManager* aManager, nsDisplayItem* aItem);
+ WebRenderCanvasData(RenderRootStateManager* aManager,
+ uint32_t aDisplayItemKey, nsIFrame* aFrame);
virtual ~WebRenderCanvasData();
WebRenderCanvasData* AsCanvasData() override { return this; }
@@ -309,12 +317,9 @@ class WebRenderCanvasData : public WebRenderUserData {
class WebRenderMaskData : public WebRenderUserData {
public:
explicit WebRenderMaskData(RenderRootStateManager* aManager,
- nsDisplayItem* aItem)
- : WebRenderUserData(aManager, aItem),
- mMaskStyle(nsStyleImageLayers::LayerType::Mask),
- mShouldHandleOpacity(false) {
- MOZ_COUNT_CTOR(WebRenderMaskData);
- }
+ nsDisplayItem* aItem);
+ explicit WebRenderMaskData(RenderRootStateManager* aManager,
+ uint32_t aDisplayItemKey, nsIFrame* aFrame);
virtual ~WebRenderMaskData() {
MOZ_COUNT_DTOR(WebRenderMaskData);
ClearImageKey();