14 #include <display-plugins/hmd/HmdDisplayPlugin.h>
16 #include <graphics/Geometry.h>
18 const float TARGET_RATE_OpenVr = 90.0f;
21 class OffscreenContext;
23 class OpenVrSubmitThread;
24 class OffscreenGLCanvas;
25 static const size_t COMPOSITING_BUFFER_SIZE = 3;
27 struct CompositeInfo {
28 using Queue = std::queue<CompositeInfo>;
29 using Array = std::array<CompositeInfo, COMPOSITING_BUFFER_SIZE>;
31 gpu::TexturePointer texture;
32 uint32_t textureID { 0 };
37 class OpenVrDisplayPlugin :
public HmdDisplayPlugin {
38 using Parent = HmdDisplayPlugin;
40 bool isSupported()
const override;
41 const QString getName()
const override;
42 bool getSupportsAutoSwitch() override final {
return true; }
44 glm::mat4 getEyeProjection(Eye eye,
const glm::mat4& baseProjection)
const override;
45 glm::mat4 getCullingProjection(
const glm::mat4& baseProjection)
const override;
49 float getTargetFrameRate()
const override;
50 bool hasAsyncReprojection()
const override {
return _asyncReprojectionActive; }
52 void customizeContext()
override;
53 void uncustomizeContext()
override;
56 void resetSensors()
override;
57 bool beginFrameRender(uint32_t frameIndex)
override;
58 void cycleDebugOutput()
override { _lockCurrentTexture = !_lockCurrentTexture; }
60 bool suppressKeyboard()
override;
61 void unsuppressKeyboard()
override;
62 bool isKeyboardVisible()
override;
65 int getRequiredThreadCount()
const override;
67 QString getPreferredAudioInDevice()
const override;
68 QString getPreferredAudioOutDevice()
const override;
70 QRectF getPlayAreaRect()
override;
72 virtual StencilMaskMode getStencilMaskMode()
const override {
return StencilMaskMode::MESH; }
73 virtual StencilMaskMeshOperator getStencilMaskMeshOperator()
override;
75 virtual void updateParameters(
float visionSqueezeX,
float visionSqueezeY,
float visionSqueezeTransition,
76 int visionSqueezePerEye,
float visionSqueezeGroundPlaneY,
77 float visionSqueezeSpotlightSize)
override;
79 glm::mat4 getSensorResetMatrix()
const {
return _sensorResetMat; }
82 bool internalActivate()
override;
83 void internalDeactivate()
override;
84 void updatePresentPose()
override;
86 void compositeLayers()
override;
87 void hmdPresent()
override;
88 bool isHmdMounted()
const override;
89 void postPreview()
override;
92 vr::IVRSystem* _system {
nullptr };
93 std::atomic<uint32_t> _keyboardSupressionCount{ 0 };
95 vr::HmdMatrix34_t _lastGoodHMDPose;
97 bool _threadedSubmit {
true };
99 CompositeInfo::Array _compositeInfos;
100 size_t _renderingIndex { 0 };
101 std::shared_ptr<OpenVrSubmitThread> _submitThread;
102 std::shared_ptr<gl::OffscreenContext> _submitCanvas;
103 friend class OpenVrSubmitThread;
105 bool _asyncReprojectionActive {
false };
107 bool _hmdMounted {
false };
109 std::array<graphics::MeshPointer, 2> _stencilMeshes;
110 bool _stencilMeshesInitialized {
false };
112 float _visionSqueezeX;
113 float _visionSqueezeY;
114 float _visionSqueezeTransition;
115 int _visionSqueezePerEye;
116 float _visionSqueezeGroundPlaneY;
117 float _visionSqueezeSpotlightSize;