Browse Source

Merge pull request #68023 from rsjtdrjgfuzkfg/pico

Partial support for Pico 4
Rémi Verschelde 2 years ago
parent
commit
c39c251255

+ 25 - 1
modules/openxr/extensions/openxr_android_extension.cpp

@@ -47,7 +47,8 @@ OpenXRAndroidExtension *OpenXRAndroidExtension::get_singleton() {
 OpenXRAndroidExtension::OpenXRAndroidExtension(OpenXRAPI *p_openxr_api) :
 OpenXRAndroidExtension::OpenXRAndroidExtension(OpenXRAPI *p_openxr_api) :
 		OpenXRExtensionWrapper(p_openxr_api) {
 		OpenXRExtensionWrapper(p_openxr_api) {
 	singleton = this;
 	singleton = this;
-	request_extensions[XR_KHR_ANDROID_THREAD_SETTINGS_EXTENSION_NAME] = nullptr; // must be available
+	request_extensions[XR_KHR_LOADER_INIT_ANDROID_EXTENSION_NAME] = nullptr; // must be available
+	request_extensions[XR_KHR_ANDROID_CREATE_INSTANCE_EXTENSION_NAME] = &create_instance_extension_available;
 }
 }
 
 
 void OpenXRAndroidExtension::on_before_instance_created() {
 void OpenXRAndroidExtension::on_before_instance_created() {
@@ -68,6 +69,29 @@ void OpenXRAndroidExtension::on_before_instance_created() {
 	ERR_FAIL_COND_MSG(XR_FAILED(result), "Failed to call xrInitializeLoaderKHR");
 	ERR_FAIL_COND_MSG(XR_FAILED(result), "Failed to call xrInitializeLoaderKHR");
 }
 }
 
 
+// We're keeping the Android create info struct here to avoid including openxr_platform.h in a header, which would break other extensions.
+// This is reasonably safe as the struct is only used during intialization and the extension is a singleton.
+static XrInstanceCreateInfoAndroidKHR instance_create_info;
+
+void *OpenXRAndroidExtension::set_instance_create_info_and_get_next_pointer(void *p_next_pointer) {
+	if (!create_instance_extension_available) {
+		return nullptr;
+	}
+
+	JNIEnv *env = get_jni_env();
+	JavaVM *vm;
+	env->GetJavaVM(&vm);
+	jobject activity_object = env->NewGlobalRef(static_cast<OS_Android *>(OS::get_singleton())->get_godot_java()->get_activity());
+
+	instance_create_info = {
+		.type = XR_TYPE_INSTANCE_CREATE_INFO_ANDROID_KHR,
+		.next = p_next_pointer,
+		.applicationVM = vm,
+		.applicationActivity = activity_object
+	};
+	return &instance_create_info;
+}
+
 OpenXRAndroidExtension::~OpenXRAndroidExtension() {
 OpenXRAndroidExtension::~OpenXRAndroidExtension() {
 	singleton = nullptr;
 	singleton = nullptr;
 }
 }

+ 3 - 0
modules/openxr/extensions/openxr_android_extension.h

@@ -41,12 +41,15 @@ public:
 	OpenXRAndroidExtension(OpenXRAPI *p_openxr_api);
 	OpenXRAndroidExtension(OpenXRAPI *p_openxr_api);
 
 
 	virtual void on_before_instance_created() override;
 	virtual void on_before_instance_created() override;
+	virtual void *set_instance_create_info_and_get_next_pointer(void *p_next_pointer) override;
 
 
 	virtual ~OpenXRAndroidExtension() override;
 	virtual ~OpenXRAndroidExtension() override;
 
 
 private:
 private:
 	static OpenXRAndroidExtension *singleton;
 	static OpenXRAndroidExtension *singleton;
 
 
+	bool create_instance_extension_available = false;
+
 	// Initialize the loader
 	// Initialize the loader
 	EXT_PROTO_XRRESULT_FUNC1(xrInitializeLoaderKHR, (const XrLoaderInitInfoBaseHeaderKHR *), loaderInitInfo)
 	EXT_PROTO_XRRESULT_FUNC1(xrInitializeLoaderKHR, (const XrLoaderInitInfoBaseHeaderKHR *), loaderInitInfo)
 };
 };

+ 1 - 0
modules/openxr/extensions/openxr_extension_wrapper.h

@@ -65,6 +65,7 @@ public:
 	virtual void *set_system_properties_and_get_next_pointer(void *p_next_pointer) { return p_next_pointer; }
 	virtual void *set_system_properties_and_get_next_pointer(void *p_next_pointer) { return p_next_pointer; }
 	virtual void *set_session_create_and_get_next_pointer(void *p_next_pointer) { return p_next_pointer; }
 	virtual void *set_session_create_and_get_next_pointer(void *p_next_pointer) { return p_next_pointer; }
 	virtual void *set_swapchain_create_info_and_get_next_pointer(void *p_next_pointer) { return p_next_pointer; }
 	virtual void *set_swapchain_create_info_and_get_next_pointer(void *p_next_pointer) { return p_next_pointer; }
+	virtual void *set_instance_create_info_and_get_next_pointer(void *p_next_pointer) { return p_next_pointer; }
 
 
 	virtual void on_before_instance_created() {}
 	virtual void on_before_instance_created() {}
 	virtual void on_instance_created(const XrInstance p_instance) {}
 	virtual void on_instance_created(const XrInstance p_instance) {}

+ 9 - 1
modules/openxr/openxr_api.cpp

@@ -299,9 +299,17 @@ bool OpenXRAPI::create_instance() {
 		XR_CURRENT_API_VERSION // apiVersion
 		XR_CURRENT_API_VERSION // apiVersion
 	};
 	};
 
 
+	void *next_pointer = nullptr;
+	for (OpenXRExtensionWrapper *wrapper : registered_extension_wrappers) {
+		void *np = wrapper->set_instance_create_info_and_get_next_pointer(next_pointer);
+		if (np != nullptr) {
+			next_pointer = np;
+		}
+	}
+
 	XrInstanceCreateInfo instance_create_info = {
 	XrInstanceCreateInfo instance_create_info = {
 		XR_TYPE_INSTANCE_CREATE_INFO, // type
 		XR_TYPE_INSTANCE_CREATE_INFO, // type
-		nullptr, // next
+		next_pointer, // next
 		0, // createFlags
 		0, // createFlags
 		application_info, // applicationInfo
 		application_info, // applicationInfo
 		0, // enabledApiLayerCount, need to find out if we need support for this?
 		0, // enabledApiLayerCount, need to find out if we need support for this?