tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

InProcessCompositorSession.cpp (4143B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
      3 /* This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this
      5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #include "InProcessCompositorSession.h"
      8 
      9 #include "mozilla/gfx/GPUProcessManager.h"
     10 #include "mozilla/layers/CompositorBridgeChild.h"
     11 #include "mozilla/layers/CompositorBridgeParent.h"
     12 #include "mozilla/layers/CompositorManagerChild.h"
     13 #include "mozilla/layers/CompositorManagerParent.h"
     14 #include "mozilla/layers/IAPZCTreeManager.h"
     15 #include "mozilla/widget/CompositorWidget.h"
     16 #include "mozilla/widget/PlatformWidgetTypes.h"
     17 #include "nsIWidget.h"
     18 
     19 namespace mozilla {
     20 namespace layers {
     21 
     22 InProcessCompositorSession::InProcessCompositorSession(
     23    nsIWidget* aWidget, widget::CompositorWidget* aCompositorWidget,
     24    CompositorBridgeChild* aChild, CompositorBridgeParent* aParent)
     25    : CompositorSession(aWidget, aCompositorWidget->AsDelegate(), aChild,
     26                        aParent->RootLayerTreeId()),
     27      mCompositorBridgeParent(aParent),
     28      mCompositorWidget(aCompositorWidget) {
     29  gfx::GPUProcessManager::Get()->RegisterInProcessSession(this);
     30 }
     31 
     32 /* static */
     33 RefPtr<InProcessCompositorSession> InProcessCompositorSession::Create(
     34    nsIWidget* aWidget, WebRenderLayerManager* aLayerManager,
     35    const LayersId& aRootLayerTreeId, CSSToLayoutDeviceScale aScale,
     36    const CompositorOptions& aOptions, bool aUseExternalSurfaceSize,
     37    const gfx::IntSize& aSurfaceSize, uint32_t aNamespace,
     38    uint64_t aInnerWindowId) {
     39  widget::CompositorWidgetInitData initData;
     40  aWidget->GetCompositorWidgetInitData(&initData);
     41 
     42  RefPtr<CompositorWidget> widget =
     43      CompositorWidget::CreateLocal(initData, aOptions, aWidget);
     44  RefPtr<CompositorBridgeParent> parent =
     45      CompositorManagerParent::CreateSameProcessWidgetCompositorBridge(
     46          aScale, aOptions, aUseExternalSurfaceSize, aSurfaceSize,
     47          aInnerWindowId);
     48  MOZ_ASSERT(parent);
     49  parent->InitSameProcess(widget, aRootLayerTreeId);
     50 
     51  RefPtr<CompositorBridgeChild> child =
     52      CompositorManagerChild::CreateSameProcessWidgetCompositorBridge(
     53          aLayerManager, aNamespace);
     54  MOZ_ASSERT(child);
     55  if (!child) {
     56    gfxCriticalNote << "Failed to create CompositorBridgeChild";
     57    return nullptr;
     58  }
     59 
     60  return new InProcessCompositorSession(aWidget, widget, child, parent);
     61 }
     62 
     63 void InProcessCompositorSession::NotifySessionLost() {
     64  // Hold a reference to mWidget since NotifyCompositorSessionLost may
     65  // release the last reference mid-execution.
     66  RefPtr<nsIWidget> widget(mWidget);
     67  widget->NotifyCompositorSessionLost(this);
     68 }
     69 
     70 CompositorBridgeParent* InProcessCompositorSession::GetInProcessBridge() const {
     71  return mCompositorBridgeParent;
     72 }
     73 
     74 void InProcessCompositorSession::SetContentController(
     75    GeckoContentController* aController) {
     76  mCompositorBridgeParent->SetControllerForLayerTree(mRootLayerTreeId,
     77                                                     aController);
     78 }
     79 
     80 RefPtr<IAPZCTreeManager> InProcessCompositorSession::GetAPZCTreeManager()
     81    const {
     82  return mCompositorBridgeParent->GetAPZCTreeManager(mRootLayerTreeId);
     83 }
     84 
     85 nsIWidget* InProcessCompositorSession::GetWidget() const { return mWidget; }
     86 
     87 void InProcessCompositorSession::Shutdown() {
     88  // Destroy will synchronously wait for the parent to acknowledge shutdown,
     89  // at which point CBP will defer a Release on the compositor thread. We
     90  // can safely release our reference now, and let the destructor run on either
     91  // thread.
     92 #if defined(MOZ_WIDGET_ANDROID)
     93  if (mUiCompositorControllerChild) {
     94    mUiCompositorControllerChild->Destroy();
     95    mUiCompositorControllerChild = nullptr;
     96  }
     97 #endif  // defined(MOZ_WIDGET_ANDROID)
     98  if (mCompositorBridgeChild) {
     99    mCompositorBridgeChild->Destroy();
    100    mCompositorBridgeChild = nullptr;
    101  }
    102  mCompositorBridgeParent = nullptr;
    103  mCompositorWidget = nullptr;
    104  gfx::GPUProcessManager::Get()->UnregisterInProcessSession(this);
    105 }
    106 
    107 }  // namespace layers
    108 }  // namespace mozilla