···202202/*!
203203 * Create an IPC client system compositor.
204204 *
205205+ * It owns a special implementation of the @ref xrt_system_compositor interface.
206206+ *
207207+ * This actually creates an IPC client "native" compositor with deferred
208208+ * initialization. The @ref ipc_client_create_native_compositor function
209209+ * actually completes the deferred initialization of the compositor, effectively
210210+ * finishing creation of a compositor IPC proxy.
211211+ *
205212 * @param ipc_c IPC connection
206213 * @param xina Optional native image allocator for client-side allocation. Takes
207214 * ownership if one is supplied.
208215 * @param xdev Taken in but not used currently @todo remove this param?
209216 * @param[out] out_xcs Pointer to receive the created xrt_system_compositor.
210217 */
211211-int
218218+xrt_result_t
212219ipc_client_create_system_compositor(struct ipc_connection *ipc_c,
213220 struct xrt_image_native_allocator *xina,
214221 struct xrt_device *xdev,
215222 struct xrt_system_compositor **out_xcs);
223223+224224+/*!
225225+ * Create a native compositor from a system compositor, this is used instead
226226+ * of the normal xrt_system_compositor::create_native_compositor function
227227+ * because it doesn't support events being generated on the app side. This will
228228+ * also create the session on the service side.
229229+ *
230230+ * @param xsysc IPC created system compositor.
231231+ * @param xsi Session information struct.
232232+ * @param[out] out_xcn Pointer to receive the created xrt_compositor_native.
233233+ */
234234+xrt_result_t
235235+ipc_client_create_native_compositor(struct xrt_system_compositor *xsysc,
236236+ const struct xrt_session_info *xsi,
237237+ struct xrt_compositor_native **out_xcn);
216238217239struct xrt_device *
218240ipc_client_hmd_create(struct ipc_connection *ipc_c, struct xrt_tracking_origin *xtrack, uint32_t device_id);
+28-24
src/xrt/ipc/client/ipc_client_compositor.c
···993993 struct ipc_client_compositor *icc = container_of(xsc, struct ipc_client_compositor, system);
994994 xrt_result_t xret;
995995996996- if (icc->compositor_created) {
997997- return XRT_ERROR_MULTI_SESSION_NOT_IMPLEMENTED;
998998- }
999999-10001000- // Needs to be done before init.
10011001- xret = ipc_call_session_create(icc->ipc_c, xsi);
10021002- IPC_CHK_AND_RET(icc->ipc_c, xret, "ipc_call_session_create");
10031003-10041004- // Needs to be done after session create call.
10051005- ipc_compositor_init(icc, out_xcn);
10061006-10071007- icc->compositor_created = true;
10081008-10091009- return XRT_SUCCESS;
996996+ xret = ipc_client_create_native_compositor(xsc, xsi, out_xcn);
997997+ IPC_CHK_ALWAYS_RET(icc->ipc_c, xret, "ipc_client_create_native_compositor");
1010998}
101199910121000void
···10301018 *
10311019 */
1032102010331033-/*!
10341034- *
10351035- *
10361036- * This actually creates an IPC client "native" compositor with deferred initialization.
10371037- * It owns a special implementation of the @ref xrt_system_compositor interface
10381038- * whose "create_native_compositor" method actually completes the deferred initialization
10391039- * of the compositor, effectively finishing creation of a compositor IPC proxy.
10401040- */
10411041-int
10211021+xrt_result_t
10221022+ipc_client_create_native_compositor(struct xrt_system_compositor *xsysc,
10231023+ const struct xrt_session_info *xsi,
10241024+ struct xrt_compositor_native **out_xcn)
10251025+{
10261026+ struct ipc_client_compositor *icc = container_of(xsysc, struct ipc_client_compositor, system);
10271027+ xrt_result_t xret;
10281028+10291029+ if (icc->compositor_created) {
10301030+ return XRT_ERROR_MULTI_SESSION_NOT_IMPLEMENTED;
10311031+ }
10321032+10331033+ // Needs to be done before init.
10341034+ xret = ipc_call_session_create(icc->ipc_c, xsi);
10351035+ IPC_CHK_AND_RET(icc->ipc_c, xret, "ipc_call_session_create");
10361036+10371037+ // Needs to be done after session create call.
10381038+ ipc_compositor_init(icc, out_xcn);
10391039+10401040+ icc->compositor_created = true;
10411041+10421042+ return XRT_SUCCESS;
10431043+}
10441044+10451045+xrt_result_t
10421046ipc_client_create_system_compositor(struct ipc_connection *ipc_c,
10431047 struct xrt_image_native_allocator *xina,
10441048 struct xrt_device *xdev,
···1067107110681072 *out_xcs = &c->system;
1069107310701070- return 0;
10741074+ return XRT_SUCCESS;
10711075}