summaryrefslogtreecommitdiffstats
path: root/layout/ipc/RemoteLayerTreeOwner.cpp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 14:29:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 14:29:10 +0000
commit2aa4a82499d4becd2284cdb482213d541b8804dd (patch)
treeb80bf8bf13c3766139fbacc530efd0dd9d54394c /layout/ipc/RemoteLayerTreeOwner.cpp
parentInitial commit. (diff)
downloadfirefox-2aa4a82499d4becd2284cdb482213d541b8804dd.tar.xz
firefox-2aa4a82499d4becd2284cdb482213d541b8804dd.zip
Adding upstream version 86.0.1.upstream/86.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'layout/ipc/RemoteLayerTreeOwner.cpp')
-rw-r--r--layout/ipc/RemoteLayerTreeOwner.cpp134
1 files changed, 134 insertions, 0 deletions
diff --git a/layout/ipc/RemoteLayerTreeOwner.cpp b/layout/ipc/RemoteLayerTreeOwner.cpp
new file mode 100644
index 0000000000..a55cf461a6
--- /dev/null
+++ b/layout/ipc/RemoteLayerTreeOwner.cpp
@@ -0,0 +1,134 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "base/basictypes.h"
+
+#include "mozilla/PresShell.h"
+#include "mozilla/dom/ContentParent.h"
+#include "mozilla/dom/BrowserParent.h"
+#include "mozilla/layers/CompositorBridgeParent.h"
+#include "mozilla/layers/CompositorTypes.h"
+#include "mozilla/layers/LayerTransactionParent.h"
+#include "nsFrameLoader.h"
+#include "nsStyleStructInlines.h"
+#include "nsSubDocumentFrame.h"
+#include "RemoteLayerTreeOwner.h"
+#include "mozilla/gfx/GPUProcessManager.h"
+#include "mozilla/layers/CompositorBridgeChild.h"
+#include "mozilla/layers/WebRenderLayerManager.h"
+#include "mozilla/layers/WebRenderScrollData.h"
+#include "mozilla/webrender/WebRenderAPI.h"
+#include "mozilla/dom/EffectsInfo.h"
+
+using namespace mozilla::dom;
+using namespace mozilla::gfx;
+using namespace mozilla::layers;
+
+namespace mozilla {
+namespace layout {
+
+static already_AddRefed<LayerManager> GetLayerManager(
+ BrowserParent* aBrowserParent) {
+ if (Element* element = aBrowserParent->GetOwnerElement()) {
+ if (RefPtr<LayerManager> lm =
+ nsContentUtils::LayerManagerForContent(element)) {
+ return lm.forget();
+ }
+ return nsContentUtils::LayerManagerForDocument(element->OwnerDoc());
+ }
+ return nullptr;
+}
+
+RemoteLayerTreeOwner::RemoteLayerTreeOwner()
+ : mLayersId{0},
+ mBrowserParent(nullptr),
+ mLayerManager(nullptr),
+ mInitialized(false),
+ mLayersConnected(false) {}
+
+RemoteLayerTreeOwner::~RemoteLayerTreeOwner() = default;
+
+bool RemoteLayerTreeOwner::Initialize(BrowserParent* aBrowserParent) {
+ if (mInitialized || !aBrowserParent) {
+ return false;
+ }
+
+ mBrowserParent = aBrowserParent;
+ RefPtr<LayerManager> lm = GetLayerManager(mBrowserParent);
+ PCompositorBridgeChild* compositor =
+ lm ? lm->GetCompositorBridgeChild() : nullptr;
+ mTabProcessId = mBrowserParent->Manager()->OtherPid();
+
+ // Our remote frame will push layers updates to the compositor,
+ // and we'll keep an indirect reference to that tree.
+ GPUProcessManager* gpm = GPUProcessManager::Get();
+ mLayersConnected = gpm->AllocateAndConnectLayerTreeId(
+ compositor, mTabProcessId, &mLayersId, &mCompositorOptions);
+
+ mInitialized = true;
+ return true;
+}
+
+void RemoteLayerTreeOwner::Destroy() {
+ if (mLayersId.IsValid()) {
+ GPUProcessManager::Get()->UnmapLayerTreeId(mLayersId, mTabProcessId);
+ }
+
+ mBrowserParent = nullptr;
+ mLayerManager = nullptr;
+}
+
+void RemoteLayerTreeOwner::EnsureLayersConnected(
+ CompositorOptions* aCompositorOptions) {
+ RefPtr<LayerManager> lm = GetLayerManager(mBrowserParent);
+ if (!lm) {
+ return;
+ }
+
+ if (!lm->GetCompositorBridgeChild()) {
+ return;
+ }
+
+ mLayersConnected = lm->GetCompositorBridgeChild()->SendNotifyChildRecreated(
+ mLayersId, &mCompositorOptions);
+ *aCompositorOptions = mCompositorOptions;
+}
+
+LayerManager* RemoteLayerTreeOwner::AttachLayerManager() {
+ RefPtr<LayerManager> lm;
+ if (mBrowserParent) {
+ lm = GetLayerManager(mBrowserParent);
+ }
+
+ // Perhaps the document containing this frame currently has no presentation?
+ if (lm && lm->GetCompositorBridgeChild() && lm != mLayerManager) {
+ mLayersConnected =
+ lm->GetCompositorBridgeChild()->SendAdoptChild(mLayersId);
+ FrameLayerBuilder::InvalidateAllLayers(lm);
+ }
+
+ mLayerManager = std::move(lm);
+ return mLayerManager;
+}
+
+void RemoteLayerTreeOwner::OwnerContentChanged() {
+ Unused << AttachLayerManager();
+}
+
+void RemoteLayerTreeOwner::GetTextureFactoryIdentifier(
+ TextureFactoryIdentifier* aTextureFactoryIdentifier) const {
+ RefPtr<LayerManager> lm =
+ mBrowserParent ? GetLayerManager(mBrowserParent) : nullptr;
+ // Perhaps the document containing this frame currently has no presentation?
+ if (lm) {
+ *aTextureFactoryIdentifier = lm->GetTextureFactoryIdentifier();
+ } else {
+ *aTextureFactoryIdentifier = TextureFactoryIdentifier();
+ }
+}
+
+} // namespace layout
+} // namespace mozilla