The open source OpenXR runtime
at mr/scanout-values 97 lines 2.1 kB view raw
1// Copyright 2019-2023, Collabora, Ltd. 2// SPDX-License-Identifier: BSL-1.0 3// Author: Lubosz Sarnecki <lubosz.sarnecki@collabora.com> 4// Author: Pete Black <pete.black@collabora.com> 5// Author: Jakob Bornecrantz <jakob@collabora.com> 6 7#version 450 8 9// Should we do timewarp. 10layout(constant_id = 0) const bool do_timewarp = false; 11 12layout (binding = 1, std140) uniform Config 13{ 14 vec4 vertex_rot; 15 vec4 post_transform; 16 17 // Only used for timewarp. 18 vec4 pre_transform; 19 mat4 transform; 20} ubo; 21 22layout (location = 0) in vec4 in_pos_ruv; 23layout (location = 1) in vec4 in_guv_buv; 24layout (location = 0) out vec2 out_r_uv; 25layout (location = 1) out vec2 out_g_uv; 26layout (location = 2) out vec2 out_b_uv; 27 28out gl_PerVertex 29{ 30 vec4 gl_Position; 31}; 32 33 34vec2 transform_uv_subimage(vec2 uv) 35{ 36 vec2 values = uv; 37 38 // To deal with OpenGL flip and sub image view. 39 values.xy = fma(values.xy, ubo.post_transform.zw, ubo.post_transform.xy); 40 41 // Ready to be used. 42 return values.xy; 43} 44 45vec2 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 67vec2 transform_uv(vec2 uv) 68{ 69 if (do_timewarp) { 70 return transform_uv_timewarp(uv); 71 } else { 72 return transform_uv_subimage(uv); 73 } 74} 75 76void main() 77{ 78 mat2x2 rot = { 79 ubo.vertex_rot.xy, 80 ubo.vertex_rot.zw, 81 }; 82 83 vec2 pos = rot * in_pos_ruv.xy; 84 gl_Position = vec4(pos, 0.0f, 1.0f); 85 86 vec2 r_uv = in_pos_ruv.zw; 87 vec2 g_uv = in_guv_buv.xy; 88 vec2 b_uv = in_guv_buv.zw; 89 90 r_uv = transform_uv(r_uv); 91 g_uv = transform_uv(g_uv); 92 b_uv = transform_uv(b_uv); 93 94 out_r_uv = r_uv; 95 out_g_uv = g_uv; 96 out_b_uv = b_uv; 97}