Monado OpenXR Runtime
comp_compositor.h
Go to the documentation of this file.
1// Copyright 2019-2024, Collabora, Ltd.
2// SPDX-License-Identifier: BSL-1.0
3/*!
4 * @file
5 * @brief Main compositor written using Vulkan header.
6 * @author Jakob Bornecrantz <jakob@collabora.com>
7 * @author Lubosz Sarnecki <lubosz.sarnecki@collabora.com>
8 * @ingroup comp_main
9 */
10
11#pragma once
12
13#include "xrt/xrt_gfx_vk.h"
14#include "xrt/xrt_config_build.h"
15
16#include "util/u_threading.h"
17#include "util/u_index_fifo.h"
18#include "util/u_logging.h"
21
22#include "util/comp_base.h"
23#include "util/comp_sync.h"
24#include "util/comp_scratch.h"
25#include "util/comp_swapchain.h"
26
28
29#include "main/comp_target.h"
30#include "main/comp_window.h"
31#include "main/comp_settings.h"
32#include "main/comp_renderer.h"
33
34struct comp_window_peek;
36
37#ifdef __cplusplus
38extern "C" {
39#endif
40
41
42/*
43 *
44 * Defines
45 *
46 */
47
48// clang-format off
49#define COMP_INSTANCE_EXTENSIONS_COMMON \
50 VK_EXT_DEBUG_REPORT_EXTENSION_NAME, \
51 VK_KHR_EXTERNAL_FENCE_CAPABILITIES_EXTENSION_NAME, \
52 VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME, \
53 VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME, \
54 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, \
55 VK_KHR_SURFACE_EXTENSION_NAME
56// clang-format on
57
58
59/*
60 *
61 * Structs
62 *
63 */
64
65/*!
66 * Tracking frame state.
67 */
69{
70 int64_t id;
71 uint64_t predicted_display_time_ns;
72 uint64_t desired_present_time_ns;
73 uint64_t present_slop_ns;
74};
75
76/*!
77 * Main compositor struct tying everything in the compositor together.
78 *
79 *
80 * This ultimately implements @ref xrt_compositor_native but does so by
81 * extending @ref comp_base. Yes, it looks like a little bit of "code reuse
82 * through inheritance," but it is useful here to avoid lots of boilerplate
83 * due to the use of C.
84 *
85 * @ingroup comp_main
86 * @extends comp_base
87 */
89{
90 struct comp_base base;
91
92 //! The settings.
94
95 //! The device we are displaying to.
97
98 //! Vulkan shaders that the compositor (renderer) uses.
100
101 //! Vulkan resources that the compositor (renderer) uses.
103
104 //! The selected target factory that we create our target from.
106
107 //! The target we are displaying to.
109
110 //! Renderer helper.
112
113 //! Timestamp of last-rendered (immersive) frame.
115
116 // Extents of one view, in pixels.
117 VkExtent2D view_extents;
118
119 //! Are we mirroring any of the views to the debug gui? If so, turn off the fast path.
121
122 //! On screen window to display the content of the HMD.
124
125 /*!
126 * @brief Data exclusive to the begin_frame/end_frame for computing an
127 * estimate of the app's needs.
128 */
129 struct
130 {
131 int64_t last_begin;
132 int64_t last_end;
134
135 struct u_frame_times_widget compositor_frame_times;
136
137 struct
138 {
139 struct comp_frame waited;
140 struct comp_frame rendering;
141 } frame;
142
143 struct
144 {
145 // Per-view scratch images.
146 struct comp_scratch_single_images views[2];
147 } scratch;
148
149 struct
150 {
151 //! Temporarily disable ATW
153
154 //! Should the fast path be disabled.
156
157 struct u_swapchain_debug sc;
158 } debug;
159
160 //! If true, part of the compositor startup will be delayed until a session is started
162};
163
164
165/*
166 *
167 * Functions and helpers.
168 *
169 */
170
171/*!
172 * Convenience function to convert a xrt_compositor to a comp_compositor.
173 *
174 * @private @memberof comp_compositor
175 */
176static inline struct comp_compositor *
178{
179 return (struct comp_compositor *)xc;
180}
181
182/*!
183 * Helper define for printing Vulkan errors.
184 *
185 * @relates comp_compositor
186 */
187#define CVK_ERROR(C, FUNC, MSG, RET) COMP_ERROR(C, FUNC ": %s\n\t" MSG, vk_result_string(RET));
188
189/*!
190 * Spew level logging.
191 *
192 * @relates comp_compositor
193 */
194#define COMP_SPEW(c, ...) U_LOG_IFL_T(c->settings.log_level, __VA_ARGS__);
195
196/*!
197 * Debug level logging.
198 *
199 * @relates comp_compositor
200 */
201#define COMP_DEBUG(c, ...) U_LOG_IFL_D(c->settings.log_level, __VA_ARGS__);
202
203/*!
204 * Info level logging.
205 *
206 * @relates comp_compositor
207 */
208#define COMP_INFO(c, ...) U_LOG_IFL_I(c->settings.log_level, __VA_ARGS__);
209
210/*!
211 * Warn level logging.
212 *
213 * @relates comp_compositor
214 */
215#define COMP_WARN(c, ...) U_LOG_IFL_W(c->settings.log_level, __VA_ARGS__);
216
217/*!
218 * Error level logging.
219 *
220 * @relates comp_compositor
221 */
222#define COMP_ERROR(c, ...) U_LOG_IFL_E(c->settings.log_level, __VA_ARGS__);
223
224/*!
225 * Mode printing.
226 *
227 * @relates comp_compositor
228 */
229#define COMP_PRINT_MODE(c, ...) \
230 if (c->settings.print_modes) { \
231 U_LOG_I(__VA_ARGS__); \
232 }
233
234
235#ifdef __cplusplus
236}
237#endif
Helper implementation for native compositors.
Compositor rendering code header.
Helper implementation for native compositors.
Settings struct for compositor header.
Independent swapchain implementation.
Independent xrt_compositor_fence implementation.
Abstracted compositor rendering target.
Compositor window header.
The NEW compositor rendering code header.
A simple compositor base that handles a lot of things for you.
Definition: comp_base.h:98
struct xrt_compositor_native base
Base native compositor.
Definition: comp_base.h:100
Main compositor struct tying everything in the compositor together.
Definition: comp_compositor.h:89
bool deferred_surface
If true, part of the compositor startup will be delayed until a session is started.
Definition: comp_compositor.h:161
struct comp_settings settings
The settings.
Definition: comp_compositor.h:93
struct xrt_device * xdev
The device we are displaying to.
Definition: comp_compositor.h:96
struct comp_window_peek * peek
On screen window to display the content of the HMD.
Definition: comp_compositor.h:123
const struct comp_target_factory * target_factory
The selected target factory that we create our target from.
Definition: comp_compositor.h:105
bool atw_off
Temporarily disable ATW.
Definition: comp_compositor.h:152
bool mirroring_to_debug_gui
Are we mirroring any of the views to the debug gui? If so, turn off the fast path.
Definition: comp_compositor.h:120
struct comp_renderer * r
Renderer helper.
Definition: comp_compositor.h:111
struct render_shaders shaders
Vulkan shaders that the compositor (renderer) uses.
Definition: comp_compositor.h:99
bool disable_fast_path
Should the fast path be disabled.
Definition: comp_compositor.h:155
int64_t last_frame_time_ns
Timestamp of last-rendered (immersive) frame.
Definition: comp_compositor.h:114
struct render_resources nr
Vulkan resources that the compositor (renderer) uses.
Definition: comp_compositor.h:102
struct comp_compositor::@62 app_profiling
Data exclusive to the begin_frame/end_frame for computing an estimate of the app's needs.
struct comp_target * target
The target we are displaying to.
Definition: comp_compositor.h:108
Tracking frame state.
Definition: comp_compositor.h:69
Holds associated vulkan objects and state to render with a distortion.
Definition: comp_renderer.c:97
Holds scratch images for a single view, designed to work with render code.
Definition: comp_scratch.h:68
Settings for the compositor.
Definition: comp_settings.h:48
A factory of targets.
Definition: comp_target.h:580
A compositor target: where the compositor renders to.
Definition: comp_target.h:132
Definition: comp_window_peek.c:30
Definition: u_pacing_compositor.c:55
Holds all pools and static resources for rendering.
Definition: render_interface.h:352
Holds all shaders.
Definition: render_interface.h:136
Definition: u_frame_times_widget.h:24
Allows to debug image that is in GPU memory.
Definition: u_native_images_debug.h:197
Common compositor client interface/base.
Definition: xrt_compositor.h:986
A single HMD or input device.
Definition: xrt_device.h:230
Shared code for visualizing frametimes.
A FIFO for indices.
Basic logging functionality.
Special code for managing a variable tracked swapchain.
Slightly higher level thread safe helpers.
Header defining a XRT graphics provider.