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