The open source OpenXR runtime

c/render: Add timewarp to mesh shader

Currently disabled.

+43 -3
+4 -1
src/xrt/compositor/render/render_interface.h
··· 828 828 struct render_gfx_mesh_ubo_data 829 829 { 830 830 struct xrt_matrix_2x2 vertex_rot; 831 + struct xrt_normalized_rect post_transform; 831 832 832 - struct xrt_normalized_rect post_transform; 833 + // Only used for timewarp. 834 + struct xrt_normalized_rect pre_transform; 835 + struct xrt_matrix_4x4 transform; 833 836 }; 834 837 835 838 /*!
+39 -2
src/xrt/compositor/shaders/mesh.vert
··· 1 - // Copyright 2019-2021, Collabora, Ltd. 1 + // Copyright 2019-2023, Collabora, Ltd. 2 2 // SPDX-License-Identifier: BSL-1.0 3 3 // Author: Lubosz Sarnecki <lubosz.sarnecki@collabora.com> 4 4 // Author: Pete Black <pete.black@collabora.com> ··· 6 6 7 7 #version 450 8 8 9 + // Should we do timewarp. 10 + layout(constant_id = 0) const bool do_timewarp = false; 9 11 10 12 layout (binding = 1, std140) uniform Config 11 13 { 12 14 vec4 vertex_rot; 13 15 vec4 post_transform; 16 + 17 + // Only used for timewarp. 18 + vec4 pre_transform; 19 + mat4 transform; 14 20 } ubo; 15 21 16 22 layout (location = 0) in vec4 in_pos_ruv; ··· 25 31 }; 26 32 27 33 28 - vec2 transform_uv(vec2 uv) 34 + vec2 transform_uv_subimage(vec2 uv) 29 35 { 30 36 vec2 values = uv; 31 37 ··· 34 40 35 41 // Ready to be used. 36 42 return values.xy; 43 + } 44 + 45 + vec2 transform_uv_timewarp(vec2 uv) 46 + { 47 + vec4 values = vec4(uv, -1, 1); 48 + 49 + // From uv to tan angle (tangent space). 50 + values.xy = fma(values.xy, ubo.pre_transform.zw, ubo.pre_transform.xy); 51 + values.y = -values.y; // Flip to OpenXR coordinate system. 52 + 53 + // Timewarp. 54 + values = ubo.transform * values; 55 + values.xy = values.xy * (1.0 / max(values.w, 0.00001)); 56 + 57 + // From [-1, 1] to [0, 1] 58 + values.xy = values.xy * 0.5 + 0.5; 59 + 60 + // To deal with OpenGL flip and sub image view. 61 + values.xy = fma(values.xy, ubo.post_transform.zw, ubo.post_transform.xy); 62 + 63 + // Done. 64 + return values.xy; 65 + } 66 + 67 + vec2 transform_uv(vec2 uv) 68 + { 69 + if (do_timewarp) { 70 + return transform_uv_timewarp(uv); 71 + } else { 72 + return transform_uv_subimage(uv); 73 + } 37 74 } 38 75 39 76 void main()