From 98cdb84b2661b8346c681b8ca1fef066d61ebbf3 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik <ryan.pavlik@collabora.com> Date: Fri, 5 Apr 2019 17:13:58 -0500 Subject: [PATCH] st/oxr: Simplify and dedupe session creation. The per-graphics-binding code now just "populates" a centrally-created session, rather than "creates". --- src/xrt/state_trackers/oxr/oxr_objects.h | 24 ++++------ src/xrt/state_trackers/oxr/oxr_session.c | 52 +++++++++++++-------- src/xrt/state_trackers/oxr/oxr_session_gl.c | 19 ++------ src/xrt/state_trackers/oxr/oxr_session_vk.c | 19 ++------ 4 files changed, 48 insertions(+), 66 deletions(-) diff --git a/src/xrt/state_trackers/oxr/oxr_objects.h b/src/xrt/state_trackers/oxr/oxr_objects.h index 1a611b3bd..423ff08b6 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 13f0605e5..8a3f3c200 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 008a96af0..c1a7b3cf8 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 c0c191b43..6db843884 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; } -- GitLab