The open source OpenXR runtime

c/render: Add graphics layer shaders

+161
+3
src/xrt/compositor/CMakeLists.txt
··· 95 shaders/mesh.vert 96 shaders/layer.frag 97 shaders/layer.vert 98 shaders/equirect1.vert 99 shaders/equirect1.frag 100 shaders/equirect2.vert
··· 95 shaders/mesh.vert 96 shaders/layer.frag 97 shaders/layer.vert 98 + shaders/layer_projection.vert 99 + shaders/layer_quad.vert 100 + shaders/layer_shared.frag 101 shaders/equirect1.vert 102 shaders/equirect1.frag 103 shaders/equirect2.vert
+34
src/xrt/compositor/render/render_interface.h
··· 78 //! How many distortion images we have, one for each channel (3 rgb) and per view, total 6. 79 #define RENDER_DISTORTION_NUM_IMAGES (6) 80 81 82 /* 83 * ··· 144 145 VkShaderModule layer_vert; 146 VkShaderModule layer_frag; 147 }; 148 149 /*! ··· 837 struct xrt_normalized_rect pre_transform; 838 struct xrt_matrix_4x4 transform; 839 }; 840 841 /*! 842 * @name Drawing functions
··· 78 //! How many distortion images we have, one for each channel (3 rgb) and per view, total 6. 79 #define RENDER_DISTORTION_NUM_IMAGES (6) 80 81 + //! Which binding does the layer projection and quad shader has it's UBO on. 82 + #define RENDER_BINDING_LAYER_SHARED_UBO 0 83 + 84 + //! Which binding does the shared layer fragment shader has it's source on. 85 + #define RENDER_BINDING_LAYER_SHARED_SRC 1 86 + 87 88 /* 89 * ··· 150 151 VkShaderModule layer_vert; 152 VkShaderModule layer_frag; 153 + 154 + /* 155 + * New layer renderer. 156 + */ 157 + 158 + VkShaderModule layer_projection_vert; 159 + VkShaderModule layer_quad_vert; 160 + VkShaderModule layer_shared_frag; 161 }; 162 163 /*! ··· 851 struct xrt_normalized_rect pre_transform; 852 struct xrt_matrix_4x4 transform; 853 }; 854 + 855 + /*! 856 + * UBO data that is sent to the layer projection shader. 857 + */ 858 + struct render_gfx_layer_projection_data 859 + { 860 + struct xrt_normalized_rect post_transform; 861 + struct xrt_normalized_rect to_tanget; 862 + struct xrt_matrix_4x4 mvp; 863 + }; 864 + 865 + /*! 866 + * UBO data that is sent to the layer quad shader. 867 + */ 868 + struct render_gfx_layer_quad_data 869 + { 870 + struct xrt_normalized_rect post_transform; 871 + struct xrt_matrix_4x4 mvp; 872 + }; 873 + 874 875 /*! 876 * @name Drawing functions
+11
src/xrt/compositor/render/render_shaders.c
··· 36 #include "shaders/equirect1.vert.h" 37 #include "shaders/equirect2.frag.h" 38 #include "shaders/equirect2.vert.h" 39 #include "shaders/mesh.frag.h" 40 #include "shaders/mesh.vert.h" 41 ··· 129 LOAD(layer_vert); 130 LOAD(layer_frag); 131 132 VK_DEBUG(vk, "Shaders loaded!"); 133 134 return true; ··· 153 #endif 154 D(ShaderModule, s->layer_vert); 155 D(ShaderModule, s->layer_frag); 156 157 VK_DEBUG(vk, "Shaders destroyed!"); 158 }
··· 36 #include "shaders/equirect1.vert.h" 37 #include "shaders/equirect2.frag.h" 38 #include "shaders/equirect2.vert.h" 39 + #include "shaders/layer_projection.vert.h" 40 + #include "shaders/layer_quad.vert.h" 41 + #include "shaders/layer_shared.frag.h" 42 #include "shaders/mesh.frag.h" 43 #include "shaders/mesh.vert.h" 44 ··· 132 LOAD(layer_vert); 133 LOAD(layer_frag); 134 135 + LOAD(layer_projection_vert); 136 + LOAD(layer_quad_vert); 137 + LOAD(layer_shared_frag); 138 + 139 VK_DEBUG(vk, "Shaders loaded!"); 140 141 return true; ··· 160 #endif 161 D(ShaderModule, s->layer_vert); 162 D(ShaderModule, s->layer_frag); 163 + 164 + D(ShaderModule, s->layer_projection_vert); 165 + D(ShaderModule, s->layer_quad_vert); 166 + D(ShaderModule, s->layer_shared_frag); 167 168 VK_DEBUG(vk, "Shaders destroyed!"); 169 }
+49
src/xrt/compositor/shaders/layer_projection.vert
···
··· 1 + // Copyright 2023, Collabora Ltd. 2 + // Author: Jakob Bornecrantz <jakob@collabora.com> 3 + // SPDX-License-Identifier: BSL-1.0 4 + 5 + #version 460 6 + 7 + 8 + layout (binding = 0, std140) uniform Config 9 + { 10 + vec4 post_transform; 11 + vec4 to_tanget; 12 + mat4 mvp; 13 + } ubo; 14 + 15 + layout (location = 0) out vec2 out_uv; 16 + 17 + out gl_PerVertex 18 + { 19 + vec4 gl_Position; 20 + }; 21 + 22 + vec2 pos[4] = { 23 + vec2(0, 0), 24 + vec2(0, 1), 25 + vec2(1, 0), 26 + vec2(1, 1), 27 + }; 28 + 29 + void main() 30 + { 31 + // We now get a unmodified UV position. 32 + vec2 in_uv = pos[gl_VertexIndex % 4]; 33 + 34 + // Turn the UV into tanget angle space. 35 + vec2 pos = fma(in_uv, ubo.to_tanget.zw, ubo.to_tanget.xy); 36 + 37 + // Flip to OpenXR coordinate system. 38 + pos.y = -pos.y; 39 + 40 + // Do timewarp by moving from a plane that is 1m in front of the 41 + // origin of the projection layer into the view of the new position. 42 + vec4 position = ubo.mvp * vec4(pos, -1.0f, 1.0f); 43 + 44 + // To deal with OpenGL flip and sub image view. 45 + vec2 uv = fma(in_uv, ubo.post_transform.zw, ubo.post_transform.xy); 46 + 47 + gl_Position = position; 48 + out_uv = uv; 49 + }
+47
src/xrt/compositor/shaders/layer_quad.vert
···
··· 1 + // Copyright 2023, Collabora Ltd. 2 + // Author: Jakob Bornecrantz <jakob@collabora.com> 3 + // SPDX-License-Identifier: BSL-1.0 4 + 5 + #version 460 6 + 7 + 8 + layout (binding = 0, std140) uniform Config 9 + { 10 + vec4 post_transform; 11 + mat4 mvp; 12 + } ubo; 13 + 14 + layout (location = 0) out vec2 out_uv; 15 + 16 + out gl_PerVertex 17 + { 18 + vec4 gl_Position; 19 + }; 20 + 21 + vec2 pos[4] = { 22 + vec2(0, 0), 23 + vec2(0, 1), 24 + vec2(1, 0), 25 + vec2(1, 1), 26 + }; 27 + 28 + void main() 29 + { 30 + // We now get a unmodified UV position. 31 + vec2 in_uv = pos[gl_VertexIndex % 4]; 32 + 33 + // Center the quad at origin. 34 + vec2 pos = in_uv - 0.5; 35 + 36 + // Flip to OpenXR coordinate system. 37 + pos.y = -pos.y; 38 + 39 + // Place quad in the center of the mvp, it will scale it. 40 + vec4 position = ubo.mvp * vec4(pos, 0.0f, 1.0f); 41 + 42 + // To deal with OpenGL flip and sub image view. 43 + vec2 uv = fma(in_uv, ubo.post_transform.zw, ubo.post_transform.xy); 44 + 45 + gl_Position = position; 46 + out_uv = uv; 47 + }
+17
src/xrt/compositor/shaders/layer_shared.frag
···
··· 1 + // Copyright 2023, Collabora Ltd. 2 + // Author: Jakob Bornecrantz <jakob@collabora.com> 3 + // SPDX-License-Identifier: BSL-1.0 4 + 5 + #version 460 6 + 7 + 8 + layout (binding = 1) uniform sampler2D image; 9 + 10 + layout (location = 0) in vec2 uv; 11 + layout (location = 0) out vec4 out_color; 12 + 13 + 14 + void main () 15 + { 16 + out_color = texture(image, uv); 17 + }