st/oxr: Use new xrt_space_graph

This commit is contained in:
Jakob Bornecrantz 2020-07-23 12:12:29 +01:00
parent 74690a2278
commit d60cce8977
4 changed files with 99 additions and 126 deletions

View file

@ -625,14 +625,14 @@ void
oxr_session_poll(struct oxr_logger *log, struct oxr_session *sess); oxr_session_poll(struct oxr_logger *log, struct oxr_session *sess);
/*! /*!
* Get the view space position at the given time in relation to the * Get the view space relation at the given time in relation to the
* local or stage space. * local or stage space.
*/ */
XrResult XrResult
oxr_session_get_view_pose_at(struct oxr_logger *, oxr_session_get_view_relation_at(struct oxr_logger *,
struct oxr_session *sess, struct oxr_session *sess,
XrTime at_time, XrTime at_time,
struct xrt_pose *); struct xrt_space_relation *out_relation);
XrResult XrResult
oxr_session_views(struct oxr_logger *log, oxr_session_views(struct oxr_logger *log,
@ -882,31 +882,21 @@ oxr_xdev_find_output(struct xrt_device *xdev,
enum xrt_output_name name, enum xrt_output_name name,
struct xrt_output **out_output); struct xrt_output **out_output);
/*!
* Returns the pose of the named input from the device, if the pose isn't valid
* uses the device offset instead.
*/
void void
oxr_xdev_get_pose_at(struct oxr_logger *log, oxr_xdev_get_space_graph(struct oxr_logger *log,
struct oxr_instance *inst,
struct xrt_device *xdev,
enum xrt_input_name name,
XrTime at_time,
uint64_t *out_pose_timestamp_ns,
struct xrt_space_relation *out_relation);
/*!
* Returns the relation of the named input from the device, always ensures
* that position and orientation is valid by using the device offset.
*/
void
oxr_xdev_get_relation_at(struct oxr_logger *log,
struct oxr_instance *inst, struct oxr_instance *inst,
struct xrt_device *xdev, struct xrt_device *xdev,
enum xrt_input_name name, enum xrt_input_name name,
XrTime at_time, XrTime at_time,
uint64_t *out_relation_timestamp_ns, struct xrt_space_graph *xsg);
struct xrt_space_relation *out_relation);
void
oxr_xdev_get_space_relation(struct oxr_logger *log,
struct oxr_instance *inst,
struct xrt_device *xdev,
enum xrt_input_name name,
XrTime at_time,
struct xrt_space_relation *out_relation);
/* /*
@ -1287,8 +1277,6 @@ struct oxr_session
*/ */
float ipd_meters; float ipd_meters;
float static_prediction_s;
/*! /*!
* To pipe swapchain creation to right code. * To pipe swapchain creation to right code.
*/ */

View file

@ -27,7 +27,7 @@
#include "math/m_api.h" #include "math/m_api.h"
#include "math/m_mathinclude.h" #include "math/m_mathinclude.h"
#include "math/m_space.h"
#include "oxr_objects.h" #include "oxr_objects.h"
#include "oxr_logger.h" #include "oxr_logger.h"
@ -43,9 +43,7 @@
#include <inttypes.h> #include <inttypes.h>
DEBUG_GET_ONCE_BOOL_OPTION(dynamic_prediction, "OXR_DYNAMIC_PREDICTION", true)
DEBUG_GET_ONCE_NUM_OPTION(ipd, "OXR_DEBUG_IPD_MM", 63) DEBUG_GET_ONCE_NUM_OPTION(ipd, "OXR_DEBUG_IPD_MM", 63)
DEBUG_GET_ONCE_NUM_OPTION(prediction_ms, "OXR_DEBUG_PREDICTION_MS", 11)
#define CALL_CHK(call) \ #define CALL_CHK(call) \
if ((call) == XRT_ERROR_IPC_FAILURE) { \ if ((call) == XRT_ERROR_IPC_FAILURE) { \
@ -278,10 +276,10 @@ oxr_session_poll(struct oxr_logger *log, struct oxr_session *sess)
} }
XrResult XrResult
oxr_session_get_view_pose_at(struct oxr_logger *log, oxr_session_get_view_relation_at(struct oxr_logger *log,
struct oxr_session *sess, struct oxr_session *sess,
XrTime at_time, XrTime at_time,
struct xrt_pose *pose) struct xrt_space_relation *out_relation)
{ {
// @todo This function needs to be massively expanded to support all // @todo This function needs to be massively expanded to support all
// use cases this drive. The main use of this function is to get // use cases this drive. The main use of this function is to get
@ -294,17 +292,16 @@ oxr_session_get_view_pose_at(struct oxr_logger *log,
// get at least a slightly better position. // get at least a slightly better position.
struct xrt_device *xdev = GET_XDEV_BY_ROLE(sess->sys, head); struct xrt_device *xdev = GET_XDEV_BY_ROLE(sess->sys, head);
struct xrt_space_relation relation;
uint64_t timestamp;
// Applies the offset in the function. // Applies the offset in the function.
oxr_xdev_get_relation_at(log, sess->sys->inst, xdev, struct xrt_space_graph xsg = {0};
XRT_INPUT_GENERIC_HEAD_POSE, at_time, oxr_xdev_get_space_graph(log, sess->sys->inst, xdev,
&timestamp, &relation); XRT_INPUT_GENERIC_HEAD_POSE, at_time, &xsg);
m_space_graph_resolve(&xsg, out_relation);
#if 0
// clang-format off // clang-format off
*pose = relation.pose;
bool valid_vel = (relation.relation_flags & XRT_SPACE_RELATION_ANGULAR_VELOCITY_VALID_BIT) != 0; bool valid_vel = (relation.relation_flags & XRT_SPACE_RELATION_ANGULAR_VELOCITY_VALID_BIT) != 0;
// clang-format on // clang-format on
@ -340,6 +337,7 @@ oxr_session_get_view_pose_at(struct oxr_logger *log,
pose->orientation = predicted; pose->orientation = predicted;
} }
#endif
return oxr_session_success_result(sess); return oxr_session_success_result(sess);
} }
@ -420,8 +418,6 @@ oxr_session_views(struct oxr_logger *log,
baseSpc->type, viewLocateInfo->displayTime, baseSpc->type, viewLocateInfo->displayTime,
&pure_relation); &pure_relation);
struct xrt_pose pure = pure_relation.pose;
// @todo the fov information that we get from xdev->hmd->views[i].fov is // @todo the fov information that we get from xdev->hmd->views[i].fov is
// not properly filled out in oh_device.c, fix before wasting time // not properly filled out in oh_device.c, fix before wasting time
// on debugging weird rendering when adding stuff here. // on debugging weird rendering when adding stuff here.
@ -439,16 +435,26 @@ oxr_session_views(struct oxr_logger *log,
xdev->get_view_pose(xdev, &eye_relation, i, &view_pose); xdev->get_view_pose(xdev, &eye_relation, i, &view_pose);
// Do the magical space relation dance here. // Do the magical space relation dance here.
math_pose_openxr_locate(&view_pose, &pure, &baseSpc->pose, struct xrt_space_relation result = {0};
(struct xrt_pose *)&views[i].pose); struct xrt_space_graph xsg = {0};
m_space_graph_add_pose_if_not_identity(&xsg, &view_pose);
m_space_graph_add_relation(&xsg, &pure_relation);
m_space_graph_add_pose_if_not_identity(&xsg, &baseSpc->pose);
m_space_graph_resolve(&xsg, &result);
union {
struct xrt_pose xrt;
struct XrPosef oxr;
} safe_copy_pose = {0};
safe_copy_pose.xrt = result.pose;
views[i].pose = safe_copy_pose.oxr;
// Copy the fov information directly from the device. // Copy the fov information directly from the device.
union { union {
struct xrt_fov xrt; struct xrt_fov xrt;
XrFovf oxr; XrFovf oxr;
} safe_copy = {0}; } safe_copy_fov = {0};
safe_copy.xrt = xdev->hmd->views[i].fov; safe_copy_fov.xrt = xdev->hmd->views[i].fov;
views[i].fov = safe_copy.oxr; views[i].fov = safe_copy_fov.oxr;
struct xrt_pose *pose = (struct xrt_pose *)&views[i].pose; struct xrt_pose *pose = (struct xrt_pose *)&views[i].pose;
if (!math_quat_ensure_normalized(&pose->orientation)) { if (!math_quat_ensure_normalized(&pose->orientation)) {
@ -1328,13 +1334,12 @@ handle_space(struct oxr_logger *log,
return false; return false;
} }
uint64_t xdev_timestamp = 0;
struct xrt_space_relation out_relation; struct xrt_space_relation out_relation;
oxr_xdev_get_pose_at(log, sess->sys->inst, input->xdev, oxr_xdev_get_space_relation(log, sess->sys->inst, input->xdev,
input->input->name, timestamp, input->input->name, timestamp,
&xdev_timestamp, &out_relation); &out_relation);
struct xrt_pose device_pose = out_relation.pose; struct xrt_pose device_pose = out_relation.pose;
@ -1995,8 +2000,6 @@ oxr_session_create(struct oxr_logger *log,
} }
sess->ipd_meters = debug_get_num_option_ipd() / 1000.0f; sess->ipd_meters = debug_get_num_option_ipd() / 1000.0f;
sess->static_prediction_s =
debug_get_num_option_prediction_ms() / 1000.0f;
oxr_session_change_state(log, sess, XR_SESSION_STATE_IDLE); oxr_session_change_state(log, sess, XR_SESSION_STATE_IDLE);
oxr_session_change_state(log, sess, XR_SESSION_STATE_READY); oxr_session_change_state(log, sess, XR_SESSION_STATE_READY);

View file

@ -13,6 +13,7 @@
#include <string.h> #include <string.h>
#include "math/m_api.h" #include "math/m_api.h"
#include "math/m_space.h"
#include "util/u_debug.h" #include "util/u_debug.h"
#include "util/u_misc.h" #include "util/u_misc.h"
@ -184,14 +185,13 @@ oxr_space_ref_relation(struct oxr_logger *log,
XrTime time, XrTime time,
struct xrt_space_relation *out_relation) struct xrt_space_relation *out_relation)
{ {
math_relation_reset(out_relation); m_space_relation_ident(out_relation);
if (space == baseSpc) { if (space == baseSpc) {
// math_relation_reset() sets to identity. // m_space_relation_ident() sets to identity.
} else if (space == XR_REFERENCE_SPACE_TYPE_VIEW) { } else if (space == XR_REFERENCE_SPACE_TYPE_VIEW) {
oxr_session_get_view_pose_at(log, sess, time, oxr_session_get_view_relation_at(log, sess, time, out_relation);
&out_relation->pose);
if (!ensure_initial_head_relation(sess, out_relation)) { if (!ensure_initial_head_relation(sess, out_relation)) {
out_relation->relation_flags = out_relation->relation_flags =
@ -214,8 +214,7 @@ oxr_space_ref_relation(struct oxr_logger *log,
return XR_SUCCESS; return XR_SUCCESS;
} }
} else if (baseSpc == XR_REFERENCE_SPACE_TYPE_VIEW) { } else if (baseSpc == XR_REFERENCE_SPACE_TYPE_VIEW) {
oxr_session_get_view_pose_at(log, sess, time, oxr_session_get_view_relation_at(log, sess, time, out_relation);
&out_relation->pose);
if (!ensure_initial_head_relation(sess, out_relation)) { if (!ensure_initial_head_relation(sess, out_relation)) {
out_relation->relation_flags = out_relation->relation_flags =
@ -275,11 +274,27 @@ oxr_space_ref_relation(struct oxr_logger *log,
return XR_SUCCESS; return XR_SUCCESS;
} }
static void
remove_angular_and_linear_stuff(struct xrt_space_relation *out_relation)
{
const enum xrt_space_relation_flags flags =
XRT_SPACE_RELATION_LINEAR_VELOCITY_VALID_BIT |
XRT_SPACE_RELATION_LINEAR_ACCELERATION_VALID_BIT |
XRT_SPACE_RELATION_ANGULAR_VELOCITY_VALID_BIT |
XRT_SPACE_RELATION_ANGULAR_ACCELERATION_VALID_BIT;
out_relation->relation_flags &= ~flags;
out_relation->linear_velocity = (struct xrt_vec3){0, 0, 0};
out_relation->linear_acceleration = (struct xrt_vec3){0, 0, 0};
out_relation->angular_velocity = (struct xrt_vec3){0, 0, 0};
out_relation->angular_acceleration = (struct xrt_vec3){0, 0, 0};
}
/*! /*!
* This returns only the relation between two spaces without any of the app * This returns only the relation between two spaces without any of the app
* given relations applied, assumes that only one is a action space. * given relations applied, assumes that only one is a action space.
*/ */
XrResult static XrResult
oxr_space_action_relation(struct oxr_logger *log, oxr_space_action_relation(struct oxr_logger *log,
struct oxr_session *sess, struct oxr_session *sess,
struct oxr_space *spc, struct oxr_space *spc,
@ -289,11 +304,8 @@ oxr_space_action_relation(struct oxr_logger *log,
{ {
struct oxr_action_input *input = NULL; struct oxr_action_input *input = NULL;
struct oxr_space *act_spc, *ref_spc = NULL; struct oxr_space *act_spc, *ref_spc = NULL;
uint64_t timestamp = 0;
bool invert = false; bool invert = false;
// Find the action space // Find the action space
if (baseSpc->is_reference) { if (baseSpc->is_reference) {
// Note spc, is assumed to be the action space. // Note spc, is assumed to be the action space.
@ -316,7 +328,7 @@ oxr_space_action_relation(struct oxr_logger *log,
} }
// Reset so no relation is returned. // Reset so no relation is returned.
math_relation_reset(out_relation); m_space_relation_ident(out_relation);
//! @todo Can not relate to the view space right now. //! @todo Can not relate to the view space right now.
if (baseSpc->type == XR_REFERENCE_SPACE_TYPE_VIEW) { if (baseSpc->type == XR_REFERENCE_SPACE_TYPE_VIEW) {
@ -334,9 +346,8 @@ oxr_space_action_relation(struct oxr_logger *log,
return XR_SUCCESS; return XR_SUCCESS;
} }
oxr_xdev_get_pose_at(log, sess->sys->inst, input->xdev, oxr_xdev_get_space_relation(log, sess->sys->inst, input->xdev,
input->input->name, at_time, &timestamp, input->input->name, at_time, out_relation);
out_relation);
if (baseSpc->type == XR_REFERENCE_SPACE_TYPE_LOCAL) { if (baseSpc->type == XR_REFERENCE_SPACE_TYPE_LOCAL) {
global_to_local_space(sess, &out_relation->pose); global_to_local_space(sess, &out_relation->pose);
@ -344,6 +355,8 @@ oxr_space_action_relation(struct oxr_logger *log,
if (invert) { if (invert) {
math_pose_invert(&out_relation->pose, &out_relation->pose); math_pose_invert(&out_relation->pose, &out_relation->pose);
// Remove this since we can't (for now) invert the derivatives.
remove_angular_and_linear_stuff(out_relation);
} }
return XR_SUCCESS; return XR_SUCCESS;
@ -471,7 +484,11 @@ oxr_space_locate(struct oxr_logger *log,
// Combine space and base space poses with pure relation // Combine space and base space poses with pure relation
struct xrt_space_relation result; struct xrt_space_relation result;
math_relation_openxr_locate(&spc->pose, &pure, &baseSpc->pose, &result); struct xrt_space_graph graph = {0};
m_space_graph_add_pose_if_not_identity(&graph, &spc->pose);
m_space_graph_add_relation(&graph, &pure);
m_space_graph_add_inverted_pose_if_not_identity(&graph, &baseSpc->pose);
m_space_graph_resolve(&graph, &result);
// Copy // Copy
union { union {

View file

@ -1,4 +1,4 @@
// Copyright 2019, Collabora, Ltd. // Copyright 2019-2020, Collabora, Ltd.
// SPDX-License-Identifier: BSL-1.0 // SPDX-License-Identifier: BSL-1.0
/*! /*!
* @file * @file
@ -8,7 +8,10 @@
*/ */
#include "os/os_time.h" #include "os/os_time.h"
#include "math/m_api.h" #include "math/m_api.h"
#include "math/m_space.h"
#include "util/u_time.h" #include "util/u_time.h"
#include "util/u_misc.h" #include "util/u_misc.h"
@ -79,73 +82,35 @@ oxr_xdev_find_output(struct xrt_device *xdev,
return false; return false;
} }
static void
ensure_valid_position_and_orientation(struct xrt_space_relation *relation,
const struct xrt_pose *fallback)
{
// clang-format off
bool valid_pos = (relation->relation_flags & XRT_SPACE_RELATION_POSITION_VALID_BIT) != 0;
bool valid_ori = (relation->relation_flags & XRT_SPACE_RELATION_ORIENTATION_VALID_BIT) != 0;
// clang-format on
if (!valid_ori) {
relation->pose.orientation = fallback->orientation;
}
if (!valid_pos) {
relation->pose.position = fallback->position;
}
}
void void
oxr_xdev_get_relation_at(struct oxr_logger *log, oxr_xdev_get_space_graph(struct oxr_logger *log,
struct oxr_instance *inst, struct oxr_instance *inst,
struct xrt_device *xdev, struct xrt_device *xdev,
enum xrt_input_name name, enum xrt_input_name name,
XrTime at_time, XrTime at_time,
uint64_t *out_relation_timestamp_ns, struct xrt_space_graph *xsg)
struct xrt_space_relation *out_relation)
{ {
struct xrt_pose *offset = &xdev->tracking_origin->offset; // Convert at_time to monotonic and give to device.
uint64_t at_timestamp_ns =
time_state_ts_to_monotonic_ns(inst->timekeeping, at_time);
uint64_t dummy = 0;
//! @todo Convert at_time to monotonic and give to device. struct xrt_space_relation *rel = m_space_graph_reserve(xsg);
uint64_t at_timestamp_ns = os_monotonic_get_ns(); xrt_device_get_tracked_pose(xdev, name, at_timestamp_ns, &dummy, rel);
(void)at_time;
uint64_t relation_timestamp_ns = 0;
struct xrt_space_relation relation;
U_ZERO(&relation);
xrt_device_get_tracked_pose(xdev, name, at_timestamp_ns,
&relation_timestamp_ns, &relation);
// Add in the offset from the tracking system. // Add in the offset from the tracking system.
math_relation_apply_offset(offset, &relation); m_space_graph_add_pose(xsg, &xdev->tracking_origin->offset);
// Always make those to base things valid.
ensure_valid_position_and_orientation(&relation, offset);
*out_relation_timestamp_ns = time_state_monotonic_to_ts_ns(
inst->timekeeping, relation_timestamp_ns);
*out_relation = relation;
} }
void void
oxr_xdev_get_pose_at(struct oxr_logger *log, oxr_xdev_get_space_relation(struct oxr_logger *log,
struct oxr_instance *inst, struct oxr_instance *inst,
struct xrt_device *xdev, struct xrt_device *xdev,
enum xrt_input_name name, enum xrt_input_name name,
XrTime at_time, XrTime at_time,
uint64_t *out_pose_timestamp_ns, struct xrt_space_relation *out_relation)
struct xrt_space_relation *out_relation)
{ {
struct xrt_space_relation relation; struct xrt_space_graph xsg = {0};
U_ZERO(&relation); oxr_xdev_get_space_graph(log, inst, xdev, name, at_time, &xsg);
m_space_graph_resolve(&xsg, out_relation);
oxr_xdev_get_relation_at(log, inst, xdev, name, at_time,
out_pose_timestamp_ns, &relation);
*out_relation = relation;
} }