Skip to content

Commit 3c70b99

Browse files
authored
OpenXR implementation (#3428)
1 parent 3681df1 commit 3c70b99

16 files changed

+2689
-24
lines changed

README.md

+7
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,13 @@ npm install
118118
npm run compress
119119
```
120120

121+
## Enable OpenXR builds
122+
You can enable OpenXR API for Oculus by adding this property to your `user.properties` file:
123+
124+
```ini
125+
openxr=true
126+
```
127+
121128
## Development troubleshooting
122129

123130
### `Device supports , but APK only supports armeabi-v7a[...]`

app/CMakeLists.txt

+37-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,34 @@ target_link_libraries(native-lib native_app_glue)
8282
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -u ANativeActivity_onCreate")
8383
endif()
8484

85-
if(OCULUSVR)
85+
86+
if(OPENXR)
87+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DXR_USE_PLATFORM_ANDROID -DXR_USE_GRAPHICS_API_OPENGL_ES")
88+
include_directories(
89+
${CMAKE_SOURCE_DIR}/../third_party/OpenXR-SDK/include
90+
${CMAKE_SOURCE_DIR}/../third_party/ovr_openxr_mobile_sdk/OpenXR/Include
91+
${CMAKE_SOURCE_DIR}/../app/src/openxr/cpp
92+
)
93+
target_sources(
94+
native-lib
95+
PUBLIC
96+
src/openxr/cpp/DeviceDelegateOpenXR.cpp
97+
src/openxr/cpp/OpenXRSwapChain.cpp
98+
src/openxr/cpp/OpenXRLayers.cpp
99+
src/openxr/cpp/OpenXRInput.cpp
100+
src/openxr/cpp/OpenXRExtensions.cpp
101+
)
102+
add_custom_command(TARGET native-lib POST_BUILD
103+
COMMAND ${CMAKE_COMMAND} -E copy
104+
${CMAKE_SOURCE_DIR}/../third_party/ovr_openxr_mobile_sdk/OpenXR/Libs/Android/${ANDROID_ABI}/Release/libopenxr_oculus.so
105+
${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libopenxr_oculus.so
106+
)
107+
elseif(OCULUSVR)
108+
include_directories(
109+
${CMAKE_SOURCE_DIR}/../third_party/ovr_mobile/VrApi/Include
110+
${CMAKE_SOURCE_DIR}/../third_party/OVRPlatformSDK/Include
111+
${CMAKE_SOURCE_DIR}/../app/src/oculusvr/cpp
112+
)
86113
target_sources(
87114
native-lib
88115
PUBLIC
@@ -95,6 +122,9 @@ add_custom_command(TARGET native-lib POST_BUILD
95122
${CMAKE_SOURCE_DIR}/../third_party/ovr_mobile/VrApi/Libs/Android/${ANDROID_ABI}/Release/libvrapi.so
96123
${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libvrapi.so
97124
)
125+
endif()
126+
127+
if(OCULUSVR)
98128
add_custom_command(TARGET native-lib POST_BUILD
99129
COMMAND ${CMAKE_COMMAND} -E copy
100130
${CMAKE_SOURCE_DIR}/../third_party/OVRPlatformSDK/Android/libs/${ANDROID_ABI}/libovrplatformloader.so
@@ -117,8 +147,14 @@ find_library( # Sets the name of the path variable.
117147
android )
118148

119149
add_library(oculusvr-lib SHARED IMPORTED)
150+
if(OPENXR)
151+
set_target_properties(oculusvr-lib PROPERTIES IMPORTED_LOCATION
152+
${CMAKE_SOURCE_DIR}/../third_party/ovr_openxr_mobile_sdk/OpenXR/Libs/Android/${ANDROID_ABI}/Release/libopenxr_oculus.so )
153+
else()
120154
set_target_properties(oculusvr-lib PROPERTIES IMPORTED_LOCATION
121155
${CMAKE_SOURCE_DIR}/../third_party/ovr_mobile/VrApi/Libs/Android/${ANDROID_ABI}/Release/libvrapi.so )
156+
endif()
157+
122158

123159
add_library(ovrplatform-lib SHARED IMPORTED)
124160
set_target_properties(ovrplatform-lib PROPERTIES IMPORTED_LOCATION

app/build.gradle

+20-15
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,20 @@ def getUseDebugSigningOnRelease = { ->
4040
return false
4141
}
4242

43+
def getOpenXRFlags = { ->
44+
if (gradle.hasProperty("userProperties.openxr")) {
45+
return gradle."userProperties.openxr" == "true" ? " -DOPENXR" : ""
46+
}
47+
return ""
48+
}
49+
50+
def getOpenXRCMakeFlags = { ->
51+
if (gradle.hasProperty("userProperties.openxr")) {
52+
return gradle."userProperties.openxr" == "true" ? "-DOPENXR=ON" : ""
53+
}
54+
return ""
55+
}
56+
4357
// Glean: Generate markdown docs for the collected metrics.
4458
ext.gleanGenerateMarkdownDocs = true
4559
ext.gleanDocsDirectory = "$rootDir/docs"
@@ -120,11 +134,8 @@ android {
120134
dimension "platform"
121135
externalNativeBuild {
122136
cmake {
123-
cppFlags " -I" + file("${project.rootDir}/third_party/ovr_mobile/VrApi/Include").absolutePath +
124-
" -I" + file("${project.rootDir}/third_party/OVRPlatformSDK/Include").absolutePath +
125-
" -I" + file("${project.rootDir}/app/src/oculusvr/cpp").absolutePath +
126-
" -DOCULUSVR -DSTORE_BUILD=0"
127-
arguments "-DVR_SDK_LIB=oculusvr-lib", "-DVR_SDK_EXTRA_LIB=ovrplatform-lib", "-DOCULUSVR=ON"
137+
cppFlags "-DOCULUSVR -DSTORE_BUILD=0" + getOpenXRFlags()
138+
arguments "-DVR_SDK_LIB=oculusvr-lib", "-DVR_SDK_EXTRA_LIB=ovrplatform-lib", "-DOCULUSVR=ON", getOpenXRCMakeFlags()
128139
}
129140
}
130141
manifestPlaceholders = [ headtrackingRequired:"false", permissionToRemove:"android.permission.RECEIVE_BOOT_COMPLETED" ]
@@ -134,11 +145,8 @@ android {
134145
dimension "platform"
135146
externalNativeBuild {
136147
cmake {
137-
cppFlags " -I" + file("${project.rootDir}/third_party/ovr_mobile/VrApi/Include").absolutePath +
138-
" -I" + file("${project.rootDir}/third_party/OVRPlatformSDK/Include").absolutePath +
139-
" -I" + file("${project.rootDir}/app/src/oculusvr/cpp").absolutePath +
140-
" -DOCULUSVR -DSTORE_BUILD=1"
141-
arguments "-DVR_SDK_LIB=oculusvr-lib", "-DVR_SDK_EXTRA_LIB=ovrplatform-lib", "-DOCULUSVR=ON"
148+
cppFlags "-DOCULUSVR -DSTORE_BUILD=1" + getOpenXRFlags()
149+
arguments "-DVR_SDK_LIB=oculusvr-lib", "-DVR_SDK_EXTRA_LIB=ovrplatform-lib", "-DOCULUSVR=ON", getOpenXRCMakeFlags()
142150
}
143151
}
144152
manifestPlaceholders = [ headtrackingRequired:"false", permissionToRemove:"android.permission.RECEIVE_BOOT_COMPLETED" ]
@@ -148,11 +156,8 @@ android {
148156
dimension "platform"
149157
externalNativeBuild {
150158
cmake {
151-
cppFlags " -I" + file("${project.rootDir}/third_party/ovr_mobile/VrApi/Include").absolutePath +
152-
" -I" + file("${project.rootDir}/third_party/OVRPlatformSDK/Include").absolutePath +
153-
" -I" + file("${project.rootDir}/app/src/oculusvr/cpp").absolutePath +
154-
" -DOCULUSVR -DSTORE_BUILD=1"
155-
arguments "-DVR_SDK_LIB=oculusvr-lib", "-DVR_SDK_EXTRA_LIB=ovrplatform-lib", "-DOCULUSVR=ON"
159+
cppFlags "-DOCULUSVR -DSTORE_BUILD=1" + getOpenXRFlags()
160+
arguments "-DVR_SDK_LIB=oculusvr-lib", "-DVR_SDK_EXTRA_LIB=ovrplatform-lib", "-DOCULUSVR=ON", getOpenXRCMakeFlags()
156161
}
157162
}
158163
manifestPlaceholders = [ headtrackingRequired:"false", permissionToRemove:"android.permission.CAMERA" ]

app/src/main/cpp/SplashAnimation.cpp

+1-3
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,8 @@ struct SplashAnimation::State {
6262
return;
6363
}
6464

65-
read->Bind(GL_READ_FRAMEBUFFER);
6665
layer->Bind(GL_DRAW_FRAMEBUFFER);
67-
VRB_GL_CHECK(glClearColor(0.0, 0.0f, 0.0f, 0.0f));
68-
VRB_GL_CHECK(glClear(GL_COLOR_BUFFER_BIT));
66+
read->Bind(GL_READ_FRAMEBUFFER);
6967
VRB_GL_CHECK(glBlitFramebuffer(0, 0, aTexture->GetWidth(), aTexture->GetHeight(),
7068
0, 0, aTexture->GetWidth(), aTexture->GetHeight(),
7169
GL_COLOR_BUFFER_BIT, GL_LINEAR));

app/src/main/cpp/native-lib.cpp

+15-5
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414
#include <android_native_app_glue.h>
1515
#include <cstdlib>
1616
#include <vrb/RunnableQueue.h>
17-
#if defined(OCULUSVR)
17+
#if defined(OPENXR)
18+
#include "DeviceDelegateOpenXR.h"
19+
#elif defined(OCULUSVR)
1820
#include "DeviceDelegateOculusVR.h"
1921
#endif
2022

@@ -28,7 +30,10 @@
2830

2931
using namespace crow;
3032

31-
#if defined(OCULUSVR)
33+
#if defined(OPENXR)
34+
typedef DeviceDelegateOpenXR PlatformDeviceDelegate;
35+
typedef DeviceDelegateOpenXRPtr PlatformDeviceDelegatePtr;
36+
#elif defined(OCULUSVR)
3237
typedef DeviceDelegateOculusVR PlatformDeviceDelegate;
3338
typedef DeviceDelegateOculusVRPtr PlatformDeviceDelegatePtr;
3439
#endif
@@ -232,8 +237,6 @@ android_main(android_app *aAppState) {
232237
pSource->process(aAppState, pSource);
233238
}
234239

235-
236-
237240
// Check if we are exiting.
238241
if (aAppState->destroyRequested != 0) {
239242
sAppContext->mEgl->MakeCurrent();
@@ -253,10 +256,17 @@ android_main(android_app *aAppState) {
253256
sAppContext->mEgl->MakeCurrent();
254257
}
255258
sAppContext->mQueue->ProcessRunnables();
259+
256260
if (!BrowserWorld::Instance().IsPaused() && sAppContext->mDevice->IsInVRMode()) {
257-
VRB_GL_CHECK(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT));
258261
BrowserWorld::Instance().Draw();
259262
}
263+
#if defined(OPENXR)
264+
else {
265+
// OpenXR requires to wait for the XR_SESSION_STATE_READY to start presenting
266+
// We need to call ProcessEvents to make sure we receive the event.
267+
sAppContext->mDevice->ProcessEvents();
268+
}
269+
#endif
260270
}
261271
}
262272

0 commit comments

Comments
 (0)