The open source OpenXR runtime
0
fork

Configure Feed

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

c/main: clear the views when pose is invalid

Part-of: <https://gitlab.freedesktop.org/monado/monado/-/merge_requests/2552>

authored by

Bones and committed by
Marge Bot
c7a5451d ba579e4a

+48 -28
+48 -28
src/xrt/compositor/main/comp_renderer.c
··· 238 238 } 239 239 } 240 240 241 - static void 241 + static bool 242 242 calc_pose_data(struct comp_renderer *r, 243 243 enum comp_target_fov_source fov_source, 244 244 struct xrt_fov out_fovs[XRT_MAX_VIEWS], ··· 266 266 &head_relation, // out_head_relation 267 267 xdev_fovs, // out_fovs 268 268 xdev_poses); // out_poses 269 + 269 270 if (xret != XRT_SUCCESS) { 270 271 struct u_pp_sink_stack_only sink; 271 272 u_pp_delegate_t dg = u_pp_sink_stack_only_init(&sink); 272 273 u_pp_xrt_result(dg, xret); 273 274 U_LOG_E("xrt_device_get_view_poses failed: %s", sink.buffer); 274 - return; 275 + return false; 276 + } 277 + 278 + // Check if pose is valid (has valid position and orientation) 279 + bool pose_valid = (head_relation.relation_flags & XRT_SPACE_RELATION_POSITION_VALID_BIT) && 280 + (head_relation.relation_flags & XRT_SPACE_RELATION_ORIENTATION_VALID_BIT); 281 + 282 + if (!pose_valid) { 283 + return false; 275 284 } 276 285 277 286 struct xrt_fov dist_fov[XRT_MAX_VIEWS] = XRT_STRUCT_INIT; ··· 305 314 r->c->base.frame_params.fovs[i] = fov; 306 315 r->c->base.frame_params.poses[i] = result.pose; 307 316 } 317 + 318 + return true; 308 319 } 309 320 310 321 //! @pre comp_target_has_images(r->c->target) ··· 868 879 struct xrt_fov fovs[XRT_MAX_VIEWS]; 869 880 struct xrt_pose world_poses[XRT_MAX_VIEWS]; 870 881 struct xrt_pose eye_poses[XRT_MAX_VIEWS]; 871 - calc_pose_data( // 872 - r, // 873 - fov_source, // 874 - fovs, // 875 - world_poses, // 876 - eye_poses, // 877 - render->r->view_count); // 882 + bool pose_valid = calc_pose_data( // 883 + r, // 884 + fov_source, // 885 + fovs, // 886 + world_poses, // 887 + eye_poses, // 888 + render->r->view_count); // 889 + 890 + // Skip layer rendering when pose is invalid 891 + if (!pose_valid) { 892 + layer_count = 0; 893 + } 878 894 879 895 // Does everything. 880 896 chl_frame_state_gfx_default_pipeline( // ··· 926 942 struct xrt_fov fovs[XRT_MAX_VIEWS]; 927 943 struct xrt_pose world_poses[XRT_MAX_VIEWS]; 928 944 struct xrt_pose eye_poses[XRT_MAX_VIEWS]; 929 - calc_pose_data( // 930 - r, // 931 - fov_source, // 932 - fovs, // 933 - world_poses, // 934 - eye_poses, // 935 - render->r->view_count); // 945 + bool pose_valid = calc_pose_data( // 946 + r, // 947 + fov_source, // 948 + fovs, // 949 + world_poses, // 950 + eye_poses, // 951 + render->r->view_count); // 936 952 937 953 // Target Vulkan resources.. 938 954 VkImage target_image = r->c->target->images[r->acquired_buffer].handle; ··· 942 958 struct render_viewport_data target_viewport_datas[XRT_MAX_VIEWS]; 943 959 calc_viewport_data(r, target_viewport_datas, render->r->view_count); 944 960 945 - // Does everything. 946 - chl_frame_state_cs_default_pipeline( // 947 - frame_state, // 948 - render, // 949 - layers, // 950 - layer_count, // 951 - world_poses, // 952 - eye_poses, // 953 - fovs, // 954 - target_image, // 955 - target_storage_view, // 956 - target_viewport_datas); // 961 + // Show clear shader when pose is invalid, otherwise normal rendering 962 + if (!pose_valid) { 963 + render_compute_clear(render, target_image, target_storage_view, target_viewport_datas); 964 + } else { 965 + chl_frame_state_cs_default_pipeline( // 966 + frame_state, // 967 + render, // 968 + layers, // 969 + layer_count, // 970 + world_poses, // 971 + eye_poses, // 972 + fovs, // 973 + target_image, // 974 + target_storage_view, // 975 + target_viewport_datas); // 976 + } 957 977 958 978 // Everything is ready, submit to the queue. 959 979 ret = renderer_submit_queue(r, render->r->cmd, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT);