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 
5 #ifndef DEVICE_VR_OPENXR_OPENXR_RENDER_LOOP_H_
6 #define DEVICE_VR_OPENXR_OPENXR_RENDER_LOOP_H_
7 
8 #include <stdint.h>
9 #include <memory>
10 
11 #include "base/callback.h"
12 #include "base/macros.h"
13 #include "device/vr/openxr/openxr_util.h"
14 #include "device/vr/windows/compositor_base.h"
15 #include "third_party/openxr/src/include/openxr/openxr.h"
16 
17 struct XrView;
18 
19 namespace device {
20 
21 class OpenXrApiWrapper;
22 class OpenXRInputHelper;
23 
24 class OpenXrRenderLoop : public XRCompositorCommon {
25  public:
26   OpenXrRenderLoop(base::RepeatingCallback<void(mojom::VRDisplayInfoPtr)>
27                        on_display_info_changed,
28                    XrInstance instance,
29                    const OpenXrExtensionHelper& extension_helper_);
30   ~OpenXrRenderLoop() override;
31 
32  private:
33   // XRCompositorCommon:
34   void ClearPendingFrameInternal() override;
35 
36   // XRDeviceAbstraction:
37   mojom::XRFrameDataPtr GetNextFrameData() override;
38   bool StartRuntime() override;
39   void StopRuntime() override;
40   void OnSessionStart() override;
41   bool PreComposite() override;
42   bool HasSessionEnded() override;
43   bool SubmitCompositedFrame() override;
44   device::mojom::XREnvironmentBlendMode GetEnvironmentBlendMode(
45       device::mojom::XRSessionMode session_mode) override;
46   device::mojom::XRInteractionMode GetInteractionMode(
47       device::mojom::XRSessionMode session_mode) override;
48   bool CanEnableAntiAliasing() const override;
49 
50   void InitializeDisplayInfo();
51   bool UpdateEyeParameters();
52   bool UpdateEye(const XrView& view_head,
53                  const gfx::Size& view_size,
54                  mojom::VREyeParametersPtr* eye) const;
55   void UpdateStageParameters();
56 
57   // Owned by OpenXrStatics
58   XrInstance instance_;
59   const OpenXrExtensionHelper& extension_helper_;
60 
61   std::unique_ptr<OpenXrApiWrapper> openxr_;
62   std::unique_ptr<OpenXRInputHelper> input_helper_;
63 
64   base::RepeatingCallback<void(mojom::VRDisplayInfoPtr)>
65       on_display_info_changed_;
66   mojom::VRDisplayInfoPtr current_display_info_;
67 
68   // This must be the last member
69   base::WeakPtrFactory<OpenXrRenderLoop> weak_ptr_factory_{this};
70 
71   DISALLOW_COPY_AND_ASSIGN(OpenXrRenderLoop);
72 };
73 
74 }  // namespace device
75 
76 #endif  // DEVICE_VR_OPENXR_OPENXR_RENDER_LOOP_H_
77