Monado OpenXR Runtime
ipc_protocol.h
Go to the documentation of this file.
1// Copyright 2020-2024 Collabora, Ltd.
2// Copyright 2025, NVIDIA CORPORATION.
3// SPDX-License-Identifier: BSL-1.0
4/*!
5 * @file
6 * @brief Common protocol definition.
7 * @author Pete Black <pblack@collabora.com>
8 * @author Jakob Bornecrantz <jakob@collabora.com>
9 * @author Korcan Hussein <korcan.hussein@collabora.com>
10 * @ingroup ipc_shared
11 */
12
13#pragma once
14
15#include "xrt/xrt_limits.h"
16#include "xrt/xrt_compiler.h"
17#include "xrt/xrt_compositor.h"
18#include "xrt/xrt_results.h"
19#include "xrt/xrt_defines.h"
20#include "xrt/xrt_future.h"
21#include "xrt/xrt_system.h"
22#include "xrt/xrt_session.h"
23#include "xrt/xrt_instance.h"
24#include "xrt/xrt_compositor.h"
25#include "xrt/xrt_device.h"
26#include "xrt/xrt_space.h"
27#include "xrt/xrt_tracking.h"
28#include "xrt/xrt_config_build.h"
29
30#include <assert.h>
31#include <sys/types.h>
32
33
34#define IPC_CRED_SIZE 1 // auth not implemented
35#define IPC_BUF_SIZE 2048 // must be >= largest message length in bytes
36#define IPC_MAX_VIEWS 8 // max views we will return configs for
37#define IPC_MAX_FORMATS 32 // max formats our server-side compositor supports
38#define IPC_MAX_DEVICES 8 // max number of devices we will map using shared mem
39#define IPC_MAX_LAYERS XRT_MAX_LAYERS
40#define IPC_MAX_SLOTS 128
41#define IPC_MAX_CLIENTS 32
42#define IPC_MAX_RAW_VIEWS 32 // Max views that we can get, artificial limit.
43#define IPC_EVENT_QUEUE_SIZE 32
44
45#define IPC_SHARED_MAX_INPUTS 1024
46#define IPC_SHARED_MAX_OUTPUTS 128
47#define IPC_SHARED_MAX_BINDINGS 64
48
49// example: v21.0.0-560-g586d33b5
50#define IPC_VERSION_NAME_LEN 64
51
52#if defined(XRT_OS_WINDOWS) && !defined(XRT_ENV_MINGW)
53typedef int pid_t;
54#endif
55
56/*
57 *
58 * Shared memory structs.
59 *
60 */
61
62/*!
63 * A tracking in the shared memory area.
64 *
65 * @ingroup ipc
66 */
68{
69 //! For debugging.
70 char name[XRT_TRACKING_NAME_LEN];
71
72 //! What can the state tracker expect from this tracking system.
74
75 //! Initial offset of the tracking origin.
77};
78
79/*!
80 * A binding in the shared memory area.
81 *
82 * @ingroup ipc
83 */
85{
86 enum xrt_device_name name;
87
88 //! Offset into the array of pairs where this input bindings starts.
90 //! Number of inputs.
91 uint32_t input_count;
92
93 //! Offset into the array of pairs where this output bindings starts.
95 //! Number of outputs.
96 uint32_t output_count;
97};
98
99/*!
100 * A device in the shared memory area.
101 *
102 * @ingroup ipc
103 */
105{
106 //! Enum identifier of the device.
108 enum xrt_device_type device_type;
109
110 //! Which tracking system origin is this device attached to.
112
113 //! A string describing the device.
114 char str[XRT_DEVICE_NAME_LEN];
115
116 //! A unique identifier. Persistent across configurations, if possible.
117 char serial[XRT_DEVICE_NAME_LEN];
118
119 //! Number of bindings.
121 //! 'Offset' into the array of bindings where the bindings starts.
123
124 //! Number of inputs.
125 uint32_t input_count;
126 //! 'Offset' into the array of inputs where the inputs starts.
128
129 //! Number of outputs.
130 uint32_t output_count;
131 //! 'Offset' into the array of outputs where the outputs starts.
133
134 //! The supported fields.
136};
137
138/*!
139 * Data for a single composition layer.
140 *
141 * Similar in function to @ref comp_layer
142 *
143 * @ingroup ipc
144 */
146{
147 //! @todo what is this used for?
148 uint32_t xdev_id;
149
150 /*!
151 * Up to two indices of swapchains to use.
152 *
153 * How many are actually used depends on the value of @p data.type
154 */
155 uint32_t swapchain_ids[XRT_MAX_VIEWS * 2];
156
157 /*!
158 * All basic (trivially-serializable) data associated with a layer,
159 * aside from which swapchain(s) are used.
160 */
162};
163
164/*!
165 * Render state for a single client, including all layers.
166 *
167 * @ingroup ipc
168 */
170{
171 struct xrt_layer_frame_data data;
172 uint32_t layer_count;
173 struct ipc_layer_entry layers[IPC_MAX_LAYERS];
174};
175
176/*!
177 * A big struct that contains all data that is shared to a client, no pointers
178 * allowed in this. To get the inputs of a device you go:
179 *
180 * ```C++
181 * struct xrt_input *
182 * helper(struct ipc_shared_memory *ism, uint32_t device_id, uint32_t input)
183 * {
184 * uint32_t index = ism->isdevs[device_id]->first_input_index + input;
185 * return &ism->inputs[index];
186 * }
187 * ```
188 *
189 * @ingroup ipc
190 */
192{
193 /*!
194 * The git revision of the service, used by clients to detect version mismatches.
195 */
196 char u_git_tag[IPC_VERSION_NAME_LEN];
197
198 /*!
199 * Number of elements in @ref itracks that are populated/valid.
200 */
201 uint32_t itrack_count;
202
203 /*!
204 * @brief Array of shared tracking origin data.
205 *
206 * Only @ref itrack_count elements are populated/valid.
207 */
209
210 /*!
211 * Number of elements in @ref isdevs that are populated/valid.
212 */
213 uint32_t isdev_count;
214
215 /*!
216 * @brief Array of shared data per device.
217 *
218 * Only @ref isdev_count elements are populated/valid.
219 */
221
222 /*!
223 * Various roles for the devices.
224 */
225 struct
226 {
227 int32_t head;
228 int32_t eyes;
229 int32_t face;
230 int32_t body;
231
232 struct
233 {
234 struct
235 {
236 int32_t left;
237 int32_t right;
238 } unobstructed;
239
240 struct
241 {
242 int32_t left;
243 int32_t right;
244 } conforming;
245 } hand_tracking;
247
248 struct
249 {
250 struct
251 {
252 /*!
253 * Pixel properties of this display, not in absolute
254 * screen coordinates that the compositor sees. So
255 * before any rotation is applied by xrt_view::rot.
256 *
257 * The xrt_view::display::w_pixels &
258 * xrt_view::display::h_pixels become the recommended
259 * image size for this view.
260 *
261 * @todo doesn't account for overfill for timewarp or
262 * distortion?
263 */
264 struct
265 {
266 uint32_t w_pixels;
267 uint32_t h_pixels;
269 } views[2];
270 // view count
271 uint32_t view_count;
272 enum xrt_blend_mode blend_modes[XRT_MAX_DEVICE_BLEND_MODES];
273 uint32_t blend_mode_count;
274 } hmd;
275
276 struct xrt_input inputs[IPC_SHARED_MAX_INPUTS];
277
278 struct xrt_output outputs[IPC_SHARED_MAX_OUTPUTS];
279
280 struct ipc_shared_binding_profile binding_profiles[IPC_SHARED_MAX_BINDINGS];
281 struct xrt_binding_input_pair input_pairs[IPC_SHARED_MAX_INPUTS];
282 struct xrt_binding_output_pair output_pairs[IPC_SHARED_MAX_OUTPUTS];
283
284 struct ipc_layer_slot slots[IPC_MAX_SLOTS];
285
286 uint64_t startup_timestamp;
287 struct xrt_plane_detector_begin_info_ext plane_begin_info_ext;
288};
289
290/*!
291 * Initial info from a client when it connects.
292 */
294{
295 pid_t pid;
296 struct xrt_application_info info;
297};
298
300{
301 uint32_t ids[IPC_MAX_CLIENTS];
302 uint32_t id_count;
303};
304
305/*!
306 * State for a connected application.
307 *
308 * @ingroup ipc
309 */
311{
312 // Stable and unique ID of the client, only unique within this instance.
313 uint32_t id;
314
315 bool primary_application;
316 bool session_active;
317 bool session_visible;
318 bool session_focused;
319 bool session_overlay;
320 bool io_active;
321 uint32_t z_order;
322 pid_t pid;
323 struct xrt_application_info info;
324};
325
326
327/*!
328 * Arguments for creating swapchains from native images.
329 */
331{
332 uint32_t sizes[XRT_MAX_SWAPCHAIN_IMAGES];
333};
334
335/*!
336 * Arguments for xrt_device::get_view_poses with two views.
337 */
339{
340 struct xrt_fov fovs[XRT_MAX_VIEWS];
341 struct xrt_pose poses[XRT_MAX_VIEWS];
342 struct xrt_space_relation head_relation;
343};
344
346{
347 uint32_t num_samples;
348 float sample_rate;
349 bool append;
350};
xrt_blend_mode
Blend mode that the device supports, exact mirror of XrEnvironmentBlendMode.
Definition: xrt_defines.h:112
#define XRT_SYSTEM_MAX_DEVICES
Maximum number of devices simultaneously usable by an implementation of xrt_system_devices.
Definition: xrt_system.h:141
#define XRT_MAX_SWAPCHAIN_IMAGES
Max swapchain images, artificial limit.
Definition: xrt_limits.h:46
xrt_tracking_type
What kind of tracking system is this.
Definition: xrt_tracking.h:46
xrt_device_type
How an xrt_device can be used.
Definition: xrt_defines.h:813
State for a connected application.
Definition: ipc_protocol.h:311
Arguments for creating swapchains from native images.
Definition: ipc_protocol.h:331
Initial info from a client when it connects.
Definition: ipc_protocol.h:294
Definition: ipc_protocol.h:300
Arguments for xrt_device::get_view_poses with two views.
Definition: ipc_protocol.h:339
Data for a single composition layer.
Definition: ipc_protocol.h:146
struct xrt_layer_data data
All basic (trivially-serializable) data associated with a layer, aside from which swapchain(s) are us...
Definition: ipc_protocol.h:161
uint32_t swapchain_ids[XRT_MAX_VIEWS *2]
Up to two indices of swapchains to use.
Definition: ipc_protocol.h:155
uint32_t xdev_id
Definition: ipc_protocol.h:148
Render state for a single client, including all layers.
Definition: ipc_protocol.h:170
Definition: ipc_protocol.h:346
A binding in the shared memory area.
Definition: ipc_protocol.h:85
uint32_t output_count
Number of outputs.
Definition: ipc_protocol.h:96
uint32_t input_count
Number of inputs.
Definition: ipc_protocol.h:91
uint32_t first_input_index
Offset into the array of pairs where this input bindings starts.
Definition: ipc_protocol.h:89
uint32_t first_output_index
Offset into the array of pairs where this output bindings starts.
Definition: ipc_protocol.h:94
A device in the shared memory area.
Definition: ipc_protocol.h:105
uint32_t first_input_index
'Offset' into the array of inputs where the inputs starts.
Definition: ipc_protocol.h:127
uint32_t binding_profile_count
Number of bindings.
Definition: ipc_protocol.h:120
uint32_t first_binding_profile_index
'Offset' into the array of bindings where the bindings starts.
Definition: ipc_protocol.h:122
uint32_t input_count
Number of inputs.
Definition: ipc_protocol.h:125
uint32_t output_count
Number of outputs.
Definition: ipc_protocol.h:130
uint32_t first_output_index
'Offset' into the array of outputs where the outputs starts.
Definition: ipc_protocol.h:132
char str[XRT_DEVICE_NAME_LEN]
A string describing the device.
Definition: ipc_protocol.h:114
struct xrt_device_supported supported
The supported fields.
Definition: ipc_protocol.h:135
uint32_t tracking_origin_index
Which tracking system origin is this device attached to.
Definition: ipc_protocol.h:111
char serial[XRT_DEVICE_NAME_LEN]
A unique identifier. Persistent across configurations, if possible.
Definition: ipc_protocol.h:117
enum xrt_device_name name
Enum identifier of the device.
Definition: ipc_protocol.h:107
A big struct that contains all data that is shared to a client, no pointers allowed in this.
Definition: ipc_protocol.h:192
struct ipc_shared_memory::@266::@270::@271 display
Pixel properties of this display, not in absolute screen coordinates that the compositor sees.
struct ipc_shared_memory::@265 roles
Various roles for the devices.
uint32_t itrack_count
Number of elements in itracks that are populated/valid.
Definition: ipc_protocol.h:201
char u_git_tag[64]
The git revision of the service, used by clients to detect version mismatches.
Definition: ipc_protocol.h:196
struct ipc_shared_tracking_origin itracks[XRT_SYSTEM_MAX_DEVICES]
Array of shared tracking origin data.
Definition: ipc_protocol.h:208
struct ipc_shared_device isdevs[XRT_SYSTEM_MAX_DEVICES]
Array of shared data per device.
Definition: ipc_protocol.h:220
uint32_t isdev_count
Number of elements in isdevs that are populated/valid.
Definition: ipc_protocol.h:213
A tracking in the shared memory area.
Definition: ipc_protocol.h:68
char name[XRT_TRACKING_NAME_LEN]
For debugging.
Definition: ipc_protocol.h:70
enum xrt_tracking_type type
What can the state tracker expect from this tracking system.
Definition: ipc_protocol.h:73
struct xrt_pose offset
Initial offset of the tracking origin.
Definition: ipc_protocol.h:76
Non-process-specific information provided by the application at instance create time.
Definition: xrt_instance.h:73
A binding pair, going from a binding point to a device input.
Definition: xrt_device.h:194
A binding pair, going from a binding point to a device output.
Definition: xrt_device.h:205
Static data of supported features of the xrt_device this struct sits on.
Definition: xrt_device.h:256
Describes a projection matrix fov.
Definition: xrt_defines.h:499
A single named input, that sits on a xrt_device.
Definition: xrt_device.h:165
All the pure data values associated with a composition layer.
Definition: xrt_compositor.h:395
Per frame data for the layer submission calls, used in xrt_compositor::layer_begin.
Definition: xrt_compositor.h:481
A single named output, that sits on a xrt_device.
Definition: xrt_device.h:183
A query for a plane.
Definition: xrt_plane_detector.h:97
A pose composed of a position and orientation.
Definition: xrt_defines.h:479
A relation with two spaces, includes velocity and acceleration.
Definition: xrt_defines.h:670
Header holding common defines.
Header declaring XRT graphics interfaces.
Common defines and enums for XRT.
xrt_device_name
A enum that is used to name devices so that the state trackers can reason about the devices easier.
Definition: xrt_defines.h:801
Header defining an xrt display or controller device.
Interface for creating futures.
Header for xrt_instance object.
Header for limits of the XRT interfaces.
Internal result type for XRT.
Header for session object.
Header defining xrt space and space overseer.
Header for system objects.
Header defining the tracking system integration in Monado.