summaryrefslogtreecommitdiffstats
path: root/modules/openxr/openxr_api.cpp
diff options
context:
space:
mode:
authorDavid Snopek <dsnopek@gmail.com>2023-05-09 23:29:13 +1000
committerDavid Snopek <dsnopek@gmail.com>2024-03-13 17:53:15 -0500
commit308a6a4734f38f79ac505e41e6f61c51df111748 (patch)
treed8952063e94700e517f81328e28e73048f6cc428 /modules/openxr/openxr_api.cpp
parentda945ce6266ce27ba63b6b08dc0eb2414594f7cb (diff)
downloadredot-engine-308a6a4734f38f79ac505e41e6f61c51df111748.tar.gz
OpenXR: Allow GDExtensions to provide multiple, ordered composition layers
Co-authored-by: Bastiaan Olij <mux213@gmail.com>
Diffstat (limited to 'modules/openxr/openxr_api.cpp')
-rw-r--r--modules/openxr/openxr_api.cpp32
1 files changed, 26 insertions, 6 deletions
diff --git a/modules/openxr/openxr_api.cpp b/modules/openxr/openxr_api.cpp
index e978c012b5..8dd017c213 100644
--- a/modules/openxr/openxr_api.cpp
+++ b/modules/openxr/openxr_api.cpp
@@ -2080,18 +2080,29 @@ void OpenXRAPI::end_frame() {
projection_views[eye].pose = views[eye].pose;
}
- Vector<const XrCompositionLayerBaseHeader *> layers_list;
+ Vector<OrderedCompositionLayer> ordered_layers_list;
+ bool projection_layer_is_first = true;
// Add composition layers from providers
for (OpenXRCompositionLayerProvider *provider : composition_layer_providers) {
- XrCompositionLayerBaseHeader *layer = provider->get_composition_layer();
- if (layer) {
- layers_list.push_back(layer);
+ for (int i = 0; i < provider->get_composition_layer_count(); i++) {
+ OrderedCompositionLayer layer = {
+ provider->get_composition_layer(i),
+ provider->get_composition_layer_order(i),
+ };
+ if (layer.composition_layer) {
+ ordered_layers_list.push_back(layer);
+ if (layer.sort_order == 0) {
+ WARN_PRINT_ONCE_ED("Composition layer returned sort order 0, it may be overwritten by projection layer.");
+ } else if (layer.sort_order < 0) {
+ projection_layer_is_first = false;
+ }
+ }
}
}
XrCompositionLayerFlags layer_flags = XR_COMPOSITION_LAYER_CORRECT_CHROMATIC_ABERRATION_BIT;
- if (layers_list.size() > 0 || environment_blend_mode != XR_ENVIRONMENT_BLEND_MODE_OPAQUE) {
+ if (!projection_layer_is_first || environment_blend_mode != XR_ENVIRONMENT_BLEND_MODE_OPAQUE) {
layer_flags |= XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT;
}
@@ -2103,7 +2114,16 @@ void OpenXRAPI::end_frame() {
view_count, // viewCount
projection_views, // views
};
- layers_list.push_back((const XrCompositionLayerBaseHeader *)&projection_layer);
+ ordered_layers_list.push_back({ (const XrCompositionLayerBaseHeader *)&projection_layer, 0 });
+
+ // Sort our layers.
+ ordered_layers_list.sort_custom<OrderedCompositionLayer>();
+
+ // Now make a list we can pass on to OpenXR.
+ Vector<const XrCompositionLayerBaseHeader *> layers_list;
+ for (OrderedCompositionLayer &ordered_layer : ordered_layers_list) {
+ layers_list.push_back(ordered_layer.composition_layer);
+ }
XrFrameEndInfo frame_end_info = {
XR_TYPE_FRAME_END_INFO, // type