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