DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Implementation

Mercurial (56e7b9127e89)

VCS Links

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef GFX_VR_PUPPET_H
#define GFX_VR_PUPPET_H

#include "nsTArray.h"
#include "mozilla/RefPtr.h"
#include "nsRefPtrHashtable.h"

#include "gfxVR.h"
#include "VRDisplayLocal.h"

#if defined(XP_WIN)
#include "CompositorD3D11.h"
#endif

#if defined(XP_MACOSX)
class MacIOSurface;
#endif
namespace mozilla {
namespace layers {
struct VertexShaderConstants;
struct PixelShaderConstants;
}
namespace gfx {
namespace impl {

class VRDisplayPuppet : public VRDisplayLocal
{
public:
  void SetDisplayInfo(const VRDisplayInfo& aDisplayInfo);
  void SetSensorState(const VRHMDSensorState& aSensorState);
  void ZeroSensor() override;

protected:
  virtual VRHMDSensorState GetSensorState() override;
  virtual void StartPresentation() override;
  virtual void StopPresentation() override;
#if defined(XP_WIN)
  virtual bool SubmitFrame(ID3D11Texture2D* aSource,
                           const IntSize& aSize,
                           const gfx::Rect& aLeftEyeRect,
                           const gfx::Rect& aRightEyeRect) override;
#elif defined(XP_MACOSX)
  virtual bool SubmitFrame(MacIOSurface* aMacIOSurface,
                           const IntSize& aSize,
                           const gfx::Rect& aLeftEyeRect,
                           const gfx::Rect& aRightEyeRect) override;
#elif defined(MOZ_WIDGET_ANDROID)
  virtual bool SubmitFrame(const mozilla::layers::SurfaceTextureDescriptor& aDescriptor,
                           const gfx::Rect& aLeftEyeRect,
                           const gfx::Rect& aRightEyeRect) override;
#endif

public:
  explicit VRDisplayPuppet();
  void Refresh();

protected:
  virtual ~VRDisplayPuppet();
  void Destroy();

  bool mIsPresenting;

private:
#if defined(XP_WIN)
  bool UpdateConstantBuffers();

  ID3D11VertexShader* mQuadVS;
  ID3D11PixelShader* mQuadPS;
  RefPtr<ID3D11SamplerState> mLinearSamplerState;
  layers::VertexShaderConstants mVSConstants;
  layers::PixelShaderConstants mPSConstants;
  RefPtr<ID3D11Buffer> mVSConstantBuffer;
  RefPtr<ID3D11Buffer> mPSConstantBuffer;
  RefPtr<ID3D11Buffer> mVertexBuffer;
  RefPtr<ID3D11InputLayout> mInputLayout;
#endif

  VRHMDSensorState mSensorState;
};

class VRControllerPuppet : public VRControllerHost
{
public:
  explicit VRControllerPuppet(dom::GamepadHand aHand, uint32_t aDisplayID);
  void SetButtonPressState(uint32_t aButton, bool aPressed);
  uint64_t GetButtonPressState();
  void SetButtonTouchState(uint32_t aButton, bool aTouched);
  uint64_t GetButtonTouchState();
  void SetAxisMoveState(uint32_t aAxis, double aValue);
  double GetAxisMoveState(uint32_t aAxis);
  void SetPoseMoveState(const dom::GamepadPoseState& aPose);
  const dom::GamepadPoseState& GetPoseMoveState();
  float GetAxisMove(uint32_t aAxis);
  void SetAxisMove(uint32_t aAxis, float aValue);

protected:
  virtual ~VRControllerPuppet();

private:
  uint64_t mButtonPressState;
  uint64_t mButtonTouchState;
  float mAxisMoveState[3];
  dom::GamepadPoseState mPoseState;
};

} // namespace impl

class VRSystemManagerPuppet : public VRSystemManager
{
public:
  static already_AddRefed<VRSystemManagerPuppet> Create();
  uint32_t CreateTestDisplay();
  void ClearTestDisplays();
  void SetPuppetDisplayInfo(const uint32_t& aDeviceID,
                            const VRDisplayInfo& aDisplayInfo);
  void SetPuppetDisplaySensorState(const uint32_t& aDeviceID,
                                   const VRHMDSensorState& aSensorState);

  virtual void Destroy() override;
  virtual void Shutdown() override;
  virtual void Enumerate() override;
  virtual void GetHMDs(nsTArray<RefPtr<VRDisplayHost>>& aHMDResult) override;
  virtual bool GetIsPresenting() override;
  virtual void HandleInput() override;
  virtual void GetControllers(nsTArray<RefPtr<VRControllerHost>>&
                              aControllerResult) override;
  virtual void ScanForControllers() override;
  virtual void RemoveControllers() override;
  virtual void VibrateHaptic(uint32_t aControllerIdx,
                             uint32_t aHapticIndex,
                             double aIntensity,
                             double aDuration,
                             const VRManagerPromise& aPromise) override;
  virtual void StopVibrateHaptic(uint32_t aControllerIdx) override;
  virtual void NotifyVSync() override;

protected:
  VRSystemManagerPuppet();

private:
  void HandleButtonPress(uint32_t aControllerIdx,
                         uint32_t aButton,
                         uint64_t aButtonMask,
                         uint64_t aButtonPressed,
                         uint64_t aButtonTouched);
  void HandleAxisMove(uint32_t aControllerIndex, uint32_t aAxis,
                      float aValue);
  void HandlePoseTracking(uint32_t aControllerIndex,
                          const dom::GamepadPoseState& aPose,
                          VRControllerHost* aController);

  // Enumerated puppet hardware devices, as seen by Web APIs:
  nsTArray<RefPtr<impl::VRDisplayPuppet>> mPuppetHMDs;
  nsTArray<RefPtr<impl::VRControllerPuppet>> mPuppetController;

  // Emulated hardware state, persistent through VRSystemManager::Shutdown():
  static const uint32_t kMaxPuppetDisplays = 5;
  uint32_t mPuppetDisplayCount;
  VRDisplayInfo mPuppetDisplayInfo[kMaxPuppetDisplays];
  VRHMDSensorState mPuppetDisplaySensorState[kMaxPuppetDisplays];
};

} // namespace gfx
} // namespace mozilla

#endif  /* GFX_VR_PUPPET_H*/