The open source OpenXR runtime
1// Copyright 2020-2023, Collabora, Ltd.
2// SPDX-License-Identifier: BSL-1.0
3/*!
4 * @file
5 * @brief Client side wrapper of @ref xrt_session.
6 * @author Jakob Bornecrantz <jakob@collabora.com>
7 * @ingroup ipc_client
8 */
9
10#include "xrt/xrt_defines.h"
11#include "xrt/xrt_session.h"
12
13#include "ipc_client_generated.h"
14
15
16/*!
17 * IPC client implementation of @ref xrt_session.
18 *
19 * @implements xrt_session
20 * @ingroup ipc_client
21 */
22struct ipc_client_session
23{
24 struct xrt_session base;
25
26 struct ipc_connection *ipc_c;
27};
28
29
30/*
31 *
32 * Helpers
33 *
34 */
35
36static inline struct ipc_client_session *
37ipc_session(struct xrt_session *xs)
38{
39 return (struct ipc_client_session *)xs;
40}
41
42
43/*
44 *
45 * Member functions.
46 *
47 */
48
49static xrt_result_t
50ipc_client_session_poll_events(struct xrt_session *xs, union xrt_session_event *out_xse)
51{
52 struct ipc_client_session *ics = ipc_session(xs);
53 xrt_result_t xret;
54
55 xret = ipc_call_session_poll_events(ics->ipc_c, out_xse);
56 IPC_CHK_ALWAYS_RET(ics->ipc_c, xret, "ipc_call_session_poll_events");
57}
58
59static void
60ipc_client_session_destroy(struct xrt_session *xs)
61{
62 struct ipc_client_session *ics = ipc_session(xs);
63 xrt_result_t xret;
64
65 /*
66 * We own the session in both cases of headless or created with a
67 * native compositor, so we need to destroy it.
68 */
69 xret = ipc_call_session_destroy(ics->ipc_c);
70
71 /*
72 * We are probably in a really bad state if we fail, at
73 * least print out the error and continue as best we can.
74 */
75 IPC_CHK_ONLY_PRINT(ics->ipc_c, xret, "ipc_call_session_destroy");
76
77 free(ics);
78}
79
80
81/*
82 *
83 * 'Exported' functions.
84 *
85 */
86
87struct xrt_session *
88ipc_client_session_create(struct ipc_connection *ipc_c)
89{
90 struct ipc_client_session *ics = U_TYPED_CALLOC(struct ipc_client_session);
91 ics->base.poll_events = ipc_client_session_poll_events;
92 ics->base.destroy = ipc_client_session_destroy;
93 ics->ipc_c = ipc_c;
94
95 return &ics->base;
96}