diff --git a/src/xrt/auxiliary/util/u_device.c b/src/xrt/auxiliary/util/u_device.c index 748adcfe3..f1fa23aaf 100644 --- a/src/xrt/auxiliary/util/u_device.c +++ b/src/xrt/auxiliary/util/u_device.c @@ -461,6 +461,7 @@ xrt_result_t u_device_get_view_poses(struct xrt_device *xdev, const struct xrt_vec3 *default_eye_relation, int64_t at_timestamp_ns, + enum xrt_view_type view_type, uint32_t view_count, struct xrt_space_relation *out_head_relation, struct xrt_fov *out_fovs, @@ -538,6 +539,7 @@ xrt_result_t u_device_ni_get_view_poses(struct xrt_device *xdev, const struct xrt_vec3 *default_eye_relation, int64_t at_timestamp_ns, + enum xrt_view_type view_type, uint32_t view_count, struct xrt_space_relation *out_head_relation, struct xrt_fov *out_fovs, diff --git a/src/xrt/auxiliary/util/u_device.h b/src/xrt/auxiliary/util/u_device.h index f5cf50243..ccc19d06e 100644 --- a/src/xrt/auxiliary/util/u_device.h +++ b/src/xrt/auxiliary/util/u_device.h @@ -171,6 +171,7 @@ xrt_result_t u_device_get_view_poses(struct xrt_device *xdev, const struct xrt_vec3 *default_eye_relation, int64_t at_timestamp_ns, + enum xrt_view_type view_type, uint32_t view_count, struct xrt_space_relation *out_head_relation, struct xrt_fov *out_fovs, @@ -238,6 +239,7 @@ xrt_result_t u_device_ni_get_view_poses(struct xrt_device *xdev, const struct xrt_vec3 *default_eye_relation, int64_t at_timestamp_ns, + enum xrt_view_type view_type, uint32_t view_count, struct xrt_space_relation *out_head_relation, struct xrt_fov *out_fovs, diff --git a/src/xrt/compositor/main/comp_renderer.c b/src/xrt/compositor/main/comp_renderer.c index 6cbb17813..51a14e9fc 100644 --- a/src/xrt/compositor/main/comp_renderer.c +++ b/src/xrt/compositor/main/comp_renderer.c @@ -259,6 +259,9 @@ calc_pose_data(struct comp_renderer *r, struct xrt_fov xdev_fovs[XRT_MAX_VIEWS] = XRT_STRUCT_INIT; struct xrt_pose xdev_poses[2][XRT_MAX_VIEWS] = XRT_STRUCT_INIT; + // Determine view type based on view count + enum xrt_view_type view_type = (view_count == 1) ? XRT_VIEW_TYPE_MONO : XRT_VIEW_TYPE_STEREO; + int64_t scanout_time_ns = 0; if (r->c->xdev->hmd->screens[0].scanout_direction == XRT_SCANOUT_DIRECTION_TOP_TO_BOTTOM) { scanout_time_ns = r->c->xdev->hmd->screens[0].scanout_time_ns; @@ -274,10 +277,11 @@ calc_pose_data(struct comp_renderer *r, r->c->xdev, // &default_eye_relation, // begin_timestamp_ns, // at_timestamp_ns + view_type, // view_count, // &head_relation[0], // out_head_relation xdev_fovs, // out_fovs - xdev_poses[0]); + xdev_poses[0]); // if (xret != XRT_SUCCESS) { struct u_pp_sink_stack_only sink; u_pp_delegate_t dg = u_pp_sink_stack_only_init(&sink); @@ -292,6 +296,7 @@ calc_pose_data(struct comp_renderer *r, r->c->xdev, // &default_eye_relation, // end_timestamp_ns, // at_timestamp_ns + view_type, // view_count, // &head_relation[1], // out_head_relation xdev_fovs, // out_fovs diff --git a/src/xrt/compositor/null/null_compositor.c b/src/xrt/compositor/null/null_compositor.c index 943bd175c..c983833a5 100644 --- a/src/xrt/compositor/null/null_compositor.c +++ b/src/xrt/compositor/null/null_compositor.c @@ -436,8 +436,16 @@ null_compositor_layer_commit(struct xrt_compositor *xc, xrt_graphics_sync_handle struct xrt_fov fovs[2] = {0}; struct xrt_pose poses[2] = {0}; - xrt_result_t xret = - xrt_device_get_view_poses(c->xdev, &default_eye_relation, display_time_ns, 2, &head_relation, fovs, poses); + + xrt_result_t xret = xrt_device_get_view_poses( // + c->xdev, // + &default_eye_relation, // + display_time_ns, // + XRT_VIEW_TYPE_STEREO, // + 2, // + &head_relation, // + fovs, // + poses); // if (xret != XRT_SUCCESS) { return xret; } diff --git a/src/xrt/drivers/blubur_s1/blubur_s1_hmd.c b/src/xrt/drivers/blubur_s1/blubur_s1_hmd.c index 7eb45eae1..3d2694d6e 100644 --- a/src/xrt/drivers/blubur_s1/blubur_s1_hmd.c +++ b/src/xrt/drivers/blubur_s1/blubur_s1_hmd.c @@ -157,13 +157,21 @@ static xrt_result_t blubur_s1_hmd_get_view_poses(struct xrt_device *xdev, const struct xrt_vec3 *default_eye_relation, int64_t at_timestamp_ns, + enum xrt_view_type view_type, uint32_t view_count, struct xrt_space_relation *out_head_relation, struct xrt_fov *out_fovs, struct xrt_pose *out_poses) { - return u_device_get_view_poses(xdev, default_eye_relation, at_timestamp_ns, view_count, out_head_relation, - out_fovs, out_poses); + return u_device_get_view_poses( // + xdev, // + default_eye_relation, // + at_timestamp_ns, // + view_type, // + view_count, // + out_head_relation, // + out_fovs, // + out_poses); // } static void diff --git a/src/xrt/drivers/multi_wrapper/multi.c b/src/xrt/drivers/multi_wrapper/multi.c index 7d1042cb8..29e11b3ae 100644 --- a/src/xrt/drivers/multi_wrapper/multi.c +++ b/src/xrt/drivers/multi_wrapper/multi.c @@ -196,6 +196,7 @@ static xrt_result_t get_view_poses(struct xrt_device *xdev, const struct xrt_vec3 *default_eye_relation, int64_t at_timestamp_ns, + enum xrt_view_type view_type, uint32_t view_count, struct xrt_space_relation *out_head_relation, struct xrt_fov *out_fovs, @@ -203,8 +204,16 @@ get_view_poses(struct xrt_device *xdev, { struct multi_device *d = (struct multi_device *)xdev; struct xrt_device *target = d->tracking_override.target; - xrt_result_t xret = xrt_device_get_view_poses(target, default_eye_relation, at_timestamp_ns, view_count, - out_head_relation, out_fovs, out_poses); + + xrt_result_t xret = xrt_device_get_view_poses( // + target, // + default_eye_relation, // + at_timestamp_ns, // + view_type, // + view_count, // + out_head_relation, // + out_fovs, // + out_poses); // if (xret != XRT_SUCCESS) { return xret; } diff --git a/src/xrt/drivers/north_star/ns_hmd.c b/src/xrt/drivers/north_star/ns_hmd.c index 1078537e1..cb232281e 100644 --- a/src/xrt/drivers/north_star/ns_hmd.c +++ b/src/xrt/drivers/north_star/ns_hmd.c @@ -389,6 +389,7 @@ static xrt_result_t ns_hmd_get_view_poses(struct xrt_device *xdev, const struct xrt_vec3 *default_eye_relation, int64_t at_timestamp_ns, + enum xrt_view_type view_type, uint32_t view_count, struct xrt_space_relation *out_head_relation, struct xrt_fov *out_fovs, @@ -402,6 +403,7 @@ ns_hmd_get_view_poses(struct xrt_device *xdev, xdev, // default_eye_relation, // at_timestamp_ns, // + view_type, // view_count, // out_head_relation, // out_fovs, // diff --git a/src/xrt/drivers/remote/r_hmd.c b/src/xrt/drivers/remote/r_hmd.c index 88f1e7049..caebc012e 100644 --- a/src/xrt/drivers/remote/r_hmd.c +++ b/src/xrt/drivers/remote/r_hmd.c @@ -78,6 +78,7 @@ static xrt_result_t r_hmd_get_view_poses(struct xrt_device *xdev, const struct xrt_vec3 *default_eye_relation, int64_t at_timestamp_ns, + enum xrt_view_type view_type, uint32_t view_count, struct xrt_space_relation *out_head_relation, struct xrt_fov *out_fovs, @@ -90,6 +91,7 @@ r_hmd_get_view_poses(struct xrt_device *xdev, xdev, // default_eye_relation, // at_timestamp_ns, // + view_type, // view_count, // out_head_relation, // out_fovs, // diff --git a/src/xrt/drivers/rift/rift_hmd.c b/src/xrt/drivers/rift/rift_hmd.c index a0c7d4629..f396a634f 100644 --- a/src/xrt/drivers/rift/rift_hmd.c +++ b/src/xrt/drivers/rift/rift_hmd.c @@ -230,6 +230,7 @@ static xrt_result_t rift_hmd_get_view_poses(struct xrt_device *xdev, const struct xrt_vec3 *default_eye_relation, int64_t at_timestamp_ns, + enum xrt_view_type view_type, uint32_t view_count, struct xrt_space_relation *out_head_relation, struct xrt_fov *out_fovs, @@ -237,13 +238,15 @@ rift_hmd_get_view_poses(struct xrt_device *xdev, { struct rift_hmd *hmd = rift_hmd(xdev); - return u_device_get_view_poses(xdev, // - &(struct xrt_vec3){hmd->extra_display_info.icd, 0.0f, 0.0f}, // - at_timestamp_ns, // - view_count, // - out_head_relation, // - out_fovs, // - out_poses); + return u_device_get_view_poses( // + xdev, // + &(struct xrt_vec3){hmd->extra_display_info.icd, 0.0f, 0.0f}, // + at_timestamp_ns, // + view_type, // + view_count, // + out_head_relation, // + out_fovs, // + out_poses); } static xrt_result_t diff --git a/src/xrt/drivers/sample/sample_hmd.c b/src/xrt/drivers/sample/sample_hmd.c index ee2d26592..3d4834199 100644 --- a/src/xrt/drivers/sample/sample_hmd.c +++ b/src/xrt/drivers/sample/sample_hmd.c @@ -132,6 +132,7 @@ static xrt_result_t sample_hmd_get_view_poses(struct xrt_device *xdev, const struct xrt_vec3 *default_eye_relation, int64_t at_timestamp_ns, + enum xrt_view_type view_type, uint32_t view_count, struct xrt_space_relation *out_head_relation, struct xrt_fov *out_fovs, @@ -145,6 +146,7 @@ sample_hmd_get_view_poses(struct xrt_device *xdev, xdev, // default_eye_relation, // at_timestamp_ns, // + view_type, // view_count, // out_head_relation, // out_fovs, // diff --git a/src/xrt/drivers/simula/svr_hmd.c b/src/xrt/drivers/simula/svr_hmd.c index 8db47e8bf..7c3b56ad9 100644 --- a/src/xrt/drivers/simula/svr_hmd.c +++ b/src/xrt/drivers/simula/svr_hmd.c @@ -103,6 +103,7 @@ static xrt_result_t svr_hmd_get_view_poses(struct xrt_device *xdev, const struct xrt_vec3 *default_eye_relation, int64_t at_timestamp_ns, + enum xrt_view_type view_type, uint32_t view_count, struct xrt_space_relation *out_head_relation, struct xrt_fov *out_fovs, @@ -115,6 +116,7 @@ svr_hmd_get_view_poses(struct xrt_device *xdev, xdev, // default_eye_relation, // at_timestamp_ns, // + view_type, // view_count, // out_head_relation, // out_fovs, // diff --git a/src/xrt/drivers/steamvr_lh/device.cpp b/src/xrt/drivers/steamvr_lh/device.cpp index cf2c496ae..5e76c9a27 100644 --- a/src/xrt/drivers/steamvr_lh/device.cpp +++ b/src/xrt/drivers/steamvr_lh/device.cpp @@ -605,6 +605,7 @@ HmdDevice::SetDisplayEyeToHead(uint32_t unWhichDevice, xrt_result_t HmdDevice::get_view_poses(const xrt_vec3 *default_eye_relation, uint64_t at_timestamp_ns, + xrt_view_type view_type, uint32_t view_count, xrt_space_relation *out_head_relation, xrt_fov *out_fovs, @@ -617,6 +618,7 @@ HmdDevice::get_view_poses(const xrt_vec3 *default_eye_relation, this, // &eye_relation, // at_timestamp_ns, // + view_type, // view_count, // out_head_relation, // out_fovs, // diff --git a/src/xrt/drivers/steamvr_lh/device.hpp b/src/xrt/drivers/steamvr_lh/device.hpp index ad15e226e..b05d54a13 100644 --- a/src/xrt/drivers/steamvr_lh/device.hpp +++ b/src/xrt/drivers/steamvr_lh/device.hpp @@ -176,6 +176,7 @@ public: xrt_result_t get_view_poses(const xrt_vec3 *default_eye_relation, uint64_t at_timestamp_ns, + xrt_view_type view_type, uint32_t view_count, xrt_space_relation *out_head_relation, xrt_fov *out_fovs, diff --git a/src/xrt/drivers/survive/survive_driver.c b/src/xrt/drivers/survive/survive_driver.c index fdd1c5f8e..ddbd8ff7a 100644 --- a/src/xrt/drivers/survive/survive_driver.c +++ b/src/xrt/drivers/survive/survive_driver.c @@ -530,6 +530,7 @@ static xrt_result_t survive_device_get_view_poses(struct xrt_device *xdev, const struct xrt_vec3 *default_eye_relation, int64_t at_timestamp_ns, + enum xrt_view_type view_type, uint32_t view_count, struct xrt_space_relation *out_head_relation, struct xrt_fov *out_fovs, @@ -554,6 +555,7 @@ survive_device_get_view_poses(struct xrt_device *xdev, xdev, // &eye_relation, // at_timestamp_ns, // + view_type, // view_count, // out_head_relation, // out_fovs, // diff --git a/src/xrt/drivers/vive/vive_device.c b/src/xrt/drivers/vive/vive_device.c index 18cc02f7d..134d763b7 100644 --- a/src/xrt/drivers/vive/vive_device.c +++ b/src/xrt/drivers/vive/vive_device.c @@ -212,6 +212,7 @@ static xrt_result_t vive_device_get_view_poses(struct xrt_device *xdev, const struct xrt_vec3 *default_eye_relation, int64_t at_timestamp_ns, + enum xrt_view_type view_type, uint32_t view_count, struct xrt_space_relation *out_head_relation, struct xrt_fov *out_fovs, @@ -226,6 +227,7 @@ vive_device_get_view_poses(struct xrt_device *xdev, xdev, // default_eye_relation, // at_timestamp_ns, // + view_type, // view_count, // out_head_relation, // out_fovs, // diff --git a/src/xrt/include/xrt/xrt_compositor.h b/src/xrt/include/xrt/xrt_compositor.h index 63785a647..723b40613 100644 --- a/src/xrt/include/xrt/xrt_compositor.h +++ b/src/xrt/include/xrt/xrt_compositor.h @@ -858,15 +858,6 @@ xrt_compositor_semaphore_wait(struct xrt_compositor_semaphore *xcsem, uint64_t v * */ -/*! - * View type to be rendered to by the compositor. - */ -enum xrt_view_type -{ - XRT_VIEW_TYPE_MONO = 1, - XRT_VIEW_TYPE_STEREO = 2, -}; - enum xrt_compositor_frame_point { XRT_COMPOSITOR_FRAME_POINT_WOKE, //!< The client woke up after waiting. diff --git a/src/xrt/include/xrt/xrt_defines.h b/src/xrt/include/xrt/xrt_defines.h index 6f8f43b33..8690239e4 100644 --- a/src/xrt/include/xrt/xrt_defines.h +++ b/src/xrt/include/xrt/xrt_defines.h @@ -2118,6 +2118,15 @@ enum xrt_form_factor XRT_FORM_FACTOR_HANDHELD, //!< Handheld display. }; +/*! + * View type to be rendered to by the compositor. + */ +enum xrt_view_type +{ + XRT_VIEW_TYPE_MONO = 1, + XRT_VIEW_TYPE_STEREO = 2, +}; + /*! * Domain type. * Use for performance level setting diff --git a/src/xrt/include/xrt/xrt_device.h b/src/xrt/include/xrt/xrt_device.h index d4e6bfcc1..13a6a9761 100644 --- a/src/xrt/include/xrt/xrt_device.h +++ b/src/xrt/include/xrt/xrt_device.h @@ -550,6 +550,7 @@ struct xrt_device * input. * @param[in] at_timestamp_ns This is when the caller wants the poses and FOVs to be from. * @param[in] view_count Number of views. + * @param[in] view_type Type of view configuration (mono or stereo). * @param[out] out_head_relation * The head pose in the device tracking space. * Combine with @p out_poses to get the views in @@ -567,6 +568,7 @@ struct xrt_device xrt_result_t (*get_view_poses)(struct xrt_device *xdev, const struct xrt_vec3 *default_eye_relation, int64_t at_timestamp_ns, + enum xrt_view_type view_type, uint32_t view_count, struct xrt_space_relation *out_head_relation, struct xrt_fov *out_fovs, @@ -918,13 +920,21 @@ static inline xrt_result_t xrt_device_get_view_poses(struct xrt_device *xdev, const struct xrt_vec3 *default_eye_relation, int64_t at_timestamp_ns, + enum xrt_view_type view_type, uint32_t view_count, struct xrt_space_relation *out_head_relation, struct xrt_fov *out_fovs, struct xrt_pose *out_poses) { - return xdev->get_view_poses(xdev, default_eye_relation, at_timestamp_ns, view_count, out_head_relation, - out_fovs, out_poses); + return xdev->get_view_poses( // + xdev, // + default_eye_relation, // + at_timestamp_ns, // + view_type, // + view_count, // + out_head_relation, // + out_fovs, // + out_poses); // } /*! diff --git a/src/xrt/ipc/client/ipc_client_hmd.c b/src/xrt/ipc/client/ipc_client_hmd.c index 32464c4c0..8784d1c9b 100644 --- a/src/xrt/ipc/client/ipc_client_hmd.c +++ b/src/xrt/ipc/client/ipc_client_hmd.c @@ -66,6 +66,7 @@ static xrt_result_t call_get_view_poses_raw(ipc_client_hmd_t *ich, const struct xrt_vec3 *default_eye_relation, int64_t at_timestamp_ns, + enum xrt_view_type view_type, uint32_t view_count, struct xrt_space_relation *out_head_relation, struct xrt_fov *out_fovs, @@ -82,6 +83,7 @@ call_get_view_poses_raw(ipc_client_hmd_t *ich, ich->device_id, // default_eye_relation, // at_timestamp_ns, // + view_type, // view_count); // IPC_CHK_WITH_GOTO(ich->ipc_c, xret, "ipc_send_device_get_view_poses_locked", out); @@ -131,6 +133,7 @@ static xrt_result_t ipc_client_hmd_get_view_poses(struct xrt_device *xdev, const struct xrt_vec3 *default_eye_relation, int64_t at_timestamp_ns, + enum xrt_view_type view_type, uint32_t view_count, struct xrt_space_relation *out_head_relation, struct xrt_fov *out_fovs, @@ -148,6 +151,7 @@ ipc_client_hmd_get_view_poses(struct xrt_device *xdev, ich->device_id, // default_eye_relation, // at_timestamp_ns, // + view_type, // view_count, // &info); // IPC_CHK_AND_RET(ich->ipc_c, xret, "ipc_call_device_get_view_poses_2"); @@ -164,6 +168,7 @@ ipc_client_hmd_get_view_poses(struct xrt_device *xdev, ich, // default_eye_relation, // at_timestamp_ns, // + view_type, // view_count, // out_head_relation, // out_fovs, // diff --git a/src/xrt/ipc/server/ipc_server_handler.c b/src/xrt/ipc/server/ipc_server_handler.c index a24cca5d2..f268e5e1c 100644 --- a/src/xrt/ipc/server/ipc_server_handler.c +++ b/src/xrt/ipc/server/ipc_server_handler.c @@ -2045,6 +2045,7 @@ ipc_handle_device_get_view_poses(volatile struct ipc_client_state *ics, uint32_t id, const struct xrt_vec3 *fallback_eye_relation, int64_t at_timestamp_ns, + enum xrt_view_type view_type, uint32_t view_count) { struct ipc_message_channel *imc = (struct ipc_message_channel *)&ics->imc; @@ -2074,6 +2075,7 @@ ipc_handle_device_get_view_poses(volatile struct ipc_client_state *ics, xdev, // fallback_eye_relation, // at_timestamp_ns, // + view_type, // view_count, // &reply.head_relation, // fovs, // @@ -2119,6 +2121,7 @@ ipc_handle_device_get_view_poses_2(volatile struct ipc_client_state *ics, uint32_t id, const struct xrt_vec3 *default_eye_relation, int64_t at_timestamp_ns, + enum xrt_view_type view_type, uint32_t view_count, struct ipc_info_get_view_poses_2 *out_info) { @@ -2126,10 +2129,12 @@ ipc_handle_device_get_view_poses_2(volatile struct ipc_client_state *ics, uint32_t device_id = id; struct xrt_device *xdev = NULL; GET_XDEV_OR_RETURN(ics, device_id, xdev); + return xrt_device_get_view_poses( // xdev, // default_eye_relation, // at_timestamp_ns, // + view_type, // view_count, // &out_info->head_relation, // out_info->fovs, // diff --git a/src/xrt/ipc/shared/proto.json b/src/xrt/ipc/shared/proto.json index 5c1e047d8..bd6de5fb5 100644 --- a/src/xrt/ipc/shared/proto.json +++ b/src/xrt/ipc/shared/proto.json @@ -438,6 +438,7 @@ {"name": "id", "type": "uint32_t"}, {"name": "fallback_eye_relation", "type": "struct xrt_vec3"}, {"name": "at_timestamp_ns", "type": "int64_t"}, + {"name": "view_type", "type": "enum xrt_view_type"}, {"name": "view_count", "type": "uint32_t"} ], "out": [ @@ -451,6 +452,7 @@ {"name": "id", "type": "uint32_t"}, {"name": "fallback_eye_relation", "type": "struct xrt_vec3"}, {"name": "at_timestamp_ns", "type": "int64_t"}, + {"name": "view_type", "type": "enum xrt_view_type"}, {"name": "view_count", "type": "uint32_t"} ], "out": [ diff --git a/src/xrt/state_trackers/oxr/oxr_session.c b/src/xrt/state_trackers/oxr/oxr_session.c index 998b02fc1..427bed724 100644 --- a/src/xrt/state_trackers/oxr/oxr_session.c +++ b/src/xrt/state_trackers/oxr/oxr_session.c @@ -690,10 +690,13 @@ oxr_session_locate_views(struct oxr_logger *log, struct xrt_fov fovs[XRT_MAX_VIEWS] = {0}; struct xrt_pose poses[XRT_MAX_VIEWS] = {0}; + enum xrt_view_type view_type = view_count == 1 ? XRT_VIEW_TYPE_MONO : XRT_VIEW_TYPE_STEREO; + xrt_result_t xret = xrt_device_get_view_poses( // xdev, // &default_eye_relation, // xdisplay_time, // + view_type, // view_count, // &T_xdev_head, // fovs, // diff --git a/src/xrt/state_trackers/steamvr_drv/ovrd_driver.cpp b/src/xrt/state_trackers/steamvr_drv/ovrd_driver.cpp index f575dcaf7..119ec8b3a 100644 --- a/src/xrt/state_trackers/steamvr_drv/ovrd_driver.cpp +++ b/src/xrt/state_trackers/steamvr_drv/ovrd_driver.cpp @@ -1108,7 +1108,8 @@ public: //! @todo more than 2 views struct xrt_space_relation head_relation; - xrt_device_get_view_poses(xdev, &ipd_vec, now_ns, 2, &head_relation, m_fovs, m_view_pose); + xrt_device_get_view_poses(xdev, &ipd_vec, now_ns, XRT_VIEW_TYPE_STEREO, 2, &head_relation, m_fovs, + m_view_pose); //! @todo more versatile IPD calculation float actual_ipd = -m_view_pose[0].position.x + m_view_pose[1].position.x;