diff --git a/src/xrt/state_trackers/oxr/oxr_objects.h b/src/xrt/state_trackers/oxr/oxr_objects.h index 1a611b3bd4b59389d6e4a0cb22cd312cf9a837df..423ff08b6d8f3045821481309d73362f4eb82179 100644 --- a/src/xrt/state_trackers/oxr/oxr_objects.h +++ b/src/xrt/state_trackers/oxr/oxr_objects.h @@ -170,14 +170,6 @@ oxr_session_create(struct oxr_logger *log, XrStructureType *next, struct oxr_session **out_session); -/*! - * Internal destructor - not to be used directly! - * - * Use oxr_handle_destroy() to destroy a session. - */ -XrResult -oxr_session_destroy(struct oxr_logger *log, struct oxr_handle_base *hb); - XrResult oxr_session_enumerate_formats(struct oxr_logger *log, struct oxr_session *sess, @@ -400,10 +392,10 @@ oxr_event_push_XrEventDataSessionStateChanged(struct oxr_logger *log, #ifdef XR_USE_PLATFORM_XLIB XrResult -oxr_session_create_gl_xlib(struct oxr_logger *log, - struct oxr_system *sys, - XrGraphicsBindingOpenGLXlibKHR *next, - struct oxr_session **out_session); +oxr_session_populate_gl_xlib(struct oxr_logger *log, + struct oxr_system *sys, + XrGraphicsBindingOpenGLXlibKHR *next, + struct oxr_session *sess); #endif XrResult @@ -451,10 +443,10 @@ oxr_vk_get_physical_device(struct oxr_logger *log, VkPhysicalDevice *vkPhysicalDevice); XrResult -oxr_session_create_vk(struct oxr_logger *log, - struct oxr_system *sys, - XrGraphicsBindingVulkanKHR *next, - struct oxr_session **out_session); +oxr_session_populate_vk(struct oxr_logger *log, + struct oxr_system *sys, + XrGraphicsBindingVulkanKHR *next, + struct oxr_session *sess); XrResult oxr_swapchain_vk_create(struct oxr_logger *, diff --git a/src/xrt/state_trackers/oxr/oxr_session.c b/src/xrt/state_trackers/oxr/oxr_session.c index 13f0605e5c84129716dfbd60eb195f3bcefac15c..8a3f3c2009f4e8bab63836981c09f48c3ba1a53d 100644 --- a/src/xrt/state_trackers/oxr/oxr_session.c +++ b/src/xrt/state_trackers/oxr/oxr_session.c @@ -10,6 +10,7 @@ #include <stdio.h> #include <stdlib.h> +#include <assert.h> #include "util/u_debug.h" #include "util/u_misc.h" @@ -472,6 +473,26 @@ oxr_session_frame_end(struct oxr_logger *log, return XR_SUCCESS; } +static XrResult +oxr_session_destroy(struct oxr_logger *log, struct oxr_handle_base *hb) +{ + struct oxr_session *sess = (struct oxr_session *)hb; + if (sess->compositor != NULL) { + sess->compositor->destroy(sess->compositor); + } + free(sess); + + return XR_SUCCESS; +} + +#define OXR_SESSION_ALLOCATE(LOG, SYS, OUT) \ + do { \ + OXR_ALLOCATE_HANDLE_OR_RETURN(LOG, OUT, OXR_XR_DEBUG_SESSION, \ + oxr_session_destroy, \ + &SYS->inst->handle); \ + OUT->sys = SYS; \ + } while (0) + XrResult oxr_session_create(struct oxr_logger *log, struct oxr_system *sys, @@ -482,24 +503,23 @@ oxr_session_create(struct oxr_logger *log, XrResult ret; if (sys->inst->headless && next == NULL) { + OXR_SESSION_ALLOCATE(log, sys, sess); ret = XR_SUCCESS; - OXR_ALLOCATE_HANDLE_OR_RETURN(log, sess, OXR_XR_DEBUG_SESSION, - oxr_session_destroy, - &sys->inst->handle); - sess->sys = sys; sess->compositor = NULL; sess->create_swapchain = NULL; } else #ifdef XR_USE_PLATFORM_XLIB if (*next == XR_TYPE_GRAPHICS_BINDING_OPENGL_XLIB_KHR) { - ret = oxr_session_create_gl_xlib( - log, sys, (XrGraphicsBindingOpenGLXlibKHR *)next, &sess); + OXR_SESSION_ALLOCATE(log, sys, sess); + ret = oxr_session_populate_gl_xlib( + log, sys, (XrGraphicsBindingOpenGLXlibKHR *)next, sess); } else #endif #ifdef XR_USE_GRAPHICS_API_VULKAN if (*next == XR_TYPE_GRAPHICS_BINDING_VULKAN_KHR) { - ret = oxr_session_create_vk( - log, sys, (XrGraphicsBindingVulkanKHR *)next, &sess); + OXR_SESSION_ALLOCATE(log, sys, sess); + ret = oxr_session_populate_vk( + log, sys, (XrGraphicsBindingVulkanKHR *)next, sess); } else #endif { @@ -508,6 +528,10 @@ oxr_session_create(struct oxr_logger *log, } if (ret != XR_SUCCESS) { + /* clean up allocation first */ + XrResult cleanup_result = + oxr_handle_destroy(log, &sess->handle); + assert(cleanup_result == XR_SUCCESS); return ret; } @@ -525,15 +549,3 @@ oxr_session_create(struct oxr_logger *log, return ret; } - -XrResult -oxr_session_destroy(struct oxr_logger *log, struct oxr_handle_base *hb) -{ - struct oxr_session *sess = (struct oxr_session *)hb; - if (sess->compositor != NULL) { - sess->compositor->destroy(sess->compositor); - } - free(sess); - - return XR_SUCCESS; -} diff --git a/src/xrt/state_trackers/oxr/oxr_session_gl.c b/src/xrt/state_trackers/oxr/oxr_session_gl.c index 008a96af032c12cd31c3f34da2a06af301d5b5c6..c1a7b3cf8f77afc4cb2cad9f5dbc7376ac60fe7b 100644 --- a/src/xrt/state_trackers/oxr/oxr_session_gl.c +++ b/src/xrt/state_trackers/oxr/oxr_session_gl.c @@ -21,10 +21,10 @@ XrResult -oxr_session_create_gl_xlib(struct oxr_logger *log, - struct oxr_system *sys, - XrGraphicsBindingOpenGLXlibKHR *next, - struct oxr_session **out_session) +oxr_session_populate_gl_xlib(struct oxr_logger *log, + struct oxr_system *sys, + XrGraphicsBindingOpenGLXlibKHR *next, + struct oxr_session *sess) { struct xrt_compositor_gl *xcgl = xrt_gfx_provider_create_gl_xlib( sys->device, sys->inst->timekeeping, next->xDisplay, next->visualid, @@ -35,19 +35,8 @@ oxr_session_create_gl_xlib(struct oxr_logger *log, " failed create a compositor"); } - struct oxr_session *sess = NULL; - XrResult result = - OXR_ALLOCATE_HANDLE(log, sess, OXR_XR_DEBUG_SESSION, - oxr_session_destroy, &sys->inst->handle); - if (result != XR_SUCCESS) { - xcgl->base.destroy(&xcgl->base); - return result; - } - sess->sys = sys; sess->compositor = &xcgl->base; sess->create_swapchain = oxr_swapchain_gl_create; - *out_session = sess; - return XR_SUCCESS; } diff --git a/src/xrt/state_trackers/oxr/oxr_session_vk.c b/src/xrt/state_trackers/oxr/oxr_session_vk.c index c0c191b430c494e4a1ee153bdc85628031794049..6db843884c159644f581e7622d1fb6bb0cc920ba 100644 --- a/src/xrt/state_trackers/oxr/oxr_session_vk.c +++ b/src/xrt/state_trackers/oxr/oxr_session_vk.c @@ -24,10 +24,10 @@ VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *pName); XrResult -oxr_session_create_vk(struct oxr_logger *log, - struct oxr_system *sys, - XrGraphicsBindingVulkanKHR *next, - struct oxr_session **out_session) +oxr_session_populate_vk(struct oxr_logger *log, + struct oxr_system *sys, + XrGraphicsBindingVulkanKHR *next, + struct oxr_session *sess) { struct xrt_compositor_vk *xcvk = xrt_gfx_vk_provider_create( sys->device, sys->inst->timekeeping, next->instance, @@ -39,19 +39,8 @@ oxr_session_create_vk(struct oxr_logger *log, " failed create a compositor"); } - struct oxr_session *sess = NULL; - XrResult result = - OXR_ALLOCATE_HANDLE(log, sess, OXR_XR_DEBUG_SESSION, - oxr_session_destroy, &sys->inst->handle); - if (result != XR_SUCCESS) { - xcvk->base.destroy(&xcvk->base); - return result; - } - sess->sys = sys; sess->compositor = &xcvk->base; sess->create_swapchain = oxr_swapchain_vk_create; - *out_session = sess; - return XR_SUCCESS; }