Monado OpenXR Runtime
Loading...
Searching...
No Matches
comp_render_helpers.h
Go to the documentation of this file.
1// Copyright 2023-2024, Collabora, Ltd.
2// Copyright 2025, NVIDIA CORPORATION.
3// SPDX-License-Identifier: BSL-1.0
4/*!
5 * @file
6 * @brief Compositor rendering code helpers.
7 * @author Jakob Bornecrantz <jakob@collabora.com>
8 * @ingroup comp_util
9 */
10
11#pragma once
12
13#include "xrt/xrt_compositor.h"
14
16
17#include "util/comp_base.h"
18#include "util/comp_render.h"
19
20#ifdef __cplusplus
21extern "C" {
22#endif
23
24
25/*
26 *
27 * Swapchain helpers.
28 *
29 */
30
31static inline VkImageView
32get_image_view(const struct comp_swapchain_image *image, enum xrt_layer_composition_flags flags, uint32_t array_index)
33{
34 if (flags & XRT_LAYER_COMPOSITION_BLEND_TEXTURE_SOURCE_ALPHA_BIT) {
35 return image->views.alpha[array_index];
36 }
37
38 return image->views.no_alpha[array_index];
39}
40
41
42/*
43 *
44 * View index helpers.
45 *
46 */
47
48static inline bool
49is_view_index_right(uint32_t view_index)
50{
51 return view_index % 2 == 1;
52}
53
54static inline void
55view_index_to_projection_data(uint32_t view_index,
56 const struct xrt_layer_data *data,
57 const struct xrt_layer_projection_view_data **out_vd)
58{
59 const struct xrt_layer_projection_data *proj = &data->proj;
60 *out_vd = &proj->v[view_index];
61}
62
63static inline void
64view_index_to_depth_data(uint32_t view_index,
65 const struct xrt_layer_data *data,
66 const struct xrt_layer_projection_view_data **out_vd,
67 const struct xrt_layer_depth_data **out_dvd)
68{
69 const struct xrt_layer_projection_depth_data *depth = &data->depth;
70 *out_vd = &depth->v[view_index];
71 *out_dvd = &depth->d[view_index];
72}
73
74
75/*
76 *
77 * Layer data helpers.
78 *
79 */
80
81static inline bool
82is_layer_view_visible(const struct xrt_layer_data *data, uint32_t view_index)
83{
84 enum xrt_layer_eye_visibility visibility;
85 switch (data->type) {
86 case XRT_LAYER_CUBE: visibility = data->cube.visibility; break;
87 case XRT_LAYER_CYLINDER: visibility = data->cylinder.visibility; break;
88 case XRT_LAYER_EQUIRECT1: visibility = data->equirect1.visibility; break;
89 case XRT_LAYER_EQUIRECT2: visibility = data->equirect2.visibility; break;
90 case XRT_LAYER_QUAD: visibility = data->quad.visibility; break;
91 case XRT_LAYER_PROJECTION:
92 case XRT_LAYER_PROJECTION_DEPTH: return true;
93 default: return false;
94 };
95
96 switch (visibility) {
97 case XRT_LAYER_EYE_VISIBILITY_LEFT_BIT: return !is_view_index_right(view_index);
98 case XRT_LAYER_EYE_VISIBILITY_RIGHT_BIT: return is_view_index_right(view_index);
99 case XRT_LAYER_EYE_VISIBILITY_BOTH: return true;
100 case XRT_LAYER_EYE_VISIBILITY_NONE:
101 default: return false;
102 }
103}
104
105static inline bool
106is_layer_view_space(const struct xrt_layer_data *data)
107{
108 return (data->flags & XRT_LAYER_COMPOSITION_VIEW_SPACE_BIT) != 0;
109}
110
111static inline bool
112is_layer_unpremultiplied(const struct xrt_layer_data *data)
113{
114 return (data->flags & XRT_LAYER_COMPOSITION_UNPREMULTIPLIED_ALPHA_BIT) != 0;
115}
116
117static inline bool
118is_layer_alpha_inverted(const struct xrt_layer_data *data)
119{
120#ifndef XRT_FEATURE_OPENXR_INVERTED_ALPHA
121 return false;
122#else
123 // The layers without source alpha bit flag are sent to comp with alpha 1.0, so they don't need to be inverted.
124 return (data->flags & XRT_LAYER_COMPOSITION_BLEND_TEXTURE_SOURCE_ALPHA_BIT) != 0 &&
125 (data->flags & XRT_LAYER_COMPOSITION_INVERTED_ALPHA_BIT) != 0;
126#endif
127}
128
129static inline void
130set_post_transform_rect(const struct xrt_layer_data *data,
131 const struct xrt_normalized_rect *src_norm_rect,
132 bool invert_flip,
133 struct xrt_normalized_rect *out_norm_rect)
134{
135 struct xrt_normalized_rect rect = *src_norm_rect;
136
137 if (data->flip_y ^ invert_flip) {
138 float h = rect.h;
139
140 rect.h = -h;
141 rect.y = rect.y + h;
142 }
143
144 *out_norm_rect = rect;
145}
146
147static inline void
148apply_bias_and_scale_from_layer(const struct xrt_layer_data *data,
149 struct xrt_colour_rgba_f32 *out_scale,
150 struct xrt_colour_rgba_f32 *out_bias)
151{
152 if (data->flags & XRT_LAYER_COMPOSITION_COLOR_BIAS_SCALE) {
153 *out_scale = data->color_scale;
154 *out_bias = data->color_bias;
155 } else {
156 // Use identity scale and zero bias when flag is not set
157 *out_scale = XRT_C11_COMPOUND(struct xrt_colour_rgba_f32){1.0f, 1.0f, 1.0f, 1.0f};
158 *out_bias = XRT_C11_COMPOUND(struct xrt_colour_rgba_f32){0.0f, 0.0f, 0.0f, 0.0f};
159 }
160}
161
162
163/*
164 *
165 * Command helpers.
166 *
167 */
168
169/*!
170 * This inserts a barrier operation that effects all views[X].squash.image
171 * fields (which are VkImages).
172 */
173static inline void
175 const struct comp_render_dispatch_data *d,
176 VkCommandBuffer cmd,
177 VkAccessFlags src_access_mask,
178 VkAccessFlags dst_access_mask,
179 VkImageLayout transition_from,
180 VkImageLayout transition_to,
181 VkPipelineStageFlags src_stage_mask,
182 VkPipelineStageFlags dst_stage_mask)
183{
184 VkImageSubresourceRange first_color_level_subresource_range = {
185 .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
186 .baseMipLevel = 0,
187 .levelCount = 1,
188 .baseArrayLayer = 0,
189 .layerCount = 1,
190 };
191
192 for (uint32_t i = 0; i < d->squash_view_count; i++) {
193 bool already_barriered = false;
194
195 VkImage image = d->views[i].squash.image;
196
197 uint32_t k = i;
198 while (k > 0) {
199 k--; // k is always greater then zero.
200
201 if (d->views[k].squash.image == image) {
202 already_barriered = true;
203 break;
204 }
205 }
206
207 if (already_barriered) {
208 continue;
209 }
210
212 vk, // vk_bundle
213 cmd, // cmd_buffer
214 image, // image
215 src_access_mask, // src_access_mask
216 dst_access_mask, // dst_access_mask
217 transition_from, // old_image_layout
218 transition_to, // new_image_layout
219 src_stage_mask, // src_stage_mask
220 dst_stage_mask, // dst_stage_mask
221 first_color_level_subresource_range); // subresource_range
222 }
223}
224
225
226#ifdef __cplusplus
227}
228#endif
Helper implementation for native compositors.
Compositor render implementation.
static void cmd_barrier_view_squash_images(struct vk_bundle *vk, const struct comp_render_dispatch_data *d, VkCommandBuffer cmd, VkAccessFlags src_access_mask, VkAccessFlags dst_access_mask, VkImageLayout transition_from, VkImageLayout transition_to, VkPipelineStageFlags src_stage_mask, VkPipelineStageFlags dst_stage_mask)
This inserts a barrier operation that effects all views[X].squash.image fields (which are VkImages).
Definition comp_render_helpers.h:174
void vk_cmd_image_barrier_locked(struct vk_bundle *vk, VkCommandBuffer cmd_buffer, VkImage image, VkAccessFlags src_access_mask, VkAccessFlags dst_access_mask, VkImageLayout old_image_layout, VkImageLayout new_image_layout, VkPipelineStageFlags src_stage_mask, VkPipelineStageFlags dst_stage_mask, VkImageSubresourceRange subresource_range)
Inserts a image barrier command, doesn't take any locks, the calling code will need hold the lock for...
Definition vk_helpers.c:1004
xrt_layer_composition_flags
Bit field for holding information about how a layer should be composited.
Definition xrt_compositor.h:93
xrt_layer_eye_visibility
Which view is the layer visible to?
Definition xrt_compositor.h:166
@ XRT_LAYER_COMPOSITION_VIEW_SPACE_BIT
The layer is locked to the device and the pose should only be adjusted for the IPD.
Definition xrt_compositor.h:101
@ XRT_LAYER_COMPOSITION_INVERTED_ALPHA_BIT
This layer has inverted alpha, see XR_COMPOSITION_LAYER_INVERTED_ALPHA_BIT_EXT.
Definition xrt_compositor.h:139
@ XRT_LAYER_COMPOSITION_COLOR_BIAS_SCALE
If this flag is set the compositor should use the scale and bias from the xrt_layer_data struct.
Definition xrt_compositor.h:107
The NEW compositor rendering code header.
The input data needed for a complete layer squashing distortion rendering to a target.
Definition comp_render.h:167
uint32_t squash_view_count
The number of squash views currently in this dispatch data.
Definition comp_render.h:173
VkImage image
The layer image for this view (aka scratch image), used for barrier operations.
Definition comp_render.h:101
A single swapchain image, holds the needed state for tracking image usage.
Definition comp_swapchain.h:58
struct comp_swapchain_image::@114 views
Views used by the renderer and distortion code, for each array layer.
Definition m_space.cpp:87
A bundle of Vulkan functions and objects, used by both Compositor and Compositor client code.
Definition vk_helpers.h:81
A 4 element colour with floating point channels.
Definition xrt_defines.h:423
All the pure data values associated with a composition layer.
Definition xrt_compositor.h:425
All the pure data values associated with a depth information attached to a layer.
Definition xrt_compositor.h:273
All the pure data values associated with a projection layer.
Definition xrt_compositor.h:259
All the pure data values associated with a projection layer with depth swapchain attached.
Definition xrt_compositor.h:296
All of the pure data values associated with a single view in a projection layer.
Definition xrt_compositor.h:245
Normalized image rectangle, coordinates and size in 0 .
Definition xrt_defines.h:480
Header declaring XRT graphics interfaces.