Win 8 Metro App compatible libOVR
Currently, the "libOVR" cannot be used in a Win8 Metro App since it fails the "Windows App Cert Kit"-Test due to calls to InitializeCriticalSection and LoadLibrary.
So we need to use InitializeCriticalSectionEx in Windows 8 without loading the function in runtime.
Heres my Code:
(ovr_atomic.h)
(ovr_atomic.cpp)
Now, the app certification doesnot fail any more (release build). Would be great if the Team could add some code like that in future Oculus SDK to keep it Metro app compatible. :D
So we need to use InitializeCriticalSectionEx in Windows 8 without loading the function in runtime.
Heres my Code:
(ovr_atomic.h)
// Include System thread functionality.
#if defined(OVR_OS_WIN32)
#include <windows.h>
#else
#include <pthread.h>
#endif
// Include Windows 8-Metro compatible Synchronization API
#if (NTDDI_VERSION >= NTDDI_WIN8)
#include <synchapi.h>
#endif
(ovr_atomic.cpp)
// ***** Standard Win32 Lock implementation
#if (NTDDI_VERSION < NTDDI_WIN8)
// Spin count init critical section function prototype for Window NT
typedef BOOL (WINAPI *Function_InitializeCriticalSectionAndSpinCount)
(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount);
#endif
// Constructors
Lock::Lock(unsigned spinCount)
{
#if ((defined OVR_BUILD_DEBUG) && (NTDDI_VERSION >= NTDDI_WIN8))
// On Windows 8 we use InitializeCriticalSectionEx due to Metro-Compatibility
InitializeCriticalSectionEx(&cs, spinCount, NULL);
#elif (NTDDI_VERSION >= NTDDI_WIN8)
// On Windows 8 we use InitializeCriticalSectionEx due to Metro-Compatibility
InitializeCriticalSectionEx(&cs, spinCount, CRITICAL_SECTION_NO_DEBUG_INFO);
#else
// Try to load function dynamically so that we don't require NT
// On Windows NT we will use InitializeCriticalSectionAndSpinCount
static bool initTried = 0;
static Function_InitializeCriticalSectionAndSpinCount pInitFn = 0;
if (!initTried)
{
HMODULE hmodule = ::LoadLibrary(OVR_STR("kernel32.dll"));
pInitFn = (Function_InitializeCriticalSectionAndSpinCount)
::GetProcAddress(hmodule, "InitializeCriticalSectionAndSpinCount");
initTried = 1;
}
// Initialize the critical section
if (pInitFn)
pInitFn(&cs, spinCount);
else
::InitializeCriticalSection(&cs);
#endif
}
Now, the app certification doesnot fail any more (release build). Would be great if the Team could add some code like that in future Oculus SDK to keep it Metro app compatible. :D
