diff options
Diffstat (limited to 'LibOVR/Src/CAPI/CAPI_HMDState.h')
-rw-r--r-- | LibOVR/Src/CAPI/CAPI_HMDState.h | 215 |
1 files changed, 86 insertions, 129 deletions
diff --git a/LibOVR/Src/CAPI/CAPI_HMDState.h b/LibOVR/Src/CAPI/CAPI_HMDState.h index 0a1466f..81ca64f 100644 --- a/LibOVR/Src/CAPI/CAPI_HMDState.h +++ b/LibOVR/Src/CAPI/CAPI_HMDState.h @@ -5,16 +5,16 @@ Content : State associated with a single HMD Created : January 24, 2014 Authors : Michael Antonov -Copyright : Copyright 2014 Oculus VR, Inc. All Rights reserved. +Copyright : Copyright 2014 Oculus VR, LLC All Rights reserved. -Licensed under the Oculus VR Rift SDK License Version 3.1 (the "License"); +Licensed under the Oculus VR Rift SDK License Version 3.2 (the "License"); you may not use the Oculus VR Rift SDK except in compliance with the License, which is provided at the time of installation or download, or which otherwise accompanies this software in either electronic or hard copy form. You may obtain a copy of the License at -http://www.oculusvr.com/licenses/LICENSE-3.1 +http://www.oculusvr.com/licenses/LICENSE-3.2 Unless required by applicable law or agreed to in writing, the Oculus VR SDK distributed under the License is distributed on an "AS IS" BASIS, @@ -31,28 +31,25 @@ limitations under the License. #include "../Kernel/OVR_List.h" #include "../Kernel/OVR_Log.h" #include "../OVR_CAPI.h" -#include "../OVR_SensorFusion.h" -#include "../Util/Util_LatencyTest.h" -#include "../Util/Util_LatencyTest2.h" #include "CAPI_FrameTimeManager.h" +#include "CAPI_LatencyStatistics.h" #include "CAPI_HMDRenderState.h" #include "CAPI_DistortionRenderer.h" +#include "CAPI_HSWDisplay.h" -// Define OVR_CAPI_VISIONSUPPORT to compile in vision support -#ifdef OVR_CAPI_VISIONSUPPORT - #define OVR_CAPI_VISION_CODE(c) c - #include "../Vision/Vision_PoseTracker.h" -#else - #define OVR_CAPI_VISION_CODE(c) -#endif - +#include "../Service/Service_NetClient.h" +#include "../Net/OVR_NetworkTypes.h" +#include "../Util/Util_LatencyTest2Reader.h" struct ovrHmdStruct { }; namespace OVR { namespace CAPI { + using namespace OVR::Util::Render; +using namespace OVR::Service; +using namespace OVR::Net; //------------------------------------------------------------------------------------- @@ -104,7 +101,7 @@ public: FirstThread = 0; } - // Add thread-re-entrancy check for function scope. + // Add thread-reentrancy check for function scope. struct Scope { Scope(ThreadChecker* threadChecker, const char *functionName) : pChecker(threadChecker) @@ -131,61 +128,51 @@ private: class HMDState : public ListNode<HMDState>, public ovrHmdStruct, public NewOverrideBase { -public: + void operator=(const HMDState&) { } // Quiet warning. - HMDState(HMDDevice* device); - HMDState(ovrHmdType hmdType); +protected: + HMDState(const OVR::Service::HMDNetworkInfo& netInfo, + const OVR::HMDInfo& hmdInfo, + Profile* profile, + Service::NetClient* client); + HMDState(const HMDInfo& src, Profile* profile); + +public: virtual ~HMDState(); + static HMDState* CreateHMDState(Service::NetClient* client, const HMDNetworkInfo& netInfo); + static HMDState* CreateHMDState(ovrHmdType hmdType); // Used for debug mode + static const OVR::List<HMDState>& GetHMDStateList(); // *** Sensor Setup - bool StartSensor(unsigned supportedCaps, unsigned requiredCaps); - void StopSensor(); - void ResetSensor(); - ovrSensorState PredictedSensorState(double absTime); - bool GetSensorDesc(ovrSensorDesc* descOut); + bool ConfigureTracking(unsigned supportedCaps, unsigned requiredCaps); + void ResetTracking(); + void RecenterPose(); + ovrTrackingState PredictedTrackingState(double absTime); // Changes HMD Caps. // Capability bits that are not directly or logically tied to one system (such as sensor) // are grouped here. ovrHmdCap_VSync, for example, affects rendering and timing. void SetEnabledHmdCaps(unsigned caps); - + unsigned SetEnabledHmdCaps(); bool ProcessLatencyTest(unsigned char rgbColorOut[3]); - void ProcessLatencyTest2(unsigned char rgbColorOut[3], double startTime); - // *** Rendering Setup - - bool ConfigureRendering(ovrEyeRenderDesc eyeRenderDescOut[2], - const ovrFovPort eyeFovIn[2], - const ovrRenderAPIConfig* apiConfig, - unsigned distortionCaps); + bool ConfigureRendering(ovrEyeRenderDesc eyeRenderDescOut[2], + const ovrFovPort eyeFovIn[2], + const ovrRenderAPIConfig* apiConfig, + unsigned distortionCaps); - ovrPosef BeginEyeRender(ovrEyeType eye); - void EndEyeRender(ovrEyeType eye, ovrPosef renderPose, ovrTexture* eyeTexture); + void UpdateRenderProfile(Profile* profile); - const char* GetLastError() - { - const char* p = pLastError; - pLastError = 0; - return p; - } + void SubmitEyeTextures(const ovrPosef renderPose[2], + const ovrTexture eyeTexture[2]); - void NotifyAddDevice(DeviceType deviceType) - { - if (deviceType == Device_Sensor) - AddSensorCount++; - else if (deviceType == Device_LatencyTester) - { - AddLatencyTestCount++; - AddLatencyTestDisplayCount++; - } - } - bool checkCreateSensor(); + void sharedInit ( Profile *profile ); void applyProfileToSensorFusion(); @@ -197,7 +184,7 @@ public: OVR_UNUSED1(functionName); // for Release build. OVR_ASSERT_LOG(BeginFrameCalled == true, ("%s called outside ovrHmd_BeginFrame.", functionName)); - OVR_ASSERT_LOG(BeginFrameThreadId == OVR::GetCurrentThreadId(), + OVR_DEBUG_LOG_COND(BeginFrameThreadId != OVR::GetCurrentThreadId(), ("%s called on a different thread then ovrHmd_BeginFrame.", functionName)); } @@ -215,105 +202,68 @@ public: ("%s called outside ovrHmd_BeginFrameTiming.", functionName)); } - - HMDState* getThis() { return this; } - - void updateLowPersistenceMode(bool lowPersistence) const; - void updateLatencyTestForHmd(bool latencyTesting); - - void updateDK2FeaturesTiedToSensor(bool sensorCreatedJustNow); - // Get properties by name. - float getFloatValue(const char* propertyName, float defaultVal); + bool getBoolValue(const char* propertyName, bool defaultVal); + bool setBoolValue(const char* propertyName, bool value); + int getIntValue(const char* propertyName, int defaultVal); + bool setIntValue(const char* propertyName, int value); + float getFloatValue(const char* propertyName, float defaultVal); bool setFloatValue(const char* propertyName, float value); unsigned getFloatArray(const char* propertyName, float values[], unsigned arraySize); bool setFloatArray(const char* propertyName, float values[], unsigned arraySize); - const char* getString(const char* propertyName, const char* defaultVal); + const char* getString(const char* propertyName, const char* defaultVal); + bool setString(const char* propertyName, const char* value); + + VirtualHmdId GetNetId() { return NetId; } + public: - - // Wrapper to support 'const' - struct HMDInfoWrapper - { - HMDInfoWrapper(ovrHmdType hmdType) - { - HmdTypeEnum t = HmdType_None; - if (hmdType == ovrHmd_DK1) - t = HmdType_DK1; - else if (hmdType == ovrHmd_CrystalCoveProto) - t = HmdType_CrystalCoveProto; - else if (hmdType == ovrHmd_DK2) - t = HmdType_DK2; - h = CreateDebugHMDInfo(t); - } - HMDInfoWrapper(HMDDevice* device) { if (device) device->GetDeviceInfo(&h); } - OVR::HMDInfo h; - }; + Ptr<Profile> pProfile; + // Descriptor that gets allocated and returned to the user as ovrHmd. + ovrHmdDesc* pHmdDesc; + // Window handle passed in AttachWindow. + void* pWindow; - // Note: pHMD can be null if we are representing a virtualized debug HMD. - Ptr<HMDDevice> pHMD; + // Network + Service::NetClient* pClient; + VirtualHmdId NetId; + HMDNetworkInfo NetInfo; - // HMDInfo shouldn't change, as its string pointers are passed out. - const HMDInfoWrapper HMDInfoW; - const OVR::HMDInfo& HMDInfo; + // HMDInfo shouldn't change, as its string pointers are passed out. + HMDInfo OurHMDInfo; const char* pLastError; // Caps enabled for the HMD. unsigned EnabledHmdCaps; + + // Caps actually sent to the Sensor Service + unsigned EnabledServiceHmdCaps; + // These are the flags actually applied to the Sensor device, // used to track whether SetDisplayReport calls are necessary. - unsigned HmdCapsAppliedToSensor; - + //unsigned HmdCapsAppliedToSensor; // *** Sensor - - // Lock used to support thread-safe lifetime access to sensor. - Lock DevicesLock; - - // Atomic integer used as a flag that we should check the sensor device. - AtomicInt<int> AddSensorCount; - - // All of Sensor variables may be modified/used with DevicesLock, with exception that - // the {SensorStarted, SensorCreated} can be read outside the lock to see - // if device creation check is necessary. - // Whether we called StartSensor() and requested sensor caps. - volatile bool SensorStarted; - volatile bool SensorCreated; - // pSensor may still be null or non-running after start if it wasn't yet available - Ptr<SensorDevice> pSensor; // Head - unsigned SensorCaps; - - // SensorFusion state may be accessible without a lock. - SensorFusion SFusion; - - - // Vision pose tracker is currently new-allocated - OVR_CAPI_VISION_CODE( - Vision::PoseTracker* pPoseTracker; - ) - - // Latency tester - Ptr<LatencyTestDevice> pLatencyTester; - Util::LatencyTest LatencyUtil; - AtomicInt<int> AddLatencyTestCount; + Tracking::CombinedSharedStateReader SharedStateReader; + Tracking::SensorStateReader TheSensorStateReader; + Util::RecordStateReader TheLatencyTestStateReader; bool LatencyTestActive; unsigned char LatencyTestDrawColor[3]; - // Using latency tester as debug display - Ptr<LatencyTestDevice> pLatencyTesterDisplay; - AtomicInt<int> AddLatencyTestDisplayCount; - Util::LatencyTest2 LatencyUtil2; - bool LatencyTest2Active; unsigned char LatencyTest2DrawColor[3]; - //bool ReadbackColor; // Rendering part FrameTimeManager TimeManager; + LagStatsCalculator LagStats; + LatencyStatisticsCSV LagStatsCSV; HMDRenderState RenderState; Ptr<DistortionRenderer> pRenderer; - + + // Health and Safety Warning display. + Ptr<HSWDisplay> pHSWDisplay; + // Last timing value reported by BeginFrame. double LastFrameTimeSeconds; // Last timing value reported by GetFrameTime. These are separate since the intended @@ -323,7 +273,6 @@ public: // Last cached value returned by ovrHmd_GetString/ovrHmd_GetStringArray. char LastGetStringValue[256]; - // Debug flag set after ovrHmd_ConfigureRendering succeeds. bool RenderingConfigured; // Set after BeginFrame succeeds, and its corresponding thread id for debug checks. @@ -333,15 +282,23 @@ public: ThreadChecker RenderAPIThreadChecker; // bool BeginFrameTimingCalled; - - // Flags set when we've called BeginEyeRender on a given eye. - bool EyeRenderActive[2]; }; -}} // namespace OVR::CAPI -#endif // OVR_CAPI_HMDState_h +//I appreciate this isn't an idea place for this function prototype, but needed +//to be seen by OVR_CAPI.cpp and the various SDK renderers of CAPI, +//and have everything defined. Please move to a better place if you know of one. +ovrBool ovrHmd_CreateDistortionMeshInternal( ovrHmdStruct * hmd, + ovrEyeType eyeType, ovrFovPort fov, + unsigned int distortionCaps, + ovrDistortionMesh *meshData, + float overrideEyeReliefIfNonZero=0 ); + + +}} // namespace OVR::CAPI + +#endif // OVR_CAPI_HMDState_h |