summaryrefslogtreecommitdiffstats
path: root/modules/openxr/extensions/openxr_android_extension.cpp
diff options
context:
space:
mode:
authorGergely Kis <gergely.kis@migeran.com>2022-09-24 13:56:00 +0200
committerGergely Kis <gergely.kis@migeran.com>2022-09-24 13:57:03 +0200
commitd5445c25a6f914235b0effbc4c455cecbb5fddd0 (patch)
tree6d5bd700acd0de6cbabb814be0947de5da55016a /modules/openxr/extensions/openxr_android_extension.cpp
parent240fb8666a98b50b18bbf1496c6ce1ff56be288b (diff)
downloadredot-engine-d5445c25a6f914235b0effbc4c455cecbb5fddd0.tar.gz
Dynamic loading of OpenXR Loader on Android
This change implements dynamic loading of the OpenXR Loader library on Android. If an OpenXR Loader library is not found, Godot will still function with OpenXR disabled. Also, on every platform, the OpenXR symbols are resolved at runtime using xrGetInstanceProcAddr. On Windows and Linux the OpenXR loader is included in the main engine binary. On Android, the OpenXR Loader is not built with the engine. Separately distributed Android plugins will be provided with the correct loader library for each device. Co-authored-by: Gábor Pál Korom <gabor.p.korom@migeran.com> Co-authored-by: Gábor Koncz <gabor.koncz@migeran.com>
Diffstat (limited to 'modules/openxr/extensions/openxr_android_extension.cpp')
-rw-r--r--modules/openxr/extensions/openxr_android_extension.cpp20
1 files changed, 11 insertions, 9 deletions
diff --git a/modules/openxr/extensions/openxr_android_extension.cpp b/modules/openxr/extensions/openxr_android_extension.cpp
index 3bd4db169c..8f6d5c28db 100644
--- a/modules/openxr/extensions/openxr_android_extension.cpp
+++ b/modules/openxr/extensions/openxr_android_extension.cpp
@@ -29,7 +29,12 @@
/*************************************************************************/
#include "openxr_android_extension.h"
+#include "java_godot_wrapper.h"
+#include "os_android.h"
+#include "thread_jandroid.h"
+#include <jni.h>
+#include <modules/openxr/openxr_api.h>
#include <openxr/openxr.h>
#include <openxr/openxr_platform.h>
@@ -42,19 +47,16 @@ OpenXRAndroidExtension *OpenXRAndroidExtension::get_singleton() {
OpenXRAndroidExtension::OpenXRAndroidExtension(OpenXRAPI *p_openxr_api) :
OpenXRExtensionWrapper(p_openxr_api) {
singleton = this;
-
request_extensions[XR_KHR_ANDROID_THREAD_SETTINGS_EXTENSION_NAME] = nullptr; // must be available
+}
- // Initialize the loader
- PFN_xrInitializeLoaderKHR xrInitializeLoaderKHR;
- result = xrGetInstanceProcAddr(XR_NULL_HANDLE, "xrInitializeLoaderKHR", (PFN_xrVoidFunction *)(&xrInitializeLoaderKHR));
- ERR_FAIL_COND_MSG(XR_FAILED(result), "Failed to retrieve pointer to xrInitializeLoaderKHR");
+void OpenXRAndroidExtension::on_before_instance_created() {
+ EXT_INIT_XR_FUNC(xrInitializeLoaderKHR);
- // TODO fix this code, this is still code from GDNative!
- JNIEnv *env = android_api->godot_android_get_env();
+ JNIEnv *env = get_jni_env();
JavaVM *vm;
env->GetJavaVM(&vm);
- jobject activity_object = env->NewGlobalRef(android_api->godot_android_get_activity());
+ jobject activity_object = env->NewGlobalRef(static_cast<OS_Android *>(OS::get_singleton())->get_godot_java()->get_activity());
XrLoaderInitInfoAndroidKHR loader_init_info_android = {
.type = XR_TYPE_LOADER_INIT_INFO_ANDROID_KHR,
@@ -62,7 +64,7 @@ OpenXRAndroidExtension::OpenXRAndroidExtension(OpenXRAPI *p_openxr_api) :
.applicationVM = vm,
.applicationContext = activity_object
};
- xrInitializeLoaderKHR((const XrLoaderInitInfoBaseHeaderKHR *)&loader_init_info_android);
+ XrResult result = xrInitializeLoaderKHR((const XrLoaderInitInfoBaseHeaderKHR *)&loader_init_info_android);
ERR_FAIL_COND_MSG(XR_FAILED(result), "Failed to call xrInitializeLoaderKHR");
}