tor-browser

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

RemoteCompositorSession.cpp (3387B)


      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 "RemoteCompositorSession.h"
      8 #include "gfxPlatform.h"
      9 #include "mozilla/VsyncDispatcher.h"
     10 #include "mozilla/gfx/GPUProcessManager.h"
     11 #include "mozilla/layers/APZChild.h"
     12 #include "mozilla/layers/APZCTreeManagerChild.h"
     13 #include "mozilla/layers/CompositorBridgeChild.h"
     14 #include "mozilla/layers/GeckoContentController.h"
     15 #include "nsIWidget.h"
     16 #if defined(MOZ_WIDGET_ANDROID)
     17 #  include "mozilla/layers/UiCompositorControllerChild.h"
     18 #endif  // defined(MOZ_WIDGET_ANDROID)
     19 
     20 namespace mozilla {
     21 namespace layers {
     22 
     23 using namespace gfx;
     24 using namespace widget;
     25 
     26 RemoteCompositorSession::RemoteCompositorSession(
     27    nsIWidget* aWidget, CompositorBridgeChild* aChild,
     28    CompositorWidgetDelegate* aWidgetDelegate, APZCTreeManagerChild* aAPZ,
     29    const LayersId& aRootLayerTreeId)
     30    : CompositorSession(aWidget, aWidgetDelegate, aChild, aRootLayerTreeId),
     31      mAPZ(aAPZ) {
     32  MOZ_ASSERT(!gfxPlatform::IsHeadless());
     33  GPUProcessManager::Get()->RegisterRemoteProcessSession(this);
     34  if (mAPZ) {
     35    mAPZ->SetCompositorSession(this);
     36  }
     37 }
     38 
     39 RemoteCompositorSession::~RemoteCompositorSession() {
     40  // This should have been shutdown first.
     41  MOZ_ASSERT(!mCompositorBridgeChild);
     42 #if defined(MOZ_WIDGET_ANDROID)
     43  MOZ_ASSERT(!mUiCompositorControllerChild);
     44 #endif  // defined(MOZ_WIDGET_ANDROID)
     45 }
     46 
     47 void RemoteCompositorSession::NotifySessionLost() {
     48  // Hold a reference to mWidget since NotifyCompositorSessionLost may
     49  // release the last reference mid-execution.
     50  RefPtr<nsIWidget> widget(mWidget);
     51  // Re-entrancy should be impossible: when we are being notified of a lost
     52  // session, we have by definition not shut down yet. We will shutdown, but
     53  // then will be removed from the notification list.
     54  widget->NotifyCompositorSessionLost(this);
     55 }
     56 
     57 CompositorBridgeParent* RemoteCompositorSession::GetInProcessBridge() const {
     58  return nullptr;
     59 }
     60 
     61 void RemoteCompositorSession::SetContentController(
     62    GeckoContentController* aController) {
     63  mContentController = aController;
     64  mCompositorBridgeChild->SendPAPZConstructor(new APZChild(aController),
     65                                              LayersId{0});
     66 }
     67 
     68 GeckoContentController* RemoteCompositorSession::GetContentController() {
     69  return mContentController.get();
     70 }
     71 
     72 nsIWidget* RemoteCompositorSession::GetWidget() const { return mWidget; }
     73 
     74 RefPtr<IAPZCTreeManager> RemoteCompositorSession::GetAPZCTreeManager() const {
     75  return mAPZ;
     76 }
     77 
     78 void RemoteCompositorSession::Shutdown() {
     79  mContentController = nullptr;
     80  if (mAPZ) {
     81    mAPZ->SetCompositorSession(nullptr);
     82    mAPZ->Destroy();
     83  }
     84  if (mCompositorBridgeChild) {
     85    mCompositorBridgeChild->Destroy();
     86    mCompositorBridgeChild = nullptr;
     87  }
     88  mCompositorWidgetDelegate = nullptr;
     89  mWidget = nullptr;
     90 #if defined(MOZ_WIDGET_ANDROID)
     91  if (mUiCompositorControllerChild) {
     92    mUiCompositorControllerChild->Destroy();
     93    mUiCompositorControllerChild = nullptr;
     94  }
     95 #endif  // defined(MOZ_WIDGET_ANDROID)
     96  GPUProcessManager::Get()->UnregisterRemoteProcessSession(this);
     97 }
     98 
     99 }  // namespace layers
    100 }  // namespace mozilla