ipc: Add support for xrt_system and xrt_session

This commit is contained in:
Jakob Bornecrantz committed 2023-12-10 17:01:50 +00:00
1 parent f0dbb46cd9
commit dd9a425202
9 files changed
+234 -4

No files matched your search

+2
View File
@@ -66,7 +66,9 @@ add_library(
client/ipc_client_device.c
client/ipc_client_hmd.c
client/ipc_client_instance.c
client/ipc_client_session.c
client/ipc_client_space_overseer.c
client/ipc_client_system.c
client/ipc_client_system_devices.c
)
target_include_directories(
+6
View File
@@ -220,8 +220,14 @@ ipc_client_hmd_create(struct ipc_connection *ipc_c, struct xrt_tracking_origin *
struct xrt_device *
ipc_client_device_create(struct ipc_connection *ipc_c, struct xrt_tracking_origin *xtrack, uint32_t device_id);
struct xrt_system *
ipc_client_system_create(struct ipc_connection *ipc_c, struct xrt_system_compositor *xsysc);
struct xrt_space_overseer *
ipc_client_space_overseer_create(struct ipc_connection *ipc_c);
struct xrt_system_devices *
ipc_client_system_devices_create(struct ipc_connection *ipc_c);
struct xrt_session *
ipc_client_session_create(struct ipc_connection *ipc_c);
+83
View File
@@ -0,0 +1,83 @@
// Copyright 2020-2023, Collabora, Ltd.
// SPDX-License-Identifier: BSL-1.0
/*!
* @file
* @brief Client side wrapper of @ref xrt_session.
* @author Jakob Bornecrantz <jakob@collabora.com>
* @ingroup ipc_client
*/
#include "xrt/xrt_defines.h"
#include "xrt/xrt_session.h"
#include "ipc_client_generated.h"
/*!
* IPC client implementation of @ref xrt_session.
*
* @implements xrt_session.
* @ingroup ipc_client
*/
struct ipc_client_session
{
struct xrt_session base;
struct ipc_connection *ipc_c;
};
/*
*
* Helpers
*
*/
static inline struct ipc_client_session *
ipc_session(struct xrt_session *xs)
{
return (struct ipc_client_session *)xs;
}
/*
*
* Member functions.
*
*/
static xrt_result_t
ipc_client_session_poll_events(struct xrt_session *xs, union xrt_session_event *out_xse)
{
struct ipc_client_session *ics = ipc_session(xs);
xrt_result_t xret;
xret = ipc_call_session_poll_events(ics->ipc_c, out_xse);
IPC_CHK_ALWAYS_RET(ics->ipc_c, xret, "ipc_call_session_poll_events");
}
static void
ipc_client_session_destroy(struct xrt_session *xs)
{
struct ipc_client_session *ics = ipc_session(xs);
free(ics);
}
/*
*
* 'Exported' functions.
*
*/
struct xrt_session *
ipc_client_session_create(struct ipc_connection *ipc_c)
{
struct ipc_client_session *ics = U_TYPED_CALLOC(struct ipc_client_session);
ics->base.poll_events = ipc_client_session_poll_events;
ics->base.destroy = ipc_client_session_destroy;
ics->ipc_c = ipc_c;
return &ics->base;
}
+115
View File
@@ -0,0 +1,115 @@
// Copyright 2020-2023, Collabora, Ltd.
// SPDX-License-Identifier: BSL-1.0
/*!
* @file
* @brief Client side wrapper of @ref xrt_system.
* @author Jakob Bornecrantz <jakob@collabora.com>
* @ingroup ipc_client
*/
#include "xrt/xrt_defines.h"
#include "xrt/xrt_system.h"
#include "xrt/xrt_session.h"
#include "ipc_client_generated.h"
/*!
* IPC client implementation of @ref xrt_system.
*
* @implements xrt_system.
* @ingroup ipc_client
*/
struct ipc_client_system
{
struct xrt_system base;
struct ipc_connection *ipc_c;
struct xrt_system_compositor *xsysc;
};
/*
*
* Helpers
*
*/
static inline struct ipc_client_system *
ipc_system(struct xrt_system *xsys)
{
return (struct ipc_client_system *)xsys;
}
/*
*
* Member functions.
*
*/
static xrt_result_t
ipc_client_system_create_session(struct xrt_system *xsys,
const struct xrt_session_info *xsi,
struct xrt_session **out_xs,
struct xrt_compositor_native **out_xcn)
{
struct ipc_client_system *icsys = ipc_system(xsys);
xrt_result_t xret = XRT_SUCCESS;
if (out_xcn != NULL && icsys->xsysc == NULL) {
U_LOG_E("No system compositor in system, can't create native compositor.");
return XRT_ERROR_COMPOSITOR_NOT_SUPPORTED;
}
struct xrt_session *xs = ipc_client_session_create(icsys->ipc_c);
// Skip making a native compositor if not asked for.
if (out_xcn == NULL) {
goto out_session;
}
xret = xrt_syscomp_create_native_compositor( //
icsys->xsysc, //
xsi, //
out_xcn); //
if (xret != XRT_SUCCESS) {
goto err;
}
out_session:
*out_xs = xs;
return XRT_SUCCESS;
err:
return xret;
}
static void
ipc_client_system_destroy(struct xrt_system *xsys)
{
struct ipc_client_system *icsys = ipc_system(xsys);
free(icsys);
}
/*
*
* 'Exported' functions.
*
*/
struct xrt_system *
ipc_client_system_create(struct ipc_connection *ipc_c, struct xrt_system_compositor *xsysc)
{
struct ipc_client_system *icsys = U_TYPED_CALLOC(struct ipc_client_system);
icsys->base.create_session = ipc_client_system_create_session;
icsys->base.destroy = ipc_client_system_destroy;
icsys->ipc_c = ipc_c;
icsys->xsysc = xsysc;
return &icsys->base;
}
+4 -1
View File
@@ -82,6 +82,9 @@ struct ipc_client_state
//! Link back to the main server.
struct ipc_server *server;
//! Session for this client.
struct xrt_session *xs;
//! Compositor for this client.
struct xrt_compositor *xc;
@@ -420,7 +423,7 @@ ipc_server_client_thread(void *_ics);
* created from it, like all of the swapchains.
*/
void
ipc_server_client_destroy_compositor(volatile struct ipc_client_state *ics);
ipc_server_client_destroy_session_and_compositor(volatile struct ipc_client_state *ics);
/*!
* @defgroup ipc_server_internals Server Internals
+12 -1
View File
@@ -231,6 +231,17 @@ ipc_handle_session_create(volatile struct ipc_client_state *ics, const struct xr
return XRT_SUCCESS;
}
xrt_result_t
ipc_handle_session_poll_events(volatile struct ipc_client_state *ics, union xrt_session_event *out_xse)
{
// Have we created the session?
if (ics->xs == NULL) {
return XRT_ERROR_IPC_SESSION_NOT_CREATED;
}
return xrt_session_poll_events(ics->xs, out_xse);
}
xrt_result_t
ipc_handle_session_begin(volatile struct ipc_client_state *ics)
{
@@ -272,7 +283,7 @@ ipc_handle_session_destroy(volatile struct ipc_client_state *ics)
return XRT_ERROR_IPC_SESSION_NOT_CREATED;
}
ipc_server_client_destroy_compositor(ics);
ipc_server_client_destroy_session_and_compositor(ics);
return XRT_SUCCESS;
}
@@ -59,7 +59,7 @@ common_shutdown(volatile struct ipc_client_state *ics)
*/
// If the session hasn't been stopped, destroy the compositor.
ipc_server_client_destroy_compositor(ics);
ipc_server_client_destroy_session_and_compositor(ics);
// Make sure undestroyed spaces are unreferenced
for (uint32_t i = 0; i < IPC_MAX_CLIENT_SPACES; i++) {
@@ -294,7 +294,7 @@ client_loop(volatile struct ipc_client_state *ics)
*/
void
ipc_server_client_destroy_compositor(volatile struct ipc_client_state *ics)
ipc_server_client_destroy_session_and_compositor(volatile struct ipc_client_state *ics)
{
// Multiple threads might be looking at these fields.
os_mutex_lock(&ics->server->global_state.lock);
@@ -319,6 +319,9 @@ ipc_server_client_destroy_compositor(volatile struct ipc_client_state *ics)
// Cast away volatile.
xrt_comp_destroy((struct xrt_compositor **)&ics->xc);
// Cast away volatile.
xrt_session_destroy((struct xrt_session **)&ics->xs);
}
void *
+1
View File
@@ -16,6 +16,7 @@
#include "xrt/xrt_results.h"
#include "xrt/xrt_defines.h"
#include "xrt/xrt_system.h"
#include "xrt/xrt_session.h"
#include "xrt/xrt_instance.h"
#include "xrt/xrt_compositor.h"
#include "xrt/xrt_device.h"
+6
View File
@@ -68,6 +68,12 @@
]
},
"session_poll_events": {
"out": [
{"name": "event", "type": "union xrt_session_event"}
]
},
"session_begin": {},
"session_end": {},