From 113278c68d3a4a3618aa683adfd1dd67c8459d75 Mon Sep 17 00:00:00 2001 From: Jakob Bornecrantz Date: Tue, 5 Dec 2023 15:24:37 +0000 Subject: [PATCH] xrt: Refactor native compositor creation --- src/xrt/auxiliary/util/u_system.c | 1 + .../compositor/multi/comp_multi_compositor.c | 2 + src/xrt/compositor/multi/comp_multi_private.h | 4 ++ src/xrt/compositor/multi/comp_multi_system.c | 3 +- src/xrt/include/xrt/xrt_compositor.h | 5 ++- src/xrt/ipc/client/ipc_client_compositor.c | 7 ++-- src/xrt/ipc/client/ipc_client_system.c | 8 ++-- src/xrt/ipc/server/ipc_server_handler.c | 25 ++++++++++--- src/xrt/state_trackers/oxr/oxr_objects.h | 3 ++ src/xrt/state_trackers/oxr/oxr_session.c | 37 +++++++++++++------ 10 files changed, 70 insertions(+), 25 deletions(-) diff --git a/src/xrt/auxiliary/util/u_system.c b/src/xrt/auxiliary/util/u_system.c index d4c01745b..1f06d61c8 100644 --- a/src/xrt/auxiliary/util/u_system.c +++ b/src/xrt/auxiliary/util/u_system.c @@ -70,6 +70,7 @@ create_session(struct xrt_system *xsys, xret = xrt_syscomp_create_native_compositor( // usys->xsysc, // xsi, // + &us->sink, // out_xcn); // if (xret != XRT_SUCCESS) { goto err; diff --git a/src/xrt/compositor/multi/comp_multi_compositor.c b/src/xrt/compositor/multi/comp_multi_compositor.c index 14eecef69..2784ceaf4 100644 --- a/src/xrt/compositor/multi/comp_multi_compositor.c +++ b/src/xrt/compositor/multi/comp_multi_compositor.c @@ -1001,6 +1001,7 @@ multi_compositor_retire_delivered_locked(struct multi_compositor *mc, uint64_t w xrt_result_t multi_compositor_create(struct multi_system_compositor *msc, const struct xrt_session_info *xsi, + struct xrt_session_event_sink *xses, struct xrt_compositor_native **out_xcn) { COMP_TRACE_MARKER(); @@ -1035,6 +1036,7 @@ multi_compositor_create(struct multi_system_compositor *msc, mc->base.base.get_display_refresh_rate = multi_compositor_get_display_refresh_rate; mc->base.base.request_display_refresh_rate = multi_compositor_request_display_refresh_rate; mc->msc = msc; + mc->xses = xses; mc->xsi = *xsi; os_mutex_init(&mc->event.mutex); diff --git a/src/xrt/compositor/multi/comp_multi_private.h b/src/xrt/compositor/multi/comp_multi_private.h index 4c4251d08..d4cb4c066 100644 --- a/src/xrt/compositor/multi/comp_multi_private.h +++ b/src/xrt/compositor/multi/comp_multi_private.h @@ -116,6 +116,9 @@ struct multi_compositor // Client info. struct xrt_session_info xsi; + //! Where events for this compositor should go. + struct xrt_session_event_sink *xses; + //! Owning system compositor. struct multi_system_compositor *msc; @@ -218,6 +221,7 @@ multi_compositor(struct xrt_compositor *xc) xrt_result_t multi_compositor_create(struct multi_system_compositor *msc, const struct xrt_session_info *xsi, + struct xrt_session_event_sink *xses, struct xrt_compositor_native **out_xcn); /*! diff --git a/src/xrt/compositor/multi/comp_multi_system.c b/src/xrt/compositor/multi/comp_multi_system.c index fa6bdb6f3..dc4e19ce3 100644 --- a/src/xrt/compositor/multi/comp_multi_system.c +++ b/src/xrt/compositor/multi/comp_multi_system.c @@ -661,11 +661,12 @@ system_compositor_notify_display_refresh_changed(struct xrt_system_compositor *x static xrt_result_t system_compositor_create_native_compositor(struct xrt_system_compositor *xsc, const struct xrt_session_info *xsi, + struct xrt_session_event_sink *xses, struct xrt_compositor_native **out_xcn) { struct multi_system_compositor *msc = multi_system_compositor(xsc); - return multi_compositor_create(msc, xsi, out_xcn); + return multi_compositor_create(msc, xsi, xses, out_xcn); } static void diff --git a/src/xrt/include/xrt/xrt_compositor.h b/src/xrt/include/xrt/xrt_compositor.h index efe1ea8b1..86ec142ce 100644 --- a/src/xrt/include/xrt/xrt_compositor.h +++ b/src/xrt/include/xrt/xrt_compositor.h @@ -46,6 +46,7 @@ extern "C" { struct xrt_device; struct xrt_image_native; struct xrt_compositor; +struct xrt_session_event_sink; typedef struct VkCommandBuffer_T *VkCommandBuffer; #ifdef XRT_64_BIT @@ -2262,6 +2263,7 @@ struct xrt_system_compositor */ xrt_result_t (*create_native_compositor)(struct xrt_system_compositor *xsc, const struct xrt_session_info *xsi, + struct xrt_session_event_sink *xses, struct xrt_compositor_native **out_xcn); /*! @@ -2407,9 +2409,10 @@ xrt_syscomp_notify_display_refresh_changed(struct xrt_system_compositor *xsc, static inline xrt_result_t xrt_syscomp_create_native_compositor(struct xrt_system_compositor *xsc, const struct xrt_session_info *xsi, + struct xrt_session_event_sink *xses, struct xrt_compositor_native **out_xcn) { - return xsc->create_native_compositor(xsc, xsi, out_xcn); + return xsc->create_native_compositor(xsc, xsi, xses, out_xcn); } /*! diff --git a/src/xrt/ipc/client/ipc_client_compositor.c b/src/xrt/ipc/client/ipc_client_compositor.c index a0dc024f1..a15df0bcf 100644 --- a/src/xrt/ipc/client/ipc_client_compositor.c +++ b/src/xrt/ipc/client/ipc_client_compositor.c @@ -988,13 +988,14 @@ ipc_compositor_images_destroy(struct xrt_image_native_allocator *xina) xrt_result_t ipc_syscomp_create_native_compositor(struct xrt_system_compositor *xsc, const struct xrt_session_info *xsi, + struct xrt_session_event_sink *xses, struct xrt_compositor_native **out_xcn) { struct ipc_client_compositor *icc = container_of(xsc, struct ipc_client_compositor, system); - xrt_result_t xret; - xret = ipc_client_create_native_compositor(xsc, xsi, out_xcn); - IPC_CHK_ALWAYS_RET(icc->ipc_c, xret, "ipc_client_create_native_compositor"); + IPC_ERROR(icc->ipc_c, "This function shouldn't be called!"); + + return XRT_ERROR_IPC_FAILURE; } void diff --git a/src/xrt/ipc/client/ipc_client_system.c b/src/xrt/ipc/client/ipc_client_system.c index 4247774a7..1b672aab7 100644 --- a/src/xrt/ipc/client/ipc_client_system.c +++ b/src/xrt/ipc/client/ipc_client_system.c @@ -70,10 +70,10 @@ ipc_client_system_create_session(struct xrt_system *xsys, goto out_session; } - xret = xrt_syscomp_create_native_compositor( // - icsys->xsysc, // - xsi, // - out_xcn); // + xret = ipc_client_create_native_compositor( // + icsys->xsysc, // + xsi, // + out_xcn); // if (xret != XRT_SUCCESS) { goto err; } diff --git a/src/xrt/ipc/server/ipc_server_handler.c b/src/xrt/ipc/server/ipc_server_handler.c index 02ea30b26..79af973ce 100644 --- a/src/xrt/ipc/server/ipc_server_handler.c +++ b/src/xrt/ipc/server/ipc_server_handler.c @@ -208,13 +208,14 @@ ipc_handle_session_create(volatile struct ipc_client_state *ics, const struct xr { IPC_TRACE_MARKER(); + struct xrt_session *xs = NULL; struct xrt_compositor_native *xcn = NULL; - if (ics->xc != NULL) { + if (ics->xs != NULL) { return XRT_ERROR_IPC_SESSION_ALREADY_CREATED; } - xrt_result_t xret = xrt_syscomp_create_native_compositor(ics->server->xsysc, xsi, &xcn); + xrt_result_t xret = xrt_system_create_session(ics->server->xsys, xsi, &xs, &xcn); if (xret != XRT_SUCCESS) { return xret; } @@ -222,6 +223,7 @@ ipc_handle_session_create(volatile struct ipc_client_state *ics, const struct xr ics->client_state.session_overlay = xsi->is_overlay; ics->client_state.z_order = xsi->z_order; + ics->xs = xs; ics->xc = &xcn->base; xrt_syscomp_set_state(ics->server->xsysc, ics->xc, ics->client_state.session_visible, @@ -247,10 +249,16 @@ ipc_handle_session_begin(volatile struct ipc_client_state *ics) { IPC_TRACE_MARKER(); - if (ics->xc == NULL) { + // Have we created the session? + if (ics->xs == NULL) { return XRT_ERROR_IPC_SESSION_NOT_CREATED; } + // Need to check both because begin session is handled by compositor. + if (ics->xc == NULL) { + return XRT_ERROR_IPC_COMPOSITOR_NOT_CREATED; + } + //! @todo Pass the view type down. const struct xrt_begin_session_info begin_session_info = { .view_type = XRT_VIEW_TYPE_STEREO, @@ -267,10 +275,16 @@ ipc_handle_session_end(volatile struct ipc_client_state *ics) { IPC_TRACE_MARKER(); - if (ics->xc == NULL) { + // Have we created the session? + if (ics->xs == NULL) { return XRT_ERROR_IPC_SESSION_NOT_CREATED; } + // Need to check both because end session is handled by compositor. + if (ics->xc == NULL) { + return XRT_ERROR_IPC_COMPOSITOR_NOT_CREATED; + } + return xrt_comp_end_session(ics->xc); } @@ -279,7 +293,8 @@ ipc_handle_session_destroy(volatile struct ipc_client_state *ics) { IPC_TRACE_MARKER(); - if (ics->xc == NULL) { + // Have we created the session? + if (ics->xs == NULL) { return XRT_ERROR_IPC_SESSION_NOT_CREATED; } diff --git a/src/xrt/state_trackers/oxr/oxr_objects.h b/src/xrt/state_trackers/oxr/oxr_objects.h index cd2d5ed6c..3e5d7ffc3 100644 --- a/src/xrt/state_trackers/oxr/oxr_objects.h +++ b/src/xrt/state_trackers/oxr/oxr_objects.h @@ -1519,6 +1519,9 @@ struct oxr_session //! What graphics type was this session created with. enum oxr_session_graphics_ext gfx_ext; + //! The @ref xrt_session backing this session. + struct xrt_session *xs; + //! Native compositor that is wrapped by client compositors. struct xrt_compositor_native *xcn; diff --git a/src/xrt/state_trackers/oxr/oxr_session.c b/src/xrt/state_trackers/oxr/oxr_session.c index 9f36b4adc..4461cb3d6 100644 --- a/src/xrt/state_trackers/oxr/oxr_session.c +++ b/src/xrt/state_trackers/oxr/oxr_session.c @@ -10,6 +10,7 @@ */ #include "xrt/xrt_device.h" +#include "xrt/xrt_session.h" #include "xrt/xrt_config_build.h" // IWYU pragma: keep #include "xrt/xrt_config_have.h" // IWYU pragma: keep @@ -682,6 +683,7 @@ oxr_session_destroy(struct oxr_logger *log, struct oxr_handle_base *hb) xrt_comp_destroy(&sess->compositor); xrt_comp_native_destroy(&sess->xcn); + xrt_session_destroy(&sess->xs); os_precise_sleeper_deinit(&sess->sleeper); os_semaphore_destroy(&sess->sem); @@ -739,15 +741,19 @@ oxr_session_allocate_and_init(struct oxr_logger *log, } \ } while (false) -#define OXR_ALLOCATE_NATIVE_COMPOSITOR(LOG, XSI, SESS) \ +#define OXR_CREATE_XRT_SESSION_AND_NATIVE_COMPOSITOR(LOG, XSI, SESS) \ do { \ - xrt_result_t xret = xrt_syscomp_create_native_compositor((SESS)->sys->xsysc, (XSI), &(SESS)->xcn); \ + if ((SESS)->sys->xsysc == NULL) { \ + return oxr_error((LOG), XR_ERROR_RUNTIME_FAILURE, \ + "The system compositor wasn't created, can't create native compositor!"); \ + } \ + xrt_result_t xret = xrt_system_create_session((SESS)->sys->xsys, (XSI), &(SESS)->xs, &(SESS)->xcn); \ if (xret == XRT_ERROR_MULTI_SESSION_NOT_IMPLEMENTED) { \ return oxr_error((LOG), XR_ERROR_LIMIT_REACHED, "Per instance multi-session not supported."); \ } \ if (xret != XRT_SUCCESS) { \ - return oxr_error((LOG), XR_ERROR_RUNTIME_FAILURE, "Failed to create native compositor! '%i'", \ - xret); \ + return oxr_error((LOG), XR_ERROR_RUNTIME_FAILURE, \ + "Failed to create xrt_session and xrt_compositor_native! '%i'", xret); \ } \ if ((SESS)->sys->xsysc->xmcc != NULL) { \ xrt_syscomp_set_state((SESS)->sys->xsysc, &(SESS)->xcn->base, true, true); \ @@ -788,7 +794,7 @@ oxr_session_create_impl(struct oxr_logger *log, } OXR_SESSION_ALLOCATE_AND_INIT(log, sys, OXR_SESSION_GRAPHICS_EXT_XLIB_GL, *out_session); - OXR_ALLOCATE_NATIVE_COMPOSITOR(log, xsi, *out_session); + OXR_CREATE_XRT_SESSION_AND_NATIVE_COMPOSITOR(log, xsi, *out_session); return oxr_session_populate_gl_xlib(log, sys, opengl_xlib, *out_session); } #endif @@ -807,7 +813,7 @@ oxr_session_create_impl(struct oxr_logger *log, } OXR_SESSION_ALLOCATE_AND_INIT(log, sys, OXR_SESSION_GRAPHICS_EXT_ANDROID_GLES, *out_session); - OXR_ALLOCATE_NATIVE_COMPOSITOR(log, xsi, *out_session); + OXR_CREATE_XRT_SESSION_AND_NATIVE_COMPOSITOR(log, xsi, *out_session); return oxr_session_populate_gles_android(log, sys, opengles_android, *out_session); } #endif @@ -824,7 +830,7 @@ oxr_session_create_impl(struct oxr_logger *log, } OXR_SESSION_ALLOCATE_AND_INIT(log, sys, OXR_SESSION_GRAPHICS_EXT_WIN32_GL, *out_session); - OXR_ALLOCATE_NATIVE_COMPOSITOR(log, xsi, *out_session); + OXR_CREATE_XRT_SESSION_AND_NATIVE_COMPOSITOR(log, xsi, *out_session); return oxr_session_populate_gl_win32(log, sys, opengl_win32, *out_session); } #endif @@ -863,7 +869,7 @@ oxr_session_create_impl(struct oxr_logger *log, } OXR_SESSION_ALLOCATE_AND_INIT(log, sys, OXR_SESSION_GRAPHICS_EXT_VULKAN, *out_session); - OXR_ALLOCATE_NATIVE_COMPOSITOR(log, xsi, *out_session); + OXR_CREATE_XRT_SESSION_AND_NATIVE_COMPOSITOR(log, xsi, *out_session); return oxr_session_populate_vk(log, sys, vulkan, *out_session); } #endif @@ -881,7 +887,7 @@ oxr_session_create_impl(struct oxr_logger *log, } OXR_SESSION_ALLOCATE_AND_INIT(log, sys, OXR_SESSION_GRAPHICS_EXT_EGL, *out_session); - OXR_ALLOCATE_NATIVE_COMPOSITOR(log, xsi, *out_session); + OXR_CREATE_XRT_SESSION_AND_NATIVE_COMPOSITOR(log, xsi, *out_session); return oxr_session_populate_egl(log, sys, egl, *out_session); } #endif @@ -906,7 +912,7 @@ oxr_session_create_impl(struct oxr_logger *log, OXR_SESSION_ALLOCATE_AND_INIT(log, sys, OXR_SESSION_GRAPHICS_EXT_D3D11, *out_session); - OXR_ALLOCATE_NATIVE_COMPOSITOR(log, xsi, *out_session); + OXR_CREATE_XRT_SESSION_AND_NATIVE_COMPOSITOR(log, xsi, *out_session); return oxr_session_populate_d3d11(log, sys, d3d11, *out_session); } #endif @@ -931,7 +937,7 @@ oxr_session_create_impl(struct oxr_logger *log, OXR_SESSION_ALLOCATE_AND_INIT(log, sys, OXR_SESSION_GRAPHICS_EXT_D3D12, *out_session); - OXR_ALLOCATE_NATIVE_COMPOSITOR(log, xsi, *out_session); + OXR_CREATE_XRT_SESSION_AND_NATIVE_COMPOSITOR(log, xsi, *out_session); return oxr_session_populate_d3d12(log, sys, d3d12, *out_session); } #endif @@ -948,6 +954,15 @@ oxr_session_create_impl(struct oxr_logger *log, OXR_SESSION_ALLOCATE_AND_INIT(log, sys, OXR_SESSION_GRAPHICS_EXT_HEADLESS, *out_session); (*out_session)->compositor = NULL; (*out_session)->create_swapchain = NULL; + + xrt_result_t xret = xrt_system_create_session(sys->xsys, xsi, &(*out_session)->xs, NULL); + if (xret == XRT_ERROR_MULTI_SESSION_NOT_IMPLEMENTED) { + return oxr_error(log, XR_ERROR_LIMIT_REACHED, "Per instance multi-session not supported."); + } + if (xret != XRT_SUCCESS) { + return oxr_error(log, XR_ERROR_RUNTIME_FAILURE, "Failed to create xrt_session! '%i'", xret); + } + return XR_SUCCESS; } #endif