1 // Copyright 2019 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 #ifndef DEVICE_VR_WINDOWS_MIXED_REALITY_WRAPPERS_WMR_HOLOGRAPHIC_SPACE_H_
5 #define DEVICE_VR_WINDOWS_MIXED_REALITY_WRAPPERS_WMR_HOLOGRAPHIC_SPACE_H_
6 
7 #include <windows.graphics.holographic.h>
8 #include <wrl.h>
9 
10 #include <memory>
11 
12 #include "base/callback_list.h"
13 #include "base/macros.h"
14 
15 namespace device {
16 class WMRHolographicFrame;
17 class WMRHolographicSpace {
18  public:
19   virtual ~WMRHolographicSpace() = default;
20 
21   virtual ABI::Windows::Graphics::Holographic::HolographicAdapterId
22   PrimaryAdapterId() = 0;
23   virtual std::unique_ptr<WMRHolographicFrame> TryCreateNextFrame() = 0;
24   virtual bool TrySetDirect3D11Device(
25       const Microsoft::WRL::ComPtr<
26           ABI::Windows::Graphics::DirectX::Direct3D11::IDirect3DDevice>&
27           device) = 0;
28   virtual ABI::Windows::Graphics::Holographic::HolographicSpaceUserPresence
29   UserPresence() = 0;
30   virtual std::unique_ptr<base::CallbackList<void()>::Subscription>
31   AddUserPresenceChangedCallback(const base::RepeatingCallback<void()>& cb) = 0;
32 };
33 
34 class WMRHolographicSpaceImpl : public WMRHolographicSpace {
35  public:
36   explicit WMRHolographicSpaceImpl(
37       Microsoft::WRL::ComPtr<
38           ABI::Windows::Graphics::Holographic::IHolographicSpace> space);
39   ~WMRHolographicSpaceImpl() override;
40 
41   ABI::Windows::Graphics::Holographic::HolographicAdapterId PrimaryAdapterId()
42       override;
43   std::unique_ptr<WMRHolographicFrame> TryCreateNextFrame() override;
44   bool TrySetDirect3D11Device(
45       const Microsoft::WRL::ComPtr<
46           ABI::Windows::Graphics::DirectX::Direct3D11::IDirect3DDevice>& device)
47       override;
48   ABI::Windows::Graphics::Holographic::HolographicSpaceUserPresence
49   UserPresence() override;
50   std::unique_ptr<base::CallbackList<void()>::Subscription>
51   AddUserPresenceChangedCallback(
52       const base::RepeatingCallback<void()>& cb) override;
53 
54  private:
55   void SubscribeEvents();
56   void UnsubscribeEvents();
57 
58   HRESULT OnUserPresenceChanged(
59       ABI::Windows::Graphics::Holographic::IHolographicSpace*,
60       IInspectable*);
61 
62   Microsoft::WRL::ComPtr<ABI::Windows::Graphics::Holographic::IHolographicSpace>
63       space_;
64   Microsoft::WRL::ComPtr<
65       ABI::Windows::Graphics::Holographic::IHolographicSpace2>
66       space2_;
67 
68   EventRegistrationToken user_presence_changed_token_;
69   base::CallbackList<void()> user_presence_changed_callback_list_;
70 
71   DISALLOW_COPY_AND_ASSIGN(WMRHolographicSpaceImpl);
72 };
73 
74 }  // namespace device
75 
76 #endif  // DEVICE_VR_WINDOWS_MIXED_REALITY_WRAPPERS_WMR_HOLOGRAPHIC_SPACE_H_
77