You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-06 12:20:30 +00:00
Merge pull request #68023 from rsjtdrjgfuzkfg/pico
Partial support for Pico 4
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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) {}
|
||||||
|
|||||||
@@ -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?
|
||||||
|
|||||||
Reference in New Issue
Block a user