···138138 return 0;
139139}
140140141141+static void
142142+handle_binding(struct ipc_shared_memory *ism,
143143+ struct xrt_binding_profile *xbp,
144144+ struct ipc_shared_binding_profile *isbp,
145145+ uint32_t *input_pair_index_ptr,
146146+ uint32_t *output_pair_index_ptr)
147147+{
148148+ uint32_t input_pair_index = *input_pair_index_ptr;
149149+ uint32_t output_pair_index = *output_pair_index_ptr;
150150+151151+ isbp->name = xbp->name;
152152+153153+ // Copy the initial state and also count the number in input_pairs.
154154+ size_t input_pair_start = input_pair_index;
155155+ for (size_t k = 0; k < xbp->num_inputs; k++) {
156156+ ism->input_pairs[input_pair_index++] = xbp->inputs[k];
157157+ }
158158+159159+ // Setup the 'offsets' and number of input_pairs.
160160+ if (input_pair_start != input_pair_index) {
161161+ isbp->num_inputs = input_pair_index - input_pair_start;
162162+ isbp->first_input_index = input_pair_start;
163163+ }
164164+165165+ // Copy the initial state and also count the number in outputs.
166166+ size_t output_pair_start = output_pair_index;
167167+ for (size_t k = 0; k < xbp->num_outputs; k++) {
168168+ ism->output_pairs[output_pair_index++] = xbp->outputs[k];
169169+ }
170170+171171+ // Setup the 'offsets' and number of output_pairs.
172172+ if (output_pair_start != output_pair_index) {
173173+ isbp->num_outputs = output_pair_index - output_pair_start;
174174+ isbp->first_output_index = output_pair_start;
175175+ }
176176+177177+ *input_pair_index_ptr = input_pair_index;
178178+ *output_pair_index_ptr = output_pair_index;
179179+}
180180+141181static int
142182init_shm(struct ipc_server *s)
143183{
···185225 count = 0;
186226 uint32_t input_index = 0;
187227 uint32_t output_index = 0;
228228+ uint32_t binding_index = 0;
229229+ uint32_t input_pair_index = 0;
230230+ uint32_t output_pair_index = 0;
231231+188232 for (size_t i = 0; i < IPC_SERVER_NUM_XDEVS; i++) {
189233 struct xrt_device *xdev = s->idevs[i].xdev;
190234 if (xdev == NULL) {
···232276233277 // Initial update.
234278 xrt_device_update_inputs(xdev);
279279+280280+ // Bindings
281281+ size_t binding_start = binding_index;
282282+ for (size_t k = 0; k < xdev->num_binding_profiles; k++) {
283283+ handle_binding(ism, &xdev->binding_profiles[k],
284284+ &ism->binding_profiles[binding_index++],
285285+ &input_pair_index, &output_pair_index);
286286+ }
287287+288288+ // Setup the 'offsets' and number of bindings.
289289+ if (binding_start != binding_index) {
290290+ isdev->num_binding_profiles =
291291+ binding_index - binding_start;
292292+ isdev->first_binding_profile_index = binding_start;
293293+ }
235294236295 // Copy the initial state and also count the number in inputs.
237296 size_t input_start = input_index;
+44-3
src/xrt/ipc/shared/ipc_protocol.h
···3535#define IPC_SHARED_MAX_DEVICES 8
3636#define IPC_SHARED_MAX_INPUTS 1024
3737#define IPC_SHARED_MAX_OUTPUTS 128
3838+#define IPC_SHARED_MAX_BINDINGS 64
3939+38403941/*
4042 *
···4244 *
4345 */
44464747+/*!
4848+ * A tracking in the shared memory area.
4949+ *
5050+ * @ingroup ipc
5151+ */
4552struct ipc_shared_tracking_origin
4653{
4754 //! For debugging.
···5461 struct xrt_pose offset;
5562};
56636464+/*!
6565+ * A binding in the shared memory area.
6666+ *
6767+ * @ingroup ipc
6868+ */
6969+struct ipc_shared_binding_profile
7070+{
7171+ enum xrt_device_name name;
7272+7373+ //! Number of inputs.
7474+ uint32_t num_inputs;
7575+ //! Offset into the array of pairs where this input bindings starts.
7676+ uint32_t first_input_index;
7777+7878+ //! Number of outputs.
7979+ uint32_t num_outputs;
8080+ //! Offset into the array of pairs where this output bindings starts.
8181+ uint32_t first_output_index;
8282+};
8383+8484+/*!
8585+ * A device in the shared memory area.
8686+ *
8787+ * @ingroup ipc
8888+ */
5789struct ipc_shared_device
5890{
5991 //! Enum identifier of the device.
···6698 //! A string describing the device.
6799 char str[XRT_DEVICE_NAME_LEN];
68100101101+ //! Number of bindings.
102102+ uint32_t num_binding_profiles;
103103+ //! 'Offset' into the array of bindings where the bindings starts.
104104+ uint32_t first_binding_profile_index;
105105+69106 //! Number of inputs.
70107 uint32_t num_inputs;
7171- //! 'Offset' into the array of inputs where this devices inputs starts.
108108+ //! 'Offset' into the array of inputs where the inputs starts.
72109 uint32_t first_input_index;
7311074111 //! Number of outputs.
75112 uint32_t num_outputs;
7676- //! 'Offset' into the array of outputs where this devices outputs
7777- //! starts.
113113+ //! 'Offset' into the array of outputs where the outputs starts.
78114 uint32_t first_output_index;
7911580116 bool orientation_tracking_supported;
···193229 struct xrt_input inputs[IPC_SHARED_MAX_INPUTS];
194230195231 struct xrt_output outputs[IPC_SHARED_MAX_OUTPUTS];
232232+233233+ struct ipc_shared_binding_profile
234234+ binding_profiles[IPC_SHARED_MAX_BINDINGS];
235235+ struct xrt_binding_input_pair input_pairs[IPC_SHARED_MAX_INPUTS];
236236+ struct xrt_binding_output_pair output_pairs[IPC_SHARED_MAX_OUTPUTS];
196237197238 struct ipc_layer_slot slots[IPC_MAX_SLOTS];
198239};