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