1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #ifndef widget_windows_CompositorWidgetParent_h 7 #define widget_windows_CompositorWidgetParent_h 8 9 #include "WinCompositorWidget.h" 10 #include "mozilla/Maybe.h" 11 #include "mozilla/widget/PCompositorWidgetParent.h" 12 13 namespace mozilla { 14 namespace widget { 15 16 namespace remote_backbuffer { 17 class Client; 18 } 19 20 class CompositorWidgetParent final : public PCompositorWidgetParent, 21 public WinCompositorWidget { 22 public: 23 explicit CompositorWidgetParent(const CompositorWidgetInitData& aInitData, 24 const layers::CompositorOptions& aOptions); 25 ~CompositorWidgetParent() override; 26 27 bool Initialize(const RemoteBackbufferHandles& aRemoteHandles); 28 29 bool PreRender(WidgetRenderingContext*) override; 30 void PostRender(WidgetRenderingContext*) override; 31 already_AddRefed<gfx::DrawTarget> StartRemoteDrawingInRegion( 32 const LayoutDeviceIntRegion& aInvalidRegion, 33 layers::BufferMode* aBufferMode) override; 34 void EndRemoteDrawingInRegion( 35 gfx::DrawTarget* aDrawTarget, 36 const LayoutDeviceIntRegion& aInvalidRegion) override; 37 bool NeedsToDeferEndRemoteDrawing() override; 38 LayoutDeviceIntSize GetClientSize() override; 39 already_AddRefed<gfx::DrawTarget> GetBackBufferDrawTarget( 40 gfx::DrawTarget* aScreenTarget, const gfx::IntRect& aRect, 41 bool* aOutIsCleared) override; 42 already_AddRefed<gfx::SourceSurface> EndBackBufferDrawing() override; 43 bool InitCompositor(layers::Compositor* aCompositor) override; 44 bool IsHidden() const override; 45 46 bool HasGlass() const override; 47 48 nsSizeMode GetWindowSizeMode() const override; 49 bool GetWindowIsFullyOccluded() const override; 50 51 mozilla::ipc::IPCResult RecvInitialize( 52 const RemoteBackbufferHandles& aRemoteHandles) override; 53 mozilla::ipc::IPCResult RecvEnterPresentLock() override; 54 mozilla::ipc::IPCResult RecvLeavePresentLock() override; 55 mozilla::ipc::IPCResult RecvUpdateTransparency( 56 const nsTransparencyMode& aMode) override; 57 mozilla::ipc::IPCResult RecvNotifyVisibilityUpdated( 58 const nsSizeMode& aSizeMode, const bool& aIsFullyOccluded) override; 59 mozilla::ipc::IPCResult RecvClearTransparentWindow() override; 60 void ActorDestroy(ActorDestroyReason aWhy) override; 61 62 nsIWidget* RealWidget() override; 63 void ObserveVsync(VsyncObserver* aObserver) override; 64 RefPtr<VsyncObserver> GetVsyncObserver() const override; 65 66 // PlatformCompositorWidgetDelegate Overrides 67 void UpdateCompositorWnd(const HWND aCompositorWnd, 68 const HWND aParentWnd) override; 69 void SetRootLayerTreeID(const layers::LayersId& aRootLayerTreeId) override; 70 71 private: 72 RefPtr<VsyncObserver> mVsyncObserver; 73 Maybe<layers::LayersId> mRootLayerTreeID; 74 75 HWND mWnd; 76 77 gfx::CriticalSection mPresentLock; 78 79 // Transparency handling. 80 mozilla::Atomic<nsTransparencyMode, MemoryOrdering::Relaxed> 81 mTransparencyMode; 82 83 // Visibility handling. 84 mozilla::Atomic<nsSizeMode, MemoryOrdering::Relaxed> mSizeMode; 85 mozilla::Atomic<bool, MemoryOrdering::Relaxed> mIsFullyOccluded; 86 87 std::unique_ptr<remote_backbuffer::Client> mRemoteBackbufferClient; 88 }; 89 90 } // namespace widget 91 } // namespace mozilla 92 93 #endif // widget_windows_CompositorWidgetParent_h 94