| Index: third_party/openvr/src/src/openvr_api_public.cpp
|
| diff --git a/third_party/openvr/src/src/openvr_api_public.cpp b/third_party/openvr/src/src/openvr_api_public.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..75b49b538be117b6ae8d65d6364ecd0733e9fafb
|
| --- /dev/null
|
| +++ b/third_party/openvr/src/src/openvr_api_public.cpp
|
| @@ -0,0 +1,284 @@
|
| +//========= Copyright Valve Corporation ============//
|
| +#define VR_API_EXPORT 1
|
| +#include "openvr.h"
|
| +#include "ivrclientcore.h"
|
| +#include "pathtools_public.h"
|
| +#include "sharedlibtools_public.h"
|
| +#include "envvartools_public.h"
|
| +#include "hmderrors_public.h"
|
| +#include "vrpathregistry_public.h"
|
| +
|
| +using vr::EVRInitError;
|
| +using vr::IVRSystem;
|
| +using vr::IVRClientCore;
|
| +using vr::VRInitError_None;
|
| +
|
| +namespace vr
|
| +{
|
| +
|
| +static void *g_pVRModule = NULL;
|
| +static IVRClientCore *g_pHmdSystem = NULL;
|
| +
|
| +
|
| +typedef void* (*VRClientCoreFactoryFn)(const char *pInterfaceName, int *pReturnCode);
|
| +
|
| +static uint32_t g_nVRToken = 0;
|
| +
|
| +uint32_t VR_GetInitToken()
|
| +{
|
| + return g_nVRToken;
|
| +}
|
| +
|
| +EVRInitError VR_LoadHmdSystemInternal();
|
| +void CleanupInternalInterfaces();
|
| +
|
| +
|
| +uint32_t VR_InitInternal( EVRInitError *peError, vr::EVRApplicationType eApplicationType )
|
| +{
|
| + EVRInitError err = VR_LoadHmdSystemInternal();
|
| + if (err != vr::VRInitError_None)
|
| + {
|
| + SharedLib_Unload(g_pVRModule);
|
| + g_pHmdSystem = NULL;
|
| + g_pVRModule = NULL;
|
| +
|
| + if (peError)
|
| + *peError = err;
|
| +
|
| + return 0;
|
| + }
|
| +
|
| + err = g_pHmdSystem->Init(eApplicationType);
|
| + if (err != VRInitError_None)
|
| + {
|
| + SharedLib_Unload(g_pVRModule);
|
| + g_pHmdSystem = NULL;
|
| + g_pVRModule = NULL;
|
| +
|
| + if (peError)
|
| + *peError = err;
|
| +
|
| + return 0;
|
| + }
|
| +
|
| + if (peError)
|
| + *peError = VRInitError_None;
|
| +
|
| + return ++g_nVRToken;
|
| +}
|
| +
|
| +void VR_ShutdownInternal()
|
| +{
|
| + if (g_pHmdSystem)
|
| + {
|
| + g_pHmdSystem->Cleanup();
|
| + g_pHmdSystem = NULL;
|
| + }
|
| + if (g_pVRModule)
|
| + {
|
| + SharedLib_Unload(g_pVRModule);
|
| + g_pVRModule = NULL;
|
| + }
|
| +
|
| +#if !defined( VR_API_PUBLIC )
|
| + CleanupInternalInterfaces();
|
| +#endif
|
| +
|
| + ++g_nVRToken;
|
| +}
|
| +
|
| +EVRInitError VR_LoadHmdSystemInternal()
|
| +{
|
| + std::string sRuntimePath, sConfigPath, sLogPath;
|
| +
|
| + bool bReadPathRegistry = CVRPathRegistry_Public::GetPaths( &sRuntimePath, &sConfigPath, &sLogPath, NULL, NULL );
|
| + if( !bReadPathRegistry )
|
| + {
|
| + return vr::VRInitError_Init_PathRegistryNotFound;
|
| + }
|
| +
|
| + // figure out where we're going to look for vrclient.dll
|
| + // see if the specified path actually exists.
|
| + if( !Path_IsDirectory( sRuntimePath ) )
|
| + {
|
| + return vr::VRInitError_Init_InstallationNotFound;
|
| + }
|
| +
|
| + // Because we don't have a way to select debug vs. release yet we'll just
|
| + // use debug if it's there
|
| +#if defined( LINUX64 )
|
| + std::string sTestPath = Path_Join( sRuntimePath, "bin", PLATSUBDIR );
|
| +#else
|
| + std::string sTestPath = Path_Join( sRuntimePath, "bin" );
|
| +#endif
|
| + if( !Path_IsDirectory( sTestPath ) )
|
| + {
|
| + return vr::VRInitError_Init_InstallationCorrupt;
|
| + }
|
| +
|
| +#if defined( WIN64 )
|
| + std::string sDLLPath = Path_Join( sTestPath, "vrclient_x64" DYNAMIC_LIB_EXT );
|
| +#else
|
| + std::string sDLLPath = Path_Join( sTestPath, "vrclient" DYNAMIC_LIB_EXT );
|
| +#endif
|
| +
|
| + // only look in the override
|
| + void *pMod = SharedLib_Load( sDLLPath.c_str() );
|
| + // nothing more to do if we can't load the DLL
|
| + if( !pMod )
|
| + {
|
| + return vr::VRInitError_Init_VRClientDLLNotFound;
|
| + }
|
| +
|
| + VRClientCoreFactoryFn fnFactory = ( VRClientCoreFactoryFn )( SharedLib_GetFunction( pMod, "VRClientCoreFactory" ) );
|
| + if( !fnFactory )
|
| + {
|
| + SharedLib_Unload( pMod );
|
| + return vr::VRInitError_Init_FactoryNotFound;
|
| + }
|
| +
|
| + int nReturnCode = 0;
|
| + g_pHmdSystem = static_cast< IVRClientCore * > ( fnFactory( vr::IVRClientCore_Version, &nReturnCode ) );
|
| + if( !g_pHmdSystem )
|
| + {
|
| + SharedLib_Unload( pMod );
|
| + return vr::VRInitError_Init_InterfaceNotFound;
|
| + }
|
| +
|
| + g_pVRModule = pMod;
|
| + return VRInitError_None;
|
| +}
|
| +
|
| +
|
| +void *VR_GetGenericInterface(const char *pchInterfaceVersion, EVRInitError *peError)
|
| +{
|
| + if (!g_pHmdSystem)
|
| + {
|
| + if (peError)
|
| + *peError = vr::VRInitError_Init_NotInitialized;
|
| + return NULL;
|
| + }
|
| +
|
| + return g_pHmdSystem->GetGenericInterface(pchInterfaceVersion, peError);
|
| +}
|
| +
|
| +bool VR_IsInterfaceVersionValid(const char *pchInterfaceVersion)
|
| +{
|
| + if (!g_pHmdSystem)
|
| + {
|
| + return false;
|
| + }
|
| +
|
| + return g_pHmdSystem->IsInterfaceVersionValid(pchInterfaceVersion) == VRInitError_None;
|
| +}
|
| +
|
| +bool VR_IsHmdPresent()
|
| +{
|
| + if( g_pHmdSystem )
|
| + {
|
| + // if we're already initialized, just call through
|
| + return g_pHmdSystem->BIsHmdPresent();
|
| + }
|
| + else
|
| + {
|
| + // otherwise we need to do a bit more work
|
| + EVRInitError err = VR_LoadHmdSystemInternal();
|
| + if( err != VRInitError_None )
|
| + return false;
|
| +
|
| + bool bHasHmd = g_pHmdSystem->BIsHmdPresent();
|
| +
|
| + g_pHmdSystem = NULL;
|
| + SharedLib_Unload( g_pVRModule );
|
| + g_pVRModule = NULL;
|
| +
|
| + return bHasHmd;
|
| + }
|
| +}
|
| +
|
| +/** Returns true if the OpenVR runtime is installed. */
|
| +bool VR_IsRuntimeInstalled()
|
| +{
|
| + if( g_pHmdSystem )
|
| + {
|
| + // if we're already initialized, OpenVR is obviously installed
|
| + return true;
|
| + }
|
| + else
|
| + {
|
| + // otherwise we need to do a bit more work
|
| + std::string sRuntimePath, sConfigPath, sLogPath;
|
| +
|
| + bool bReadPathRegistry = CVRPathRegistry_Public::GetPaths( &sRuntimePath, &sConfigPath, &sLogPath, NULL, NULL );
|
| + if( !bReadPathRegistry )
|
| + {
|
| + return false;
|
| + }
|
| +
|
| + // figure out where we're going to look for vrclient.dll
|
| + // see if the specified path actually exists.
|
| + if( !Path_IsDirectory( sRuntimePath ) )
|
| + {
|
| + return false;
|
| + }
|
| +
|
| + // the installation may be corrupt in some way, but it certainly looks installed
|
| + return true;
|
| + }
|
| +}
|
| +
|
| +
|
| +/** Returns where OpenVR runtime is installed. */
|
| +const char *VR_RuntimePath()
|
| +{
|
| + // otherwise we need to do a bit more work
|
| + static std::string sRuntimePath;
|
| + std::string sConfigPath, sLogPath;
|
| +
|
| + bool bReadPathRegistry = CVRPathRegistry_Public::GetPaths( &sRuntimePath, &sConfigPath, &sLogPath, NULL, NULL );
|
| + if ( !bReadPathRegistry )
|
| + {
|
| + return nullptr;
|
| + }
|
| +
|
| + // figure out where we're going to look for vrclient.dll
|
| + // see if the specified path actually exists.
|
| + if ( !Path_IsDirectory( sRuntimePath ) )
|
| + {
|
| + return nullptr;
|
| + }
|
| +
|
| + return sRuntimePath.c_str();
|
| +}
|
| +
|
| +
|
| +/** Returns the symbol version of an HMD error. */
|
| +const char *VR_GetVRInitErrorAsSymbol( EVRInitError error )
|
| +{
|
| + if( g_pHmdSystem )
|
| + return g_pHmdSystem->GetIDForVRInitError( error );
|
| + else
|
| + return GetIDForVRInitError( error );
|
| +}
|
| +
|
| +
|
| +/** Returns the english string version of an HMD error. */
|
| +const char *VR_GetVRInitErrorAsEnglishDescription( EVRInitError error )
|
| +{
|
| + if ( g_pHmdSystem )
|
| + return g_pHmdSystem->GetEnglishStringForHmdError( error );
|
| + else
|
| + return GetEnglishStringForHmdError( error );
|
| +}
|
| +
|
| +
|
| +VR_INTERFACE const char *VR_CALLTYPE VR_GetStringForHmdError( vr::EVRInitError error );
|
| +
|
| +/** Returns the english string version of an HMD error. */
|
| +const char *VR_GetStringForHmdError( EVRInitError error )
|
| +{
|
| + return VR_GetVRInitErrorAsEnglishDescription( error );
|
| +}
|
| +
|
| +}
|
| +
|
|
|