diff --git a/src/xrt/state_trackers/oxr/oxr_objects.h b/src/xrt/state_trackers/oxr/oxr_objects.h index efcf08d95..223a122f7 100644 --- a/src/xrt/state_trackers/oxr/oxr_objects.h +++ b/src/xrt/state_trackers/oxr/oxr_objects.h @@ -1848,6 +1848,13 @@ struct oxr_session XrSessionState state; + /*! + * This is set in xrBeginSession and is the primaryViewConfiguration + * argument, this is then used in xrEndFrame to know which view + * configuration the application is submitting it's frame in. + */ + XrViewConfigurationType current_view_config_type; + /*! * There is a extra state between xrBeginSession has been called and * the first xrEndFrame has been called. These are to track this. diff --git a/src/xrt/state_trackers/oxr/oxr_session.c b/src/xrt/state_trackers/oxr/oxr_session.c index 856f5656c..d6d957434 100644 --- a/src/xrt/state_trackers/oxr/oxr_session.c +++ b/src/xrt/state_trackers/oxr/oxr_session.c @@ -347,6 +347,9 @@ oxr_session_begin(struct oxr_logger *log, struct oxr_session *sess, const XrSess "Frame sync object refused to let us begin session, probably already running"); } + // Set the current view configuration type, used in xrEndFrame. + sess->current_view_config_type = beginInfo->primaryViewConfigurationType; + return oxr_session_success_result(sess); } @@ -413,6 +416,9 @@ oxr_session_end(struct oxr_logger *log, struct oxr_session *sess) } sess->has_ended_once = false; + // Unset the current view configuration type here. + sess->current_view_config_type = XR_VIEW_CONFIGURATION_TYPE_MAX_ENUM; + return oxr_session_success_result(sess); } @@ -1072,6 +1078,9 @@ oxr_session_allocate_and_init(struct oxr_logger *log, u_hashmap_int_create(&sess->act_sets_attachments_by_key); u_hashmap_int_create(&sess->act_attachments_by_key); + // This is set to something valid in begin session, used in xrEndFrame. + sess->current_view_config_type = XR_VIEW_CONFIGURATION_TYPE_MAX_ENUM; + // Done with basic init, set out variable. *out_session = sess; diff --git a/src/xrt/state_trackers/oxr/oxr_session_frame_end.c b/src/xrt/state_trackers/oxr/oxr_session_frame_end.c index 3fe9cfe2d..e16aca1a7 100644 --- a/src/xrt/state_trackers/oxr/oxr_session_frame_end.c +++ b/src/xrt/state_trackers/oxr/oxr_session_frame_end.c @@ -595,7 +595,7 @@ verify_projection_layer(struct oxr_session *sess, return ret; } - switch (sess->sys->view_config_type) { + switch (sess->current_view_config_type) { case XR_VIEW_CONFIGURATION_TYPE_PRIMARY_MONO: if (proj->viewCount != 1) { return oxr_error(log, XR_ERROR_VALIDATION_FAILURE, @@ -631,7 +631,7 @@ verify_projection_layer(struct oxr_session *sess, default: assert(false && "view type validation unimplemented"); return oxr_error(log, XR_ERROR_RUNTIME_FAILURE, "view type %d not supported", - sess->sys->view_config_type); + sess->current_view_config_type); break; }