OpenXR: Allow extending Android surface swapchain creation from GDExtension
This commit is contained in:
parent
0a4aedb360
commit
f7e5e7a400
|
@ -178,6 +178,15 @@
|
||||||
[param layer] is a pointer to an [code]XrCompositionLayerBaseHeader[/code] struct.
|
[param layer] is a pointer to an [code]XrCompositionLayerBaseHeader[/code] struct.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
<method name="_set_android_surface_swapchain_create_info_and_get_next_pointer" qualifiers="virtual">
|
||||||
|
<return type="int" />
|
||||||
|
<param index="0" name="property_values" type="Dictionary" />
|
||||||
|
<param index="1" name="next_pointer" type="void*" />
|
||||||
|
<description>
|
||||||
|
Adds additional data structures to Android surface swapchains created by [OpenXRCompositionLayer].
|
||||||
|
[param property_values] contains the values of the properties returned by [method _get_viewport_composition_layer_extension_properties].
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
<method name="_set_hand_joint_locations_and_get_next_pointer" qualifiers="virtual">
|
<method name="_set_hand_joint_locations_and_get_next_pointer" qualifiers="virtual">
|
||||||
<return type="int" />
|
<return type="int" />
|
||||||
<param index="0" name="hand_index" type="int" />
|
<param index="0" name="hand_index" type="int" />
|
||||||
|
|
|
@ -144,7 +144,6 @@ bool OpenXRCompositionLayerExtension::create_android_surface_swapchain(XrSwapcha
|
||||||
OpenXRAPI *openxr_api = OpenXRAPI::get_singleton();
|
OpenXRAPI *openxr_api = OpenXRAPI::get_singleton();
|
||||||
ERR_FAIL_NULL_V(openxr_api, false);
|
ERR_FAIL_NULL_V(openxr_api, false);
|
||||||
|
|
||||||
// @todo We need a way to add to the next pointer chain.
|
|
||||||
XrResult result = xrCreateSwapchainAndroidSurfaceKHR(openxr_api->get_session(), p_info, r_swapchain, r_surface);
|
XrResult result = xrCreateSwapchainAndroidSurfaceKHR(openxr_api->get_session(), p_info, r_swapchain, r_surface);
|
||||||
if (XR_FAILED(result)) {
|
if (XR_FAILED(result)) {
|
||||||
print_line("OpenXR: Failed to create Android surface swapchain [", openxr_api->get_error_string(result), "]");
|
print_line("OpenXR: Failed to create Android surface swapchain [", openxr_api->get_error_string(result), "]");
|
||||||
|
@ -254,11 +253,19 @@ void OpenXRViewportCompositionLayerProvider::create_android_surface() {
|
||||||
ERR_FAIL_COND(android_surface.swapchain != XR_NULL_HANDLE || android_surface.surface.is_valid());
|
ERR_FAIL_COND(android_surface.swapchain != XR_NULL_HANDLE || android_surface.surface.is_valid());
|
||||||
ERR_FAIL_COND(!openxr_api || !openxr_api->is_running());
|
ERR_FAIL_COND(!openxr_api || !openxr_api->is_running());
|
||||||
|
|
||||||
|
void *next_pointer = nullptr;
|
||||||
|
for (OpenXRExtensionWrapper *wrapper : openxr_api->get_registered_extension_wrappers()) {
|
||||||
|
void *np = wrapper->set_android_surface_swapchain_create_info_and_get_next_pointer(extension_property_values, next_pointer);
|
||||||
|
if (np != nullptr) {
|
||||||
|
next_pointer = np;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// The XR_FB_android_surface_swapchain_create extension mandates that format, sampleCount,
|
// The XR_FB_android_surface_swapchain_create extension mandates that format, sampleCount,
|
||||||
// faceCount, arraySize, and mipCount must be zero.
|
// faceCount, arraySize, and mipCount must be zero.
|
||||||
XrSwapchainCreateInfo info = {
|
XrSwapchainCreateInfo info = {
|
||||||
XR_TYPE_SWAPCHAIN_CREATE_INFO, // type
|
XR_TYPE_SWAPCHAIN_CREATE_INFO, // type
|
||||||
nullptr, // next
|
next_pointer, // next
|
||||||
0, // createFlags
|
0, // createFlags
|
||||||
XR_SWAPCHAIN_USAGE_SAMPLED_BIT | XR_SWAPCHAIN_USAGE_COLOR_ATTACHMENT_BIT | XR_SWAPCHAIN_USAGE_MUTABLE_FORMAT_BIT, // usageFlags
|
XR_SWAPCHAIN_USAGE_SAMPLED_BIT | XR_SWAPCHAIN_USAGE_COLOR_ATTACHMENT_BIT | XR_SWAPCHAIN_USAGE_MUTABLE_FORMAT_BIT, // usageFlags
|
||||||
0, // format
|
0, // format
|
||||||
|
|
|
@ -97,10 +97,11 @@ public:
|
||||||
virtual void on_state_loss_pending() {} // `on_state_loss_pending` is called when the OpenXR session state is changed to loss pending.
|
virtual void on_state_loss_pending() {} // `on_state_loss_pending` is called when the OpenXR session state is changed to loss pending.
|
||||||
virtual void on_state_exiting() {} // `on_state_exiting` is called when the OpenXR session state is changed to exiting.
|
virtual void on_state_exiting() {} // `on_state_exiting` is called when the OpenXR session state is changed to exiting.
|
||||||
|
|
||||||
virtual void *set_viewport_composition_layer_and_get_next_pointer(const XrCompositionLayerBaseHeader *p_layer, Dictionary p_property_values, void *p_next_pointer) { return p_next_pointer; } // Add additional data structures to composition layers created via OpenXRCompositionLayer.
|
virtual void *set_viewport_composition_layer_and_get_next_pointer(const XrCompositionLayerBaseHeader *p_layer, const Dictionary &p_property_values, void *p_next_pointer) { return p_next_pointer; } // Add additional data structures to composition layers created via OpenXRCompositionLayer.
|
||||||
virtual void on_viewport_composition_layer_destroyed(const XrCompositionLayerBaseHeader *p_layer) {} // `on_viewport_composition_layer_destroyed` is called when a composition layer created via OpenXRCompositionLayer is destroyed.
|
virtual void on_viewport_composition_layer_destroyed(const XrCompositionLayerBaseHeader *p_layer) {} // `on_viewport_composition_layer_destroyed` is called when a composition layer created via OpenXRCompositionLayer is destroyed.
|
||||||
virtual void get_viewport_composition_layer_extension_properties(List<PropertyInfo> *p_property_list) {} // Get additional property definitions for OpenXRCompositionLayer.
|
virtual void get_viewport_composition_layer_extension_properties(List<PropertyInfo> *p_property_list) {} // Get additional property definitions for OpenXRCompositionLayer.
|
||||||
virtual Dictionary get_viewport_composition_layer_extension_property_defaults() { return Dictionary(); } // Get the default values for the additional property definitions for OpenXRCompositionLayer.
|
virtual Dictionary get_viewport_composition_layer_extension_property_defaults() { return Dictionary(); } // Get the default values for the additional property definitions for OpenXRCompositionLayer.
|
||||||
|
virtual void *set_android_surface_swapchain_create_info_and_get_next_pointer(const Dictionary &p_property_values, void *p_next_pointer) { return p_next_pointer; }
|
||||||
|
|
||||||
// `on_event_polled` is called when there is an OpenXR event to process.
|
// `on_event_polled` is called when there is an OpenXR event to process.
|
||||||
// Should return true if the event was handled, false otherwise.
|
// Should return true if the event was handled, false otherwise.
|
||||||
|
|
|
@ -65,6 +65,7 @@ void OpenXRExtensionWrapperExtension::_bind_methods() {
|
||||||
GDVIRTUAL_BIND(_get_viewport_composition_layer_extension_properties);
|
GDVIRTUAL_BIND(_get_viewport_composition_layer_extension_properties);
|
||||||
GDVIRTUAL_BIND(_get_viewport_composition_layer_extension_property_defaults);
|
GDVIRTUAL_BIND(_get_viewport_composition_layer_extension_property_defaults);
|
||||||
GDVIRTUAL_BIND(_on_viewport_composition_layer_destroyed, "layer");
|
GDVIRTUAL_BIND(_on_viewport_composition_layer_destroyed, "layer");
|
||||||
|
GDVIRTUAL_BIND(_set_android_surface_swapchain_create_info_and_get_next_pointer, "property_values", "next_pointer");
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("get_openxr_api"), &OpenXRExtensionWrapperExtension::get_openxr_api);
|
ClassDB::bind_method(D_METHOD("get_openxr_api"), &OpenXRExtensionWrapperExtension::get_openxr_api);
|
||||||
ClassDB::bind_method(D_METHOD("register_extension_wrapper"), &OpenXRExtensionWrapperExtension::register_extension_wrapper);
|
ClassDB::bind_method(D_METHOD("register_extension_wrapper"), &OpenXRExtensionWrapperExtension::register_extension_wrapper);
|
||||||
|
@ -249,7 +250,7 @@ bool OpenXRExtensionWrapperExtension::on_event_polled(const XrEventDataBuffer &p
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *OpenXRExtensionWrapperExtension::set_viewport_composition_layer_and_get_next_pointer(const XrCompositionLayerBaseHeader *p_layer, Dictionary p_property_values, void *p_next_pointer) {
|
void *OpenXRExtensionWrapperExtension::set_viewport_composition_layer_and_get_next_pointer(const XrCompositionLayerBaseHeader *p_layer, const Dictionary &p_property_values, void *p_next_pointer) {
|
||||||
uint64_t pointer = 0;
|
uint64_t pointer = 0;
|
||||||
|
|
||||||
if (GDVIRTUAL_CALL(_set_viewport_composition_layer_and_get_next_pointer, GDExtensionConstPtr<void>(p_layer), p_property_values, GDExtensionPtr<void>(p_next_pointer), pointer)) {
|
if (GDVIRTUAL_CALL(_set_viewport_composition_layer_and_get_next_pointer, GDExtensionConstPtr<void>(p_layer), p_property_values, GDExtensionPtr<void>(p_next_pointer), pointer)) {
|
||||||
|
@ -279,6 +280,16 @@ Dictionary OpenXRExtensionWrapperExtension::get_viewport_composition_layer_exten
|
||||||
return property_defaults;
|
return property_defaults;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *OpenXRExtensionWrapperExtension::set_android_surface_swapchain_create_info_and_get_next_pointer(const Dictionary &p_property_values, void *p_next_pointer) {
|
||||||
|
uint64_t pointer = 0;
|
||||||
|
|
||||||
|
if (GDVIRTUAL_CALL(_set_android_surface_swapchain_create_info_and_get_next_pointer, p_property_values, GDExtensionPtr<void>(p_next_pointer), pointer)) {
|
||||||
|
return reinterpret_cast<void *>(pointer);
|
||||||
|
}
|
||||||
|
|
||||||
|
return p_next_pointer;
|
||||||
|
}
|
||||||
|
|
||||||
Ref<OpenXRAPIExtension> OpenXRExtensionWrapperExtension::get_openxr_api() {
|
Ref<OpenXRAPIExtension> OpenXRExtensionWrapperExtension::get_openxr_api() {
|
||||||
return openxr_api;
|
return openxr_api;
|
||||||
}
|
}
|
||||||
|
|
|
@ -121,15 +121,17 @@ public:
|
||||||
|
|
||||||
GDVIRTUAL1R(bool, _on_event_polled, GDExtensionConstPtr<void>);
|
GDVIRTUAL1R(bool, _on_event_polled, GDExtensionConstPtr<void>);
|
||||||
|
|
||||||
virtual void *set_viewport_composition_layer_and_get_next_pointer(const XrCompositionLayerBaseHeader *p_layer, Dictionary p_property_values, void *p_next_pointer) override;
|
virtual void *set_viewport_composition_layer_and_get_next_pointer(const XrCompositionLayerBaseHeader *p_layer, const Dictionary &p_property_values, void *p_next_pointer) override;
|
||||||
virtual void on_viewport_composition_layer_destroyed(const XrCompositionLayerBaseHeader *p_layer) override;
|
virtual void on_viewport_composition_layer_destroyed(const XrCompositionLayerBaseHeader *p_layer) override;
|
||||||
virtual void get_viewport_composition_layer_extension_properties(List<PropertyInfo> *p_property_list) override;
|
virtual void get_viewport_composition_layer_extension_properties(List<PropertyInfo> *p_property_list) override;
|
||||||
virtual Dictionary get_viewport_composition_layer_extension_property_defaults() override;
|
virtual Dictionary get_viewport_composition_layer_extension_property_defaults() override;
|
||||||
|
virtual void *set_android_surface_swapchain_create_info_and_get_next_pointer(const Dictionary &p_property_values, void *p_next_pointer) override;
|
||||||
|
|
||||||
GDVIRTUAL3R(uint64_t, _set_viewport_composition_layer_and_get_next_pointer, GDExtensionConstPtr<void>, Dictionary, GDExtensionPtr<void>);
|
GDVIRTUAL3R(uint64_t, _set_viewport_composition_layer_and_get_next_pointer, GDExtensionConstPtr<void>, Dictionary, GDExtensionPtr<void>);
|
||||||
GDVIRTUAL1(_on_viewport_composition_layer_destroyed, GDExtensionConstPtr<void>);
|
GDVIRTUAL1(_on_viewport_composition_layer_destroyed, GDExtensionConstPtr<void>);
|
||||||
GDVIRTUAL0R(TypedArray<Dictionary>, _get_viewport_composition_layer_extension_properties);
|
GDVIRTUAL0R(TypedArray<Dictionary>, _get_viewport_composition_layer_extension_properties);
|
||||||
GDVIRTUAL0R(Dictionary, _get_viewport_composition_layer_extension_property_defaults);
|
GDVIRTUAL0R(Dictionary, _get_viewport_composition_layer_extension_property_defaults);
|
||||||
|
GDVIRTUAL2R(uint64_t, _set_android_surface_swapchain_create_info_and_get_next_pointer, Dictionary, GDExtensionPtr<void>);
|
||||||
|
|
||||||
Ref<OpenXRAPIExtension> get_openxr_api();
|
Ref<OpenXRAPIExtension> get_openxr_api();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue