The open source OpenXR runtime
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

c/main: Refactor view poses getting in renderer

+61 -86
+61 -86
src/xrt/compositor/main/comp_renderer.c
··· 215 215 *out_r_viewport_data = r_viewport_data; 216 216 } 217 217 218 + static void 219 + calc_pose_data(struct comp_renderer *r, 220 + struct xrt_fov out_fovs[2], 221 + struct xrt_pose out_world[2], 222 + struct xrt_pose out_eye[2]) 223 + { 224 + COMP_TRACE_MARKER(); 225 + 226 + struct xrt_vec3 default_eye_relation = { 227 + 0.063000f, /*! @todo get actual ipd_meters */ 228 + 0.0f, 229 + 0.0f, 230 + }; 231 + 232 + struct xrt_space_relation head_relation = XRT_SPACE_RELATION_ZERO; 233 + struct xrt_fov fovs[2] = XRT_STRUCT_INIT; 234 + struct xrt_pose poses[2] = XRT_STRUCT_INIT; 235 + 236 + xrt_device_get_view_poses( // 237 + r->c->xdev, // xdev 238 + &default_eye_relation, // default_eye_relation 239 + r->c->frame.rendering.predicted_display_time_ns, // at_timestamp_ns 240 + 2, // view_count 241 + &head_relation, // out_head_relation 242 + fovs, // out_fovs 243 + poses); // out_poses 244 + 245 + for (uint32_t i = 0; i < 2; i++) { 246 + const struct xrt_fov fov = fovs[i]; 247 + const struct xrt_pose eye_pose = poses[i]; 248 + 249 + struct xrt_space_relation result = {0}; 250 + struct xrt_relation_chain xrc = {0}; 251 + m_relation_chain_push_pose_if_not_identity(&xrc, &eye_pose); 252 + m_relation_chain_push_relation(&xrc, &head_relation); 253 + m_relation_chain_resolve(&xrc, &result); 254 + 255 + // Results to callers. 256 + out_fovs[i] = fov; 257 + out_world[i] = result.pose; 258 + out_eye[i] = eye_pose; 259 + 260 + // For remote rendering targets. 261 + r->c->base.slot.fovs[i] = fov; 262 + r->c->base.slot.poses[i] = result.pose; 263 + } 264 + } 265 + 218 266 //! @pre comp_target_has_images(r->c->target) 219 267 static void 220 268 renderer_build_rendering_target_resources(struct comp_renderer *r, ··· 717 765 } 718 766 719 767 static void 720 - renderer_get_view_projection(struct comp_renderer *r) 721 - { 722 - COMP_TRACE_MARKER(); 723 - 724 - struct xrt_vec3 default_eye_relation = { 725 - 0.063000f, /*! @todo get actual ipd_meters */ 726 - 0.0f, 727 - 0.0f, 728 - }; 729 - 730 - struct xrt_space_relation head_relation = XRT_SPACE_RELATION_ZERO; 731 - struct xrt_pose poses[2] = {0}; 732 - 733 - xrt_device_get_view_poses( // 734 - r->c->xdev, // 735 - &default_eye_relation, // 736 - r->c->frame.rendering.predicted_display_time_ns, // 737 - 2, // 738 - &head_relation, // 739 - r->c->base.slot.fovs, // 740 - poses); // 741 - 742 - struct xrt_pose base_space_pose = XRT_POSE_IDENTITY; 743 - 744 - for (uint32_t i = 0; i < 2; i++) { 745 - const struct xrt_fov fov = r->c->base.slot.fovs[i]; 746 - const struct xrt_pose eye_pose = poses[i]; 747 - 748 - comp_layer_renderer_set_fov(r->lr, &fov, i); 749 - 750 - struct xrt_space_relation result = {0}; 751 - struct xrt_relation_chain xrc = {0}; 752 - m_relation_chain_push_pose_if_not_identity(&xrc, &eye_pose); 753 - m_relation_chain_push_relation(&xrc, &head_relation); 754 - m_relation_chain_push_pose_if_not_identity(&xrc, &base_space_pose); 755 - m_relation_chain_resolve(&xrc, &result); 756 - 757 - r->c->base.slot.poses[i] = result.pose; 758 - comp_layer_renderer_set_pose(r->lr, &eye_pose, &result.pose, i); 759 - } 760 - } 761 - 762 - static void 763 768 renderer_acquire_swapchain_image(struct comp_renderer *r) 764 769 { 765 770 COMP_TRACE_MARKER(); ··· 934 939 // Sanity check. 935 940 assert(!fast_path || c->base.slot.layer_count >= 1); 936 941 942 + // Device view information. 943 + struct xrt_fov fovs[2]; 944 + struct xrt_pose world_poses[2]; 945 + struct xrt_pose eye_poses[2]; 946 + calc_pose_data(r, fovs, world_poses, eye_poses); 947 + 937 948 // Need to be begin for all paths. 938 949 render_gfx_begin(rr); 939 950 ··· 970 981 971 982 } else { 972 983 973 - renderer_get_view_projection(r); 984 + // Setup the information for the layer renderer. 985 + for (uint32_t i = 0; i < 2; i++) { 986 + comp_layer_renderer_set_fov(r->lr, &fovs[i], i); 987 + comp_layer_renderer_set_pose(r->lr, &eye_poses[i], &world_poses[i], i); 988 + } 974 989 975 990 comp_layer_renderer_draw( // 976 991 r->lr, // ··· 1013 1028 * 1014 1029 */ 1015 1030 1016 - static void 1017 - get_view_poses(struct comp_renderer *r, struct xrt_pose out_world[2], struct xrt_pose out_eye[2]) 1018 - { 1019 - COMP_TRACE_MARKER(); 1020 - 1021 - struct xrt_vec3 default_eye_relation = { 1022 - 0.063000f, /*! @todo get actual ipd_meters */ 1023 - 0.0f, 1024 - 0.0f, 1025 - }; 1026 - 1027 - struct xrt_space_relation head_relation = XRT_SPACE_RELATION_ZERO; 1028 - struct xrt_pose poses[2] = {0}; 1029 - 1030 - xrt_device_get_view_poses( // 1031 - r->c->xdev, // 1032 - &default_eye_relation, // 1033 - r->c->frame.rendering.predicted_display_time_ns, // 1034 - 2, // 1035 - &head_relation, // 1036 - r->c->base.slot.fovs, // 1037 - poses); // 1038 - 1039 - for (uint32_t i = 0; i < 2; i++) { 1040 - const struct xrt_fov fov = r->c->base.slot.fovs[i]; 1041 - const struct xrt_pose eye_pose = poses[i]; 1042 - 1043 - comp_layer_renderer_set_fov(r->lr, &fov, i); 1044 - 1045 - struct xrt_space_relation result = {0}; 1046 - struct xrt_relation_chain xrc = {0}; 1047 - m_relation_chain_push_pose_if_not_identity(&xrc, &eye_pose); 1048 - m_relation_chain_push_relation(&xrc, &head_relation); 1049 - m_relation_chain_resolve(&xrc, &result); 1050 - 1051 - out_eye[i] = eye_pose; 1052 - out_world[i] = result.pose; 1053 - r->c->base.slot.poses[i] = result.pose; 1054 - } 1055 - } 1056 - 1057 1031 /*! 1058 1032 * @pre render_compute_init(crc, &c->nr) 1059 1033 */ ··· 1072 1046 bool do_timewarp = !c->debug.atw_off; 1073 1047 1074 1048 // Device view information. 1049 + struct xrt_fov fovs[2]; // Unused 1075 1050 struct xrt_pose world_poses[2]; 1076 1051 struct xrt_pose eye_poses[2]; // New eye poses, unused. 1077 - get_view_poses(r, world_poses, eye_poses); 1052 + calc_pose_data(r, fovs, world_poses, eye_poses); 1078 1053 1079 1054 // Target Vulkan resources.. 1080 1055 VkImage target_image = r->c->target->images[r->acquired_buffer].handle;