The open source OpenXR runtime
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}