The open source OpenXR runtime
0
fork

Configure Feed

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

c/main: Enable timewarp for gfx fast path

+40 -7
+40 -7
src/xrt/compositor/main/comp_renderer.c
··· 804 804 const struct xrt_matrix_2x2 vertex_rots[2], 805 805 VkSampler src_samplers[2], 806 806 VkImageView src_image_views[2], 807 - const struct xrt_normalized_rect src_norm_rects[2]) 807 + const struct xrt_normalized_rect src_norm_rects[2], 808 + const struct xrt_pose src_poses[2], 809 + const struct xrt_fov src_fovs[2], 810 + const struct xrt_pose new_poses[2], 811 + bool do_timewarp) 808 812 { 809 813 struct vk_bundle *vk = &r->c->base.vk; 810 814 VkResult ret; ··· 823 827 .post_transform = src_norm_rects[i], 824 828 }; 825 829 830 + // Extra arguments for timewarp. 831 + if (do_timewarp) { 832 + data.pre_transform = rr->r->distortion.uv_to_tanangle[i]; 833 + 834 + render_calc_time_warp_matrix( // 835 + &src_poses[i], // 836 + &src_fovs[i], // 837 + &new_poses[i], // 838 + &data.transform); // 839 + } 840 + 826 841 ret = render_gfx_mesh_alloc_and_write( // 827 842 rr, // 828 843 &data, // ··· 851 866 rr, // rr 852 867 i, // mesh_index 853 868 descriptor_sets[i], // descriptor_set 854 - false); // do_timewarp 869 + do_timewarp); // do_timewarp 855 870 856 871 render_gfx_end_view(rr); 857 872 } ··· 876 891 const struct xrt_matrix_2x2 vertex_rots[2], 877 892 const struct comp_layer *layer, 878 893 const struct xrt_layer_projection_view_data *lvd, 879 - const struct xrt_layer_projection_view_data *rvd) 894 + const struct xrt_layer_projection_view_data *rvd, 895 + const struct xrt_pose new_poses[2], 896 + bool do_timewarp) 880 897 { 881 898 const struct xrt_layer_data *data = &layer->data; 882 899 const uint32_t left_array_index = lvd->sub.array_index; ··· 903 920 get_image_view(right, data->flags, right_array_index), 904 921 }; 905 922 923 + const struct xrt_pose src_poses[2] = {lvd->pose, rvd->pose}; 924 + const struct xrt_fov src_fovs[2] = {lvd->fov, rvd->fov}; 925 + 906 926 do_gfx_mesh( // 907 927 r, // 908 928 rr, // ··· 911 931 vertex_rots, // 912 932 src_samplers, // 913 933 src_image_views, // 914 - src_norm_rects); // 934 + src_norm_rects, // 935 + src_poses, // 936 + src_fovs, // 937 + new_poses, // 938 + do_timewarp); // 915 939 } 916 940 917 941 /*! ··· 927 951 928 952 struct render_gfx_target_resources *rtr = &r->rtr_array[r->acquired_buffer]; 929 953 bool fast_path = c->base.slot.one_projection_layer_fast_path; 954 + bool do_timewarp = !c->debug.atw_off; 930 955 931 956 // Only used if fast_path is true. 932 957 const struct comp_layer *layer = &c->base.slot.layers[0]; ··· 971 996 vertex_rots, // 972 997 layer, // 973 998 lvd, // 974 - rvd); // 999 + rvd, // 1000 + world_poses, // 1001 + do_timewarp); // 975 1002 976 1003 } else if (fast_path && layer->data.type == XRT_LAYER_STEREO_PROJECTION_DEPTH) { 977 1004 // Fast path. ··· 992 1019 vertex_rots, // 993 1020 layer, // 994 1021 lvd, // 995 - rvd); // 1022 + rvd, // 1023 + world_poses, // 1024 + do_timewarp); // 996 1025 997 1026 } else if (fast_path) { 998 1027 ··· 1036 1065 vertex_rots, // 1037 1066 src_samplers, // 1038 1067 src_image_views, // 1039 - src_norm_rects); // 1068 + src_norm_rects, // 1069 + world_poses, // 1070 + fovs, // 1071 + world_poses, // 1072 + false); // 1040 1073 } 1041 1074 1042 1075 // Make the command buffer submittable.