summaryrefslogtreecommitdiffstats
path: root/modules/openxr/extensions/openxr_composition_layer_extension.h
diff options
context:
space:
mode:
Diffstat (limited to 'modules/openxr/extensions/openxr_composition_layer_extension.h')
-rw-r--r--modules/openxr/extensions/openxr_composition_layer_extension.h61
1 files changed, 54 insertions, 7 deletions
diff --git a/modules/openxr/extensions/openxr_composition_layer_extension.h b/modules/openxr/extensions/openxr_composition_layer_extension.h
index 34e330a60a..bce34f098c 100644
--- a/modules/openxr/extensions/openxr_composition_layer_extension.h
+++ b/modules/openxr/extensions/openxr_composition_layer_extension.h
@@ -36,6 +36,15 @@
#include "../openxr_api.h"
+#ifdef ANDROID_ENABLED
+#include <jni.h>
+
+// Copied here from openxr_platform.h, in order to avoid including that whole header,
+// which can cause compilation issues on some platforms.
+typedef XrResult(XRAPI_PTR *PFN_xrCreateSwapchainAndroidSurfaceKHR)(XrSession session, const XrSwapchainCreateInfo *info, XrSwapchain *swapchain, jobject *surface);
+#endif
+
+class JavaObject;
class OpenXRViewportCompositionLayerProvider;
// This extension provides access to composition layers for displaying 2D content through the XR compositor.
@@ -49,6 +58,7 @@ public:
virtual ~OpenXRCompositionLayerExtension() override;
virtual HashMap<String, bool *> get_requested_extensions() override;
+ virtual void on_instance_created(const XrInstance p_instance) override;
virtual void on_session_created(const XrSession p_session) override;
virtual void on_session_destroyed() override;
virtual void on_pre_render() override;
@@ -61,6 +71,12 @@ public:
void unregister_viewport_composition_layer_provider(OpenXRViewportCompositionLayerProvider *p_composition_layer);
bool is_available(XrStructureType p_which);
+ bool is_android_surface_swapchain_available() { return android_surface_ext_available; }
+
+#ifdef ANDROID_ENABLED
+ bool create_android_surface_swapchain(XrSwapchainCreateInfo *p_info, XrSwapchain *r_swapchain, jobject *r_surface);
+ void free_android_surface_swapchain(XrSwapchain p_swapchain);
+#endif
private:
static OpenXRCompositionLayerExtension *singleton;
@@ -69,6 +85,15 @@ private:
bool cylinder_ext_available = false;
bool equirect_ext_available = false;
+ bool android_surface_ext_available = false;
+
+#ifdef ANDROID_ENABLED
+ Vector<XrSwapchain> android_surface_swapchain_free_queue;
+ void free_queued_android_surface_swapchains();
+
+ EXT_PROTO_XRRESULT_FUNC1(xrDestroySwapchain, (XrSwapchain), swapchain)
+ EXT_PROTO_XRRESULT_FUNC4(xrCreateSwapchainAndroidSurfaceKHR, (XrSession), session, (const XrSwapchainCreateInfo *), info, (XrSwapchain *), swapchain, (jobject *), surface)
+#endif
};
class OpenXRViewportCompositionLayerProvider {
@@ -78,20 +103,37 @@ class OpenXRViewportCompositionLayerProvider {
Dictionary extension_property_values;
bool extension_property_values_changed = true;
- RID viewport;
- Size2i viewport_size;
-
- OpenXRAPI::OpenXRSwapChainInfo swapchain_info;
+ struct {
+ RID viewport;
+ Size2i viewport_size;
+ OpenXRAPI::OpenXRSwapChainInfo swapchain_info;
+ bool static_image = false;
+ } subviewport;
+
+#ifdef ANDROID_ENABLED
+ struct {
+ XrSwapchain swapchain = XR_NULL_HANDLE;
+ Ref<JavaObject> surface;
+ } android_surface;
+#endif
+
+ bool use_android_surface = false;
Size2i swapchain_size;
- bool static_image = false;
OpenXRAPI *openxr_api = nullptr;
OpenXRCompositionLayerExtension *composition_layer_extension = nullptr;
+ // Only for SubViewports.
bool update_and_acquire_swapchain(bool p_static_image);
- void free_swapchain();
RID get_current_swapchain_texture();
+ void update_swapchain_sub_image(XrSwapchainSubImage &r_swapchain_sub_image);
+ void free_swapchain();
+
+#ifdef ANDROID_ENABLED
+ void create_android_surface();
+#endif
+
public:
XrStructureType get_openxr_type() { return composition_layer->type; }
@@ -102,7 +144,12 @@ public:
bool get_alpha_blend() const { return alpha_blend; }
void set_viewport(RID p_viewport, Size2i p_size);
- RID get_viewport() const { return viewport; }
+ RID get_viewport() const { return subviewport.viewport; }
+
+ void set_use_android_surface(bool p_enable, Size2i p_size);
+ bool get_use_android_surface() const { return use_android_surface; }
+
+ Ref<JavaObject> get_android_surface();
void set_extension_property_values(const Dictionary &p_property_values);