The open source OpenXR runtime
at main 172 lines 3.7 kB view raw
1// Copyright 2019-2024, Collabora, Ltd. 2// SPDX-License-Identifier: BSL-1.0 3/*! 4 * @file 5 * @brief Internal header for null compositor. 6 * 7 * Originally based on src/xrt/compositor/main/comp_compositor.h 8 * 9 * @author Jakob Bornecrantz <jakob@collabora.com> 10 * @author Lubosz Sarnecki <lubosz.sarnecki@collabora.com> 11 * @author Rylie Pavlik <rylie.pavlik@collabora.com> 12 * @ingroup comp_null 13 */ 14 15#pragma once 16 17#include "xrt/xrt_instance.h" 18 19#include "util/u_logging.h" 20#include "util/u_pacing.h" 21 22#include "util/comp_base.h" 23 24#include <stdint.h> 25 26 27#ifdef __cplusplus 28extern "C" { 29#endif 30 31struct xrt_device; 32struct u_pacing_compositor; 33 34/*! 35 * @defgroup comp_null Null compositor 36 * @ingroup xrt 37 * @brief A non-rendering alternate for the main compositor that still can 38 * support applications fully. 39 * 40 * Monado's design is highly modular, including allowing alternate compositors to 41 * be used. If you are looking to write an additional or alternate compositor to 42 * the one in `src/xrt/compositor/main`, this code is your starting point. It is 43 * the basic implementation of @ref xrt_compositor_native extracted from there, 44 * renamed, and with most implementations removed. Compare with similarly-named 45 * files there to see what was removed, and what helper functionality has been 46 * factored out and may be reusable. For example, you may be able to use @ref 47 * comp_renderer, @ref comp_resources, @ref comp_shaders, and @ref comp_target, 48 * among others. 49 */ 50 51 52/* 53 * 54 * Structs, enums and defines. 55 * 56 */ 57 58/*! 59 * Tracking frame state. 60 * 61 * @ingroup comp_null 62 */ 63struct null_comp_frame 64{ 65 int64_t id; 66 uint64_t predicted_display_time_ns; 67 uint64_t desired_present_time_ns; 68 uint64_t present_slop_ns; 69}; 70 71/*! 72 * Main compositor struct tying everything in the compositor together. 73 * 74 * This ultimately implements @ref xrt_compositor_native but does so by 75 * extending @ref comp_base, similar to how @ref comp_compositor works. 76 * 77 * @extends comp_base 78 * @ingroup comp_null 79 */ 80struct null_compositor 81{ 82 struct comp_base base; 83 84 //! The device we are displaying to. 85 struct xrt_device *xdev; 86 87 //! Pacing helper to drive us forward. 88 struct u_pacing_compositor *upc; 89 90 struct 91 { 92 enum u_logging_level log_level; 93 94 //! Frame interval that we are using. 95 uint64_t frame_interval_ns; 96 } settings; 97 98 // Kept here for convenience. 99 struct xrt_system_compositor_info sys_info; 100 101 //! @todo Insert your own required members here 102 103 struct 104 { 105 struct null_comp_frame waited; 106 struct null_comp_frame rendering; 107 } frame; 108}; 109 110 111/* 112 * 113 * Functions and helpers. 114 * 115 */ 116 117/*! 118 * Convenience function to convert an xrt_compositor to a null_compositor. 119 * (Down-cast helper.) 120 * 121 * @private @memberof null_compositor 122 * @ingroup comp_null 123 */ 124static inline struct null_compositor * 125null_compositor(struct xrt_compositor *xc) 126{ 127 return (struct null_compositor *)xc; 128} 129 130/*! 131 * Spew level logging. 132 * 133 * @relates null_compositor 134 * @ingroup comp_null 135 */ 136#define NULL_TRACE(c, ...) U_LOG_IFL_T(c->settings.log_level, __VA_ARGS__); 137 138/*! 139 * Debug level logging. 140 * 141 * @relates null_compositor 142 */ 143#define NULL_DEBUG(c, ...) U_LOG_IFL_D(c->settings.log_level, __VA_ARGS__); 144 145/*! 146 * Info level logging. 147 * 148 * @relates null_compositor 149 * @ingroup comp_null 150 */ 151#define NULL_INFO(c, ...) U_LOG_IFL_I(c->settings.log_level, __VA_ARGS__); 152 153/*! 154 * Warn level logging. 155 * 156 * @relates null_compositor 157 * @ingroup comp_null 158 */ 159#define NULL_WARN(c, ...) U_LOG_IFL_W(c->settings.log_level, __VA_ARGS__); 160 161/*! 162 * Error level logging. 163 * 164 * @relates null_compositor 165 * @ingroup comp_null 166 */ 167#define NULL_ERROR(c, ...) U_LOG_IFL_E(c->settings.log_level, __VA_ARGS__); 168 169 170#ifdef __cplusplus 171} 172#endif