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_RENDERING_H_
5 #define DEVICE_VR_WINDOWS_MIXED_REALITY_WRAPPERS_WMR_RENDERING_H_
6 
7 #include <d3d11.h>
8 #include <windows.graphics.holographic.h>
9 #include <wrl.h>
10 
11 #include <memory>
12 #include <vector>
13 
14 #include "base/macros.h"
15 
16 namespace device {
17 class WMRCoordinateSystem;
18 
19 class WMRCamera {
20  public:
21   virtual ~WMRCamera() = default;
22 
23   virtual ABI::Windows::Foundation::Size RenderTargetSize() = 0;
24   virtual bool IsStereo() = 0;
25 };
26 
27 class WMRCameraImpl : public WMRCamera {
28  public:
29   explicit WMRCameraImpl(
30       Microsoft::WRL::ComPtr<
31           ABI::Windows::Graphics::Holographic::IHolographicCamera> camera);
32   ~WMRCameraImpl() override;
33 
34   ABI::Windows::Foundation::Size RenderTargetSize() override;
35   bool IsStereo() override;
36 
37  private:
38   Microsoft::WRL::ComPtr<
39       ABI::Windows::Graphics::Holographic::IHolographicCamera>
40       camera_;
41 
42   DISALLOW_COPY_AND_ASSIGN(WMRCameraImpl);
43 };
44 
45 class WMRCameraPose {
46  public:
47   virtual ~WMRCameraPose() = default;
48 
49   virtual ABI::Windows::Foundation::Rect Viewport() = 0;
50   virtual std::unique_ptr<WMRCamera> HolographicCamera() = 0;
51   virtual ABI::Windows::Graphics::Holographic::HolographicStereoTransform
52   ProjectionTransform() = 0;
53   virtual bool TryGetViewTransform(
54       const WMRCoordinateSystem* origin,
55       ABI::Windows::Graphics::Holographic::HolographicStereoTransform*
56           transform) = 0;
57   virtual ABI::Windows::Graphics::Holographic::IHolographicCameraPose*
58   GetRawPtr() const;
59 };
60 
61 class WMRCameraPoseImpl : public WMRCameraPose {
62  public:
63   explicit WMRCameraPoseImpl(
64       Microsoft::WRL::ComPtr<
65           ABI::Windows::Graphics::Holographic::IHolographicCameraPose> pose);
66   ~WMRCameraPoseImpl() override;
67 
68   ABI::Windows::Foundation::Rect Viewport() override;
69   std::unique_ptr<WMRCamera> HolographicCamera() override;
70   ABI::Windows::Graphics::Holographic::HolographicStereoTransform
71   ProjectionTransform() override;
72   bool TryGetViewTransform(
73       const WMRCoordinateSystem* origin,
74       ABI::Windows::Graphics::Holographic::HolographicStereoTransform*
75           transform) override;
76   ABI::Windows::Graphics::Holographic::IHolographicCameraPose* GetRawPtr()
77       const override;
78 
79  private:
80   Microsoft::WRL::ComPtr<
81       ABI::Windows::Graphics::Holographic::IHolographicCameraPose>
82       pose_;
83 
84   DISALLOW_COPY_AND_ASSIGN(WMRCameraPoseImpl);
85 };
86 
87 class WMRRenderingParameters {
88  public:
89   virtual ~WMRRenderingParameters() = default;
90 
91   virtual Microsoft::WRL::ComPtr<ID3D11Texture2D>
92   TryGetBackbufferAsTexture2D() = 0;
93 };
94 
95 class WMRRenderingParametersImpl : public WMRRenderingParameters {
96  public:
97   explicit WMRRenderingParametersImpl(
98       Microsoft::WRL::ComPtr<ABI::Windows::Graphics::Holographic::
99                                  IHolographicCameraRenderingParameters>
100           rendering_params);
101   ~WMRRenderingParametersImpl() override;
102 
103   Microsoft::WRL::ComPtr<ID3D11Texture2D> TryGetBackbufferAsTexture2D()
104       override;
105 
106  private:
107   Microsoft::WRL::ComPtr<ABI::Windows::Graphics::Holographic::
108                              IHolographicCameraRenderingParameters>
109       rendering_params_;
110 
111   DISALLOW_COPY_AND_ASSIGN(WMRRenderingParametersImpl);
112 };
113 
114 }  // namespace device
115 #endif  // DEVICE_VR_WINDOWS_MIXED_REALITY_WRAPPERS_WMR_RENDERING_H_
116