2022-02-19 13:44:55 +00:00
|
|
|
// Copyright 2018-2022, Collabora, Ltd.
|
2019-03-18 05:52:32 +00:00
|
|
|
// SPDX-License-Identifier: BSL-1.0
|
|
|
|
/*!
|
|
|
|
* @file
|
2019-09-26 20:25:05 +00:00
|
|
|
* @brief Holds instance related functions.
|
2019-03-18 05:52:32 +00:00
|
|
|
* @author Jakob Bornecrantz <jakob@collabora.com>
|
|
|
|
* @ingroup oxr_main
|
|
|
|
*/
|
|
|
|
|
2020-07-15 19:11:08 +00:00
|
|
|
#include "xrt/xrt_config_os.h"
|
|
|
|
#include "xrt/xrt_config_build.h"
|
|
|
|
#include "xrt/xrt_instance.h"
|
|
|
|
|
2020-07-15 18:05:52 +00:00
|
|
|
#include "math/m_mathinclude.h"
|
2019-08-31 11:49:04 +00:00
|
|
|
#include "util/u_var.h"
|
2019-03-18 05:52:32 +00:00
|
|
|
#include "util/u_time.h"
|
2019-03-21 20:19:52 +00:00
|
|
|
#include "util/u_misc.h"
|
2019-08-31 11:49:04 +00:00
|
|
|
#include "util/u_debug.h"
|
2020-10-20 16:43:11 +00:00
|
|
|
#include "util/u_git_tag.h"
|
2019-03-18 05:52:32 +00:00
|
|
|
|
2020-08-18 20:33:21 +00:00
|
|
|
#ifdef XRT_OS_ANDROID
|
2020-08-19 20:56:38 +00:00
|
|
|
#include "android/android_globals.h"
|
2021-11-30 12:49:58 +00:00
|
|
|
#include "android/android_looper.h"
|
2020-08-18 20:33:21 +00:00
|
|
|
#endif
|
2019-03-18 05:52:32 +00:00
|
|
|
|
|
|
|
#include "oxr_objects.h"
|
|
|
|
#include "oxr_logger.h"
|
2019-04-05 19:18:03 +00:00
|
|
|
#include "oxr_handle.h"
|
2019-08-19 17:37:50 +00:00
|
|
|
#include "oxr_extension_support.h"
|
2020-07-20 19:53:52 +00:00
|
|
|
#include "oxr_subaction.h"
|
2020-08-18 20:33:21 +00:00
|
|
|
#include "oxr_chain.h"
|
2019-03-18 05:52:32 +00:00
|
|
|
|
2020-06-17 06:36:38 +00:00
|
|
|
#include <sys/types.h>
|
2020-07-15 16:45:01 +00:00
|
|
|
#ifdef XRT_OS_UNIX
|
2020-06-17 06:36:38 +00:00
|
|
|
#include <unistd.h>
|
2020-07-15 16:45:01 +00:00
|
|
|
#endif
|
2020-06-17 06:36:38 +00:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <math.h>
|
|
|
|
|
2019-10-22 10:47:25 +00:00
|
|
|
DEBUG_GET_ONCE_BOOL_OPTION(debug_views, "OXR_DEBUG_VIEWS", false)
|
|
|
|
DEBUG_GET_ONCE_BOOL_OPTION(debug_spaces, "OXR_DEBUG_SPACES", false)
|
|
|
|
DEBUG_GET_ONCE_BOOL_OPTION(debug_bindings, "OXR_DEBUG_BINDINGS", false)
|
|
|
|
DEBUG_GET_ONCE_BOOL_OPTION(lifecycle_verbose, "OXR_LIFECYCLE_VERBOSE", false)
|
|
|
|
|
2021-01-14 14:13:48 +00:00
|
|
|
DEBUG_GET_ONCE_FLOAT_OPTION(tracking_origin_offset_x, "OXR_TRACKING_ORIGIN_OFFSET_X", 0.0f)
|
|
|
|
DEBUG_GET_ONCE_FLOAT_OPTION(tracking_origin_offset_y, "OXR_TRACKING_ORIGIN_OFFSET_Y", 0.0f)
|
|
|
|
DEBUG_GET_ONCE_FLOAT_OPTION(tracking_origin_offset_z, "OXR_TRACKING_ORIGIN_OFFSET_Z", 0.0f)
|
2020-12-25 22:28:13 +00:00
|
|
|
|
2019-10-10 14:36:05 +00:00
|
|
|
/* ---- HACK ---- */
|
|
|
|
extern int
|
|
|
|
oxr_sdl2_hack_create(void **out_hack);
|
|
|
|
|
|
|
|
extern void
|
2022-05-09 17:19:02 +00:00
|
|
|
oxr_sdl2_hack_start(void *hack, struct xrt_instance *xinst, struct xrt_system_devices *xsysd);
|
2019-10-10 14:36:05 +00:00
|
|
|
|
|
|
|
extern void
|
2019-11-09 12:44:59 +00:00
|
|
|
oxr_sdl2_hack_stop(void **hack_ptr);
|
2019-10-10 14:36:05 +00:00
|
|
|
/* ---- HACK ---- */
|
|
|
|
|
2019-04-05 19:18:03 +00:00
|
|
|
static XrResult
|
|
|
|
oxr_instance_destroy(struct oxr_logger *log, struct oxr_handle_base *hb)
|
|
|
|
{
|
|
|
|
struct oxr_instance *inst = (struct oxr_instance *)hb;
|
|
|
|
|
2020-09-07 13:25:57 +00:00
|
|
|
// Does a null-ptr check.
|
2021-01-12 19:25:16 +00:00
|
|
|
xrt_syscomp_destroy(&inst->system.xsysc);
|
2020-09-07 13:25:57 +00:00
|
|
|
|
2019-08-31 11:49:04 +00:00
|
|
|
u_var_remove_root((void *)inst);
|
|
|
|
|
2019-09-02 21:04:13 +00:00
|
|
|
oxr_binding_destroy_all(log, inst);
|
2019-04-05 12:44:21 +00:00
|
|
|
|
2020-05-27 20:04:58 +00:00
|
|
|
oxr_path_destroy(log, inst);
|
2019-04-05 12:44:21 +00:00
|
|
|
|
2020-05-30 22:44:03 +00:00
|
|
|
u_hashset_destroy(&inst->action_sets.name_store);
|
|
|
|
u_hashset_destroy(&inst->action_sets.loc_store);
|
|
|
|
|
2022-05-09 16:43:00 +00:00
|
|
|
xrt_system_devices_destroy(&inst->system.xsysd);
|
2019-04-05 19:18:03 +00:00
|
|
|
|
2019-10-10 14:36:05 +00:00
|
|
|
/* ---- HACK ---- */
|
2019-11-09 12:44:59 +00:00
|
|
|
oxr_sdl2_hack_stop(&inst->hack);
|
2019-10-10 14:36:05 +00:00
|
|
|
/* ---- HACK ---- */
|
|
|
|
|
2020-04-10 09:53:27 +00:00
|
|
|
xrt_instance_destroy(&inst->xinst);
|
2019-04-05 19:18:03 +00:00
|
|
|
|
2019-11-15 20:30:01 +00:00
|
|
|
// Does null checking and sets to null.
|
|
|
|
time_state_destroy(&inst->timekeeping);
|
2019-04-05 19:18:03 +00:00
|
|
|
|
2020-05-30 12:56:23 +00:00
|
|
|
// Mutex goes last.
|
|
|
|
os_mutex_destroy(&inst->event.mutex);
|
|
|
|
|
2019-04-05 19:18:03 +00:00
|
|
|
free(inst);
|
|
|
|
|
|
|
|
return XR_SUCCESS;
|
|
|
|
}
|
|
|
|
|
2019-05-07 12:47:18 +00:00
|
|
|
static void
|
2021-01-14 14:13:48 +00:00
|
|
|
cache_path(struct oxr_logger *log, struct oxr_instance *inst, const char *str, XrPath *out_path)
|
2019-05-07 12:47:18 +00:00
|
|
|
{
|
|
|
|
oxr_path_get_or_create(log, inst, str, strlen(str), out_path);
|
|
|
|
}
|
|
|
|
|
2021-02-16 17:36:34 +00:00
|
|
|
static bool
|
|
|
|
starts_with(const char *with, const char *string)
|
|
|
|
{
|
2021-02-16 22:45:04 +00:00
|
|
|
assert(with != NULL);
|
|
|
|
|
|
|
|
if (string == NULL) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2021-02-16 17:36:34 +00:00
|
|
|
for (uint32_t i = 0; with[i] != 0; i++) {
|
|
|
|
if (string[i] != with[i]) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2021-11-19 12:40:51 +00:00
|
|
|
static void
|
|
|
|
debug_print_devices(struct oxr_logger *log, struct oxr_system *sys)
|
|
|
|
{
|
|
|
|
struct xrt_device *h = GET_XDEV_BY_ROLE(sys, head);
|
|
|
|
struct xrt_device *l = GET_XDEV_BY_ROLE(sys, left);
|
|
|
|
struct xrt_device *r = GET_XDEV_BY_ROLE(sys, right);
|
|
|
|
|
|
|
|
oxr_log(log, "Selected devices\n\tHead: '%s' (%i)\n\tLeft: '%s' (%i)\n\tRight: '%s' (%i)", //
|
|
|
|
h ? h->str : "<none>", sys->role.head, //
|
|
|
|
l ? l->str : "<none>", sys->role.left, //
|
|
|
|
r ? r->str : "<none>", sys->role.right); //
|
|
|
|
}
|
|
|
|
|
2021-02-16 17:36:34 +00:00
|
|
|
static void
|
|
|
|
detect_engine(struct oxr_logger *log, struct oxr_instance *inst, const XrInstanceCreateInfo *createInfo)
|
|
|
|
{
|
|
|
|
if (starts_with("UnrealEngine4", createInfo->applicationInfo.engineName)) {
|
|
|
|
inst->appinfo.detected.engine.name = "UnrealEngine";
|
|
|
|
inst->appinfo.detected.engine.major = 4;
|
|
|
|
inst->appinfo.detected.engine.minor = (createInfo->applicationInfo.engineVersion >> 16) & 0xffff;
|
|
|
|
inst->appinfo.detected.engine.patch = createInfo->applicationInfo.engineVersion & 0xffff;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (starts_with("UnrealEngine5", createInfo->applicationInfo.engineName)) {
|
|
|
|
inst->appinfo.detected.engine.name = "UnrealEngine";
|
|
|
|
inst->appinfo.detected.engine.major = 5;
|
|
|
|
inst->appinfo.detected.engine.minor = (createInfo->applicationInfo.engineVersion >> 16) & 0xffff;
|
|
|
|
inst->appinfo.detected.engine.patch = createInfo->applicationInfo.engineVersion & 0xffff;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-16 17:52:42 +00:00
|
|
|
static void
|
|
|
|
apply_quirks(struct oxr_logger *log, struct oxr_instance *inst)
|
|
|
|
{
|
2021-03-30 20:17:10 +00:00
|
|
|
#if 0
|
|
|
|
// This is no longer needed.
|
2021-02-16 17:52:42 +00:00
|
|
|
if (starts_with("UnrealEngine", inst->appinfo.detected.engine.name) && //
|
|
|
|
inst->appinfo.detected.engine.major == 4 && //
|
|
|
|
inst->appinfo.detected.engine.minor <= 27 && //
|
|
|
|
inst->appinfo.detected.engine.patch <= 0) {
|
|
|
|
inst->quirks.disable_vulkan_format_depth_stencil = true;
|
|
|
|
}
|
2021-03-30 20:17:10 +00:00
|
|
|
#endif
|
2021-02-16 17:52:42 +00:00
|
|
|
}
|
|
|
|
|
2019-03-18 05:52:32 +00:00
|
|
|
XrResult
|
2022-01-04 18:51:57 +00:00
|
|
|
oxr_instance_create(struct oxr_logger *log,
|
|
|
|
const XrInstanceCreateInfo *createInfo,
|
|
|
|
const struct oxr_extension_status *extensions,
|
|
|
|
struct oxr_instance **out_instance)
|
2019-03-18 05:52:32 +00:00
|
|
|
{
|
2019-04-05 19:18:03 +00:00
|
|
|
struct oxr_instance *inst = NULL;
|
2022-04-12 21:20:11 +00:00
|
|
|
int m_ret;
|
|
|
|
int h_ret;
|
2020-08-06 13:05:27 +00:00
|
|
|
xrt_result_t xret;
|
2019-11-09 12:41:43 +00:00
|
|
|
XrResult ret;
|
2019-04-05 12:44:21 +00:00
|
|
|
|
2021-01-14 14:13:48 +00:00
|
|
|
OXR_ALLOCATE_HANDLE_OR_RETURN(log, inst, OXR_XR_DEBUG_INSTANCE, oxr_instance_destroy, NULL);
|
2019-04-05 19:18:03 +00:00
|
|
|
|
2019-10-22 10:47:25 +00:00
|
|
|
inst->lifecycle_verbose = debug_get_bool_option_lifecycle_verbose();
|
|
|
|
inst->debug_spaces = debug_get_bool_option_debug_spaces();
|
|
|
|
inst->debug_views = debug_get_bool_option_debug_views();
|
|
|
|
inst->debug_bindings = debug_get_bool_option_debug_bindings();
|
|
|
|
|
2020-05-30 12:56:23 +00:00
|
|
|
m_ret = os_mutex_init(&inst->event.mutex);
|
|
|
|
if (m_ret < 0) {
|
2021-01-14 14:13:48 +00:00
|
|
|
ret = oxr_error(log, XR_ERROR_RUNTIME_FAILURE, "Failed to init mutex");
|
2020-05-30 12:56:23 +00:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2019-10-10 14:36:05 +00:00
|
|
|
/* ---- HACK ---- */
|
|
|
|
oxr_sdl2_hack_create(&inst->hack);
|
|
|
|
/* ---- HACK ---- */
|
|
|
|
|
2020-05-27 20:04:58 +00:00
|
|
|
ret = oxr_path_init(log, inst);
|
|
|
|
if (ret != XR_SUCCESS) {
|
2020-05-30 12:56:23 +00:00
|
|
|
return ret;
|
2019-04-05 12:44:21 +00:00
|
|
|
}
|
|
|
|
|
2020-05-30 22:44:03 +00:00
|
|
|
h_ret = u_hashset_create(&inst->action_sets.name_store);
|
|
|
|
if (h_ret != 0) {
|
|
|
|
oxr_instance_destroy(log, &inst->handle);
|
2021-01-14 14:13:48 +00:00
|
|
|
return oxr_error(log, XR_ERROR_RUNTIME_FAILURE, "Failed to create name_store hashset");
|
2020-05-30 22:44:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
h_ret = u_hashset_create(&inst->action_sets.loc_store);
|
|
|
|
if (h_ret != 0) {
|
|
|
|
oxr_instance_destroy(log, &inst->handle);
|
2021-01-14 14:13:48 +00:00
|
|
|
return oxr_error(log, XR_ERROR_RUNTIME_FAILURE, "Failed to create loc_store hashset");
|
2020-05-30 22:44:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-05-07 12:47:18 +00:00
|
|
|
// Cache certain often looked up paths.
|
2020-07-20 19:53:52 +00:00
|
|
|
|
|
|
|
|
2021-01-14 14:13:48 +00:00
|
|
|
#define CACHE_SUBACTION_PATHS(NAME, NAME_CAPS, PATH) cache_path(log, inst, PATH, &inst->path_cache.NAME);
|
2020-07-20 19:53:52 +00:00
|
|
|
OXR_FOR_EACH_SUBACTION_PATH_DETAILED(CACHE_SUBACTION_PATHS)
|
|
|
|
|
|
|
|
#undef CACHE_SUBACTION_PATHS
|
2019-09-02 21:04:13 +00:00
|
|
|
// clang-format off
|
2020-07-20 19:53:52 +00:00
|
|
|
|
2019-09-02 21:04:13 +00:00
|
|
|
cache_path(log, inst, "/interaction_profiles/khr/simple_controller", &inst->path_cache.khr_simple_controller);
|
|
|
|
cache_path(log, inst, "/interaction_profiles/google/daydream_controller", &inst->path_cache.google_daydream_controller);
|
|
|
|
cache_path(log, inst, "/interaction_profiles/htc/vive_controller", &inst->path_cache.htc_vive_controller);
|
|
|
|
cache_path(log, inst, "/interaction_profiles/htc/vive_pro", &inst->path_cache.htc_vive_pro);
|
|
|
|
cache_path(log, inst, "/interaction_profiles/microsoft/motion_controller", &inst->path_cache.microsoft_motion_controller);
|
|
|
|
cache_path(log, inst, "/interaction_profiles/microsoft/xbox_controller", &inst->path_cache.microsoft_xbox_controller);
|
|
|
|
cache_path(log, inst, "/interaction_profiles/oculus/go_controller", &inst->path_cache.oculus_go_controller);
|
|
|
|
cache_path(log, inst, "/interaction_profiles/oculus/touch_controller", &inst->path_cache.oculus_touch_controller);
|
|
|
|
cache_path(log, inst, "/interaction_profiles/valve/index_controller", &inst->path_cache.valve_index_controller);
|
2020-07-06 10:31:38 +00:00
|
|
|
cache_path(log, inst, "/interaction_profiles/mndx/ball_on_a_stick_controller", &inst->path_cache.mndx_ball_on_a_stick_controller);
|
2021-04-01 21:54:17 +00:00
|
|
|
cache_path(log, inst, "/interaction_profiles/microsoft/hand_interaction", &inst->path_cache.msft_hand_interaction);
|
|
|
|
|
2019-09-02 21:04:13 +00:00
|
|
|
// clang-format on
|
2019-05-07 12:47:18 +00:00
|
|
|
|
2020-06-17 06:36:38 +00:00
|
|
|
// fill in our application info - @todo - replicate all createInfo
|
|
|
|
// fields?
|
|
|
|
|
|
|
|
struct xrt_instance_info i_info = {0};
|
2021-01-14 14:13:48 +00:00
|
|
|
snprintf(i_info.application_name, sizeof(inst->xinst->instance_info.application_name), "%s",
|
2020-06-17 06:36:38 +00:00
|
|
|
createInfo->applicationInfo.applicationName);
|
|
|
|
|
2020-08-18 20:33:21 +00:00
|
|
|
#ifdef XRT_OS_ANDROID
|
2021-01-14 14:13:48 +00:00
|
|
|
XrInstanceCreateInfoAndroidKHR const *create_info_android = OXR_GET_INPUT_FROM_CHAIN(
|
|
|
|
createInfo, XR_TYPE_INSTANCE_CREATE_INFO_ANDROID_KHR, XrInstanceCreateInfoAndroidKHR);
|
|
|
|
android_globals_store_vm_and_activity((struct _JavaVM *)create_info_android->applicationVM,
|
|
|
|
create_info_android->applicationActivity);
|
2021-11-30 12:49:58 +00:00
|
|
|
// Trick to avoid deadlock on main thread. Only works for NativeActivity with app-glue.
|
|
|
|
android_looper_poll_until_activity_resumed();
|
2020-08-18 20:33:21 +00:00
|
|
|
#endif
|
|
|
|
|
2022-05-17 17:45:53 +00:00
|
|
|
xret = xrt_instance_create(&i_info, &inst->xinst);
|
|
|
|
if (xret != XRT_SUCCESS) {
|
2021-01-14 14:13:48 +00:00
|
|
|
ret = oxr_error(log, XR_ERROR_RUNTIME_FAILURE, "Failed to create prober");
|
2019-11-09 12:41:43 +00:00
|
|
|
oxr_instance_destroy(log, &inst->handle);
|
|
|
|
return ret;
|
2019-05-07 12:47:18 +00:00
|
|
|
}
|
|
|
|
|
2022-05-09 16:43:00 +00:00
|
|
|
struct oxr_system *sys = &inst->system;
|
|
|
|
|
|
|
|
// Create the compositor if we are not headless.
|
|
|
|
if (!inst->extensions.MND_headless) {
|
|
|
|
xret = xrt_instance_create_system(inst->xinst, &sys->xsysd, &sys->xsysc);
|
|
|
|
} else {
|
|
|
|
xret = xrt_instance_create_system(inst->xinst, &sys->xsysd, NULL);
|
|
|
|
}
|
2019-05-07 12:47:18 +00:00
|
|
|
|
2022-05-09 16:43:00 +00:00
|
|
|
if (xret != XRT_SUCCESS) {
|
|
|
|
ret = oxr_error(log, XR_ERROR_INITIALIZATION_FAILED, "Failed to create the system '%i'", xret);
|
2019-11-09 12:41:43 +00:00
|
|
|
oxr_instance_destroy(log, &inst->handle);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2022-05-09 16:43:00 +00:00
|
|
|
ret = XR_SUCCESS;
|
|
|
|
if (sys->xsysd == NULL) {
|
|
|
|
ret = oxr_error(log, XR_ERROR_RUNTIME_FAILURE, "Huh?! Field sys->xsysd was NULL?");
|
|
|
|
} else if (!inst->extensions.MND_headless && sys->xsysc == NULL) {
|
|
|
|
ret = oxr_error(log, XR_ERROR_RUNTIME_FAILURE, "Huh?! Field sys->xsysc was NULL?");
|
|
|
|
} else if (inst->extensions.MND_headless && sys->xsysc != NULL) {
|
|
|
|
ret = oxr_error(log, XR_ERROR_RUNTIME_FAILURE, "Huh?! Field sys->xsysc was not NULL?");
|
2020-07-07 00:14:29 +00:00
|
|
|
}
|
|
|
|
|
2022-05-09 16:43:00 +00:00
|
|
|
if (ret != XR_SUCCESS) {
|
|
|
|
oxr_instance_destroy(log, &inst->handle);
|
|
|
|
return ret;
|
|
|
|
}
|
2020-07-07 00:14:29 +00:00
|
|
|
|
2019-11-09 12:41:43 +00:00
|
|
|
// Did we find any HMD
|
|
|
|
// @todo Headless with only controllers?
|
2020-07-07 00:14:29 +00:00
|
|
|
struct xrt_device *dev = GET_XDEV_BY_ROLE(sys, head);
|
|
|
|
if (dev == NULL) {
|
2021-01-14 14:13:48 +00:00
|
|
|
ret = oxr_error(log, XR_ERROR_RUNTIME_FAILURE, "Failed to find any HMD device");
|
2019-11-09 12:41:43 +00:00
|
|
|
oxr_instance_destroy(log, &inst->handle);
|
|
|
|
return ret;
|
2019-05-07 12:47:18 +00:00
|
|
|
}
|
2019-03-18 05:52:32 +00:00
|
|
|
|
2021-01-14 14:13:48 +00:00
|
|
|
struct xrt_vec3 global_tracking_origin_offset = {debug_get_float_option_tracking_origin_offset_x(),
|
|
|
|
debug_get_float_option_tracking_origin_offset_y(),
|
|
|
|
debug_get_float_option_tracking_origin_offset_z()};
|
2020-12-25 22:28:13 +00:00
|
|
|
|
2021-01-14 14:13:48 +00:00
|
|
|
u_device_setup_tracking_origins(dev, GET_XDEV_BY_ROLE(sys, left), GET_XDEV_BY_ROLE(sys, right),
|
2020-12-25 22:28:13 +00:00
|
|
|
&global_tracking_origin_offset);
|
2020-11-08 23:30:30 +00:00
|
|
|
|
2022-01-04 18:51:57 +00:00
|
|
|
// Sets the enabled extensions, this is where we should do any extra validation.
|
|
|
|
inst->extensions = *extensions;
|
2019-03-23 01:11:14 +00:00
|
|
|
|
2020-08-06 13:05:27 +00:00
|
|
|
ret = oxr_system_fill_in(log, inst, 1, &inst->system);
|
|
|
|
if (ret != XR_SUCCESS) {
|
|
|
|
oxr_instance_destroy(log, &inst->handle);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
inst->timekeeping = time_state_create();
|
|
|
|
|
2019-03-18 05:52:32 +00:00
|
|
|
//! @todo check if this (and other creates) failed?
|
|
|
|
|
2021-02-16 17:36:34 +00:00
|
|
|
// Detect game engine.
|
|
|
|
detect_engine(log, inst, createInfo);
|
|
|
|
|
2021-02-16 17:52:42 +00:00
|
|
|
// Apply any quirks
|
|
|
|
apply_quirks(log, inst);
|
|
|
|
|
2019-08-31 11:49:04 +00:00
|
|
|
u_var_add_root((void *)inst, "XrInstance", true);
|
|
|
|
|
2019-10-10 14:36:05 +00:00
|
|
|
/* ---- HACK ---- */
|
2022-05-09 17:19:02 +00:00
|
|
|
oxr_sdl2_hack_start(inst->hack, inst->xinst, sys->xsysd);
|
2019-10-10 14:36:05 +00:00
|
|
|
/* ---- HACK ---- */
|
|
|
|
|
2021-02-16 16:32:58 +00:00
|
|
|
oxr_log(log,
|
|
|
|
"Instance created\n"
|
2021-02-16 17:36:34 +00:00
|
|
|
"\tcreateInfo->applicationInfo.applicationName: %s\n"
|
|
|
|
"\tcreateInfo->applicationInfo.applicationVersion: %i\n"
|
|
|
|
"\tcreateInfo->applicationInfo.engineName: %s\n"
|
|
|
|
"\tcreateInfo->applicationInfo.engineVersion: %i\n"
|
|
|
|
"\tappinfo.detected.engine.name: %s\n"
|
2021-02-16 17:52:42 +00:00
|
|
|
"\tappinfo.detected.engine.version: %i.%i.%i\n"
|
|
|
|
"\tquirks.disable_vulkan_format_depth_stencil: %s",
|
|
|
|
createInfo->applicationInfo.applicationName, //
|
|
|
|
createInfo->applicationInfo.applicationVersion, //
|
|
|
|
createInfo->applicationInfo.engineName, //
|
|
|
|
createInfo->applicationInfo.engineVersion, //
|
|
|
|
inst->appinfo.detected.engine.name, //
|
|
|
|
inst->appinfo.detected.engine.major, //
|
|
|
|
inst->appinfo.detected.engine.minor, //
|
|
|
|
inst->appinfo.detected.engine.patch, //
|
|
|
|
inst->quirks.disable_vulkan_format_depth_stencil ? "true" : "false"); //
|
2021-02-16 16:32:58 +00:00
|
|
|
|
2021-11-19 12:40:51 +00:00
|
|
|
debug_print_devices(log, sys);
|
|
|
|
|
2022-02-18 01:13:32 +00:00
|
|
|
|
|
|
|
#ifdef XRT_FEATURE_RENDERDOC
|
|
|
|
|
|
|
|
#ifdef XRT_OS_LINUX
|
|
|
|
void *mod = dlopen("librenderdoc.so", RTLD_NOW | RTLD_NOLOAD);
|
|
|
|
if (mod) {
|
|
|
|
pRENDERDOC_GetAPI RENDERDOC_GetAPI = (pRENDERDOC_GetAPI)dlsym(mod, "RENDERDOC_GetAPI");
|
2022-05-22 18:55:31 +00:00
|
|
|
XRT_MAYBE_UNUSED int ret = RENDERDOC_GetAPI(eRENDERDOC_API_Version_1_5_0, (void **)&inst->rdoc_api);
|
2022-02-18 01:13:32 +00:00
|
|
|
assert(ret == 1);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#ifdef XRT_OS_ANDROID
|
|
|
|
void *mod = dlopen("libVkLayer_GLES_RenderDoc.so", RTLD_NOW | RTLD_NOLOAD);
|
|
|
|
if (mod) {
|
|
|
|
pRENDERDOC_GetAPI RENDERDOC_GetAPI = (pRENDERDOC_GetAPI)dlsym(mod, "RENDERDOC_GetAPI");
|
|
|
|
int ret = RENDERDOC_GetAPI(eRENDERDOC_API_Version_1_5_0, (void **)&inst->rdoc_api);
|
|
|
|
assert(ret == 1);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#ifdef XRT_OS_WINDOWS
|
|
|
|
HMODULE mod = GetModuleHandleA("renderdoc.dll");
|
|
|
|
if (mod) {
|
|
|
|
pRENDERDOC_GetAPI RENDERDOC_GetAPI = (pRENDERDOC_GetAPI)GetProcAddress(mod, "RENDERDOC_GetAPI");
|
2022-05-04 23:18:54 +00:00
|
|
|
int ret = RENDERDOC_GetAPI(eRENDERDOC_API_Version_1_5_0, (void **)&inst->rdoc_api);
|
2022-02-18 01:13:32 +00:00
|
|
|
assert(ret == 1);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2019-03-18 05:52:32 +00:00
|
|
|
*out_instance = inst;
|
|
|
|
|
|
|
|
return XR_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
XrResult
|
2021-01-14 14:13:48 +00:00
|
|
|
oxr_instance_get_properties(struct oxr_logger *log, struct oxr_instance *inst, XrInstanceProperties *instanceProperties)
|
2019-03-18 05:52:32 +00:00
|
|
|
{
|
2021-01-28 15:47:56 +00:00
|
|
|
instanceProperties->runtimeVersion = XR_MAKE_VERSION(21, 0, 0);
|
2021-01-14 14:13:48 +00:00
|
|
|
snprintf(instanceProperties->runtimeName, XR_MAX_RUNTIME_NAME_SIZE - 1, "Monado(XRT) by Collabora et al '%s'",
|
|
|
|
u_git_tag);
|
2019-03-18 05:52:32 +00:00
|
|
|
|
|
|
|
return XR_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef XR_USE_TIMESPEC
|
|
|
|
|
|
|
|
XrResult
|
|
|
|
oxr_instance_convert_time_to_timespec(struct oxr_logger *log,
|
|
|
|
struct oxr_instance *inst,
|
|
|
|
XrTime time,
|
|
|
|
struct timespec *timespecTime)
|
|
|
|
{
|
|
|
|
time_state_to_timespec(inst->timekeeping, time, timespecTime);
|
|
|
|
return XR_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
XrResult
|
|
|
|
oxr_instance_convert_timespec_to_time(struct oxr_logger *log,
|
|
|
|
struct oxr_instance *inst,
|
|
|
|
const struct timespec *timespecTime,
|
|
|
|
XrTime *time)
|
|
|
|
{
|
|
|
|
*time = time_state_from_timespec(inst->timekeeping, timespecTime);
|
|
|
|
return XR_SUCCESS;
|
|
|
|
}
|
|
|
|
#endif // XR_USE_TIMESPEC
|
2022-04-27 03:06:59 +00:00
|
|
|
|
|
|
|
#ifdef XR_USE_PLATFORM_WIN32
|
|
|
|
|
|
|
|
XrResult
|
|
|
|
oxr_instance_convert_time_to_win32perfcounter(struct oxr_logger *log,
|
|
|
|
struct oxr_instance *inst,
|
|
|
|
XrTime time,
|
|
|
|
LARGE_INTEGER *win32perfcounterTime)
|
|
|
|
{
|
|
|
|
time_state_to_win32perfcounter(inst->timekeeping, time, win32perfcounterTime);
|
|
|
|
return XR_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
XrResult
|
|
|
|
oxr_instance_convert_win32perfcounter_to_time(struct oxr_logger *log,
|
|
|
|
struct oxr_instance *inst,
|
|
|
|
const LARGE_INTEGER *win32perfcounterTime,
|
|
|
|
XrTime *time)
|
|
|
|
{
|
|
|
|
*time = time_state_from_win32perfcounter(inst->timekeeping, win32perfcounterTime);
|
|
|
|
return XR_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif // XR_USE_PLATFORM_WIN32
|