|
|
|
|
@@ -13,7 +13,6 @@ GLuint LunarWM_xr_get_swapchain_image(
|
|
|
|
|
return wm->xr.swapchain_images[swapchain_images_i].a_imgs[index].image;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool LunarWM_xr_init(LunarWM *this)
|
|
|
|
|
{
|
|
|
|
|
XrResult res = XR_SUCCESS;
|
|
|
|
|
@@ -28,12 +27,15 @@ bool LunarWM_xr_init(LunarWM *this)
|
|
|
|
|
strncpy(
|
|
|
|
|
(char *)app_info.engineName, "LunarWM Engine", XR_MAX_ENGINE_NAME_SIZE);
|
|
|
|
|
|
|
|
|
|
char const *instance_extensions[] = {
|
|
|
|
|
char const *required_instance_extensions[] = {
|
|
|
|
|
XR_EXT_DEBUG_UTILS_EXTENSION_NAME,
|
|
|
|
|
XR_MNDX_EGL_ENABLE_EXTENSION_NAME,
|
|
|
|
|
XR_KHR_OPENGL_ES_ENABLE_EXTENSION_NAME,
|
|
|
|
|
};
|
|
|
|
|
char const *optional_instance_extensions[] = {
|
|
|
|
|
XR_EXT_HAND_TRACKING_EXTENSION_NAME,
|
|
|
|
|
};
|
|
|
|
|
bool hand_tracking_ext_available = false;
|
|
|
|
|
char const **v_active_instance_extensions = vector_create();
|
|
|
|
|
|
|
|
|
|
uint32_t extension_properties_count = 0;
|
|
|
|
|
@@ -61,8 +63,9 @@ bool LunarWM_xr_init(LunarWM *this)
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < ARRAY_SZ(instance_extensions); i++) {
|
|
|
|
|
char const *requested_instance_extension = instance_extensions[i];
|
|
|
|
|
for (size_t i = 0; i < ARRAY_SZ(required_instance_extensions); i++) {
|
|
|
|
|
char const *requested_instance_extension
|
|
|
|
|
= required_instance_extensions[i];
|
|
|
|
|
bool found = false;
|
|
|
|
|
for (int j = 0; j < extension_properties_count; j++) {
|
|
|
|
|
if (strcmp(requested_instance_extension,
|
|
|
|
|
@@ -84,6 +87,33 @@ bool LunarWM_xr_init(LunarWM *this)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < ARRAY_SZ(optional_instance_extensions); i++) {
|
|
|
|
|
char const *requested_instance_extension
|
|
|
|
|
= optional_instance_extensions[i];
|
|
|
|
|
bool found = false;
|
|
|
|
|
for (int j = 0; j < extension_properties_count; j++) {
|
|
|
|
|
if (strcmp(requested_instance_extension,
|
|
|
|
|
extension_properties[j].extensionName)
|
|
|
|
|
!= 0) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
vector_add(
|
|
|
|
|
&v_active_instance_extensions, requested_instance_extension);
|
|
|
|
|
found = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!found) {
|
|
|
|
|
wlr_log(WLR_INFO, "Optional OpenXR instance extension missing: %s",
|
|
|
|
|
requested_instance_extension);
|
|
|
|
|
} else if (strcmp(requested_instance_extension,
|
|
|
|
|
XR_EXT_HAND_TRACKING_EXTENSION_NAME)
|
|
|
|
|
== 0) {
|
|
|
|
|
hand_tracking_ext_available = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
XrInstanceCreateInfo const ci = {
|
|
|
|
|
.type = XR_TYPE_INSTANCE_CREATE_INFO,
|
|
|
|
|
@@ -104,26 +134,45 @@ bool LunarWM_xr_init(LunarWM *this)
|
|
|
|
|
}
|
|
|
|
|
this->xr.instance = instance;
|
|
|
|
|
|
|
|
|
|
res = xrGetInstanceProcAddr(this->xr.instance, "xrCreateHandTrackerEXT",
|
|
|
|
|
this->xr.CreateHandTrackerEXT = NULL;
|
|
|
|
|
this->xr.DestroyHandTrackerEXT = NULL;
|
|
|
|
|
this->xr.LocateHandJointsEXT = NULL;
|
|
|
|
|
|
|
|
|
|
if (hand_tracking_ext_available) {
|
|
|
|
|
res = xrGetInstanceProcAddr(this->xr.instance,
|
|
|
|
|
"xrCreateHandTrackerEXT",
|
|
|
|
|
(PFN_xrVoidFunction *)&this->xr.CreateHandTrackerEXT);
|
|
|
|
|
if (res != XR_SUCCESS) {
|
|
|
|
|
wlr_log(
|
|
|
|
|
WLR_ERROR, "Failed to get proc addr xrCreateHandTrackerEXT");
|
|
|
|
|
return false;
|
|
|
|
|
wlr_log(WLR_ERROR,
|
|
|
|
|
"Failed to get proc addr xrCreateHandTrackerEXT "
|
|
|
|
|
"(optional): %d",
|
|
|
|
|
res);
|
|
|
|
|
hand_tracking_ext_available = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (hand_tracking_ext_available) {
|
|
|
|
|
res = xrGetInstanceProcAddr(this->xr.instance,
|
|
|
|
|
"xrDestroyHandTrackerEXT",
|
|
|
|
|
(PFN_xrVoidFunction *)&this->xr.DestroyHandTrackerEXT);
|
|
|
|
|
if (res != XR_SUCCESS) {
|
|
|
|
|
wlr_log(
|
|
|
|
|
WLR_ERROR, "Failed to get proc addr xrDestroyHandTrackerEXT");
|
|
|
|
|
return false;
|
|
|
|
|
wlr_log(WLR_ERROR,
|
|
|
|
|
"Failed to get proc addr xrDestroyHandTrackerEXT "
|
|
|
|
|
"(optional): %d",
|
|
|
|
|
res);
|
|
|
|
|
hand_tracking_ext_available = false;
|
|
|
|
|
}
|
|
|
|
|
res = xrGetInstanceProcAddr(this->xr.instance, "xrLocateHandJointsEXT",
|
|
|
|
|
}
|
|
|
|
|
if (hand_tracking_ext_available) {
|
|
|
|
|
res = xrGetInstanceProcAddr(this->xr.instance,
|
|
|
|
|
"xrLocateHandJointsEXT",
|
|
|
|
|
(PFN_xrVoidFunction *)&this->xr.LocateHandJointsEXT);
|
|
|
|
|
if (res != XR_SUCCESS) {
|
|
|
|
|
wlr_log(WLR_ERROR, "Failed to get proc addr xrLocateHandJointsEXT");
|
|
|
|
|
return false;
|
|
|
|
|
wlr_log(WLR_ERROR,
|
|
|
|
|
"Failed to get proc addr xrLocateHandJointsEXT (optional): "
|
|
|
|
|
"%d",
|
|
|
|
|
res);
|
|
|
|
|
hand_tracking_ext_available = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -155,9 +204,12 @@ bool LunarWM_xr_init(LunarWM *this)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
this->xr.hand_tracking_enabled = hand_tracking_ext_available;
|
|
|
|
|
XrSystemProperties system_props = {
|
|
|
|
|
.type = XR_TYPE_SYSTEM_PROPERTIES,
|
|
|
|
|
.next = &this->xr.hand_tracking_system_properties,
|
|
|
|
|
.next = this->xr.hand_tracking_enabled
|
|
|
|
|
? &this->xr.hand_tracking_system_properties
|
|
|
|
|
: NULL,
|
|
|
|
|
};
|
|
|
|
|
res = xrGetSystemProperties(
|
|
|
|
|
this->xr.instance, this->xr.system_id, &system_props);
|
|
|
|
|
@@ -165,6 +217,13 @@ bool LunarWM_xr_init(LunarWM *this)
|
|
|
|
|
wlr_log(WLR_ERROR, "xrGetSystemProperties failed: %d", res);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (this->xr.hand_tracking_enabled
|
|
|
|
|
&& !this->xr.hand_tracking_system_properties.supportsHandTracking) {
|
|
|
|
|
wlr_log(WLR_INFO,
|
|
|
|
|
"Hand tracking extension present but system does not support "
|
|
|
|
|
"it");
|
|
|
|
|
this->xr.hand_tracking_enabled = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
XrGraphicsRequirementsOpenGLESKHR reqs = {
|
|
|
|
|
@@ -609,7 +668,8 @@ bool LunarWM_xr_init(LunarWM *this)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{ // Create hand trackers
|
|
|
|
|
if (this->xr.hand_tracking_enabled && this->xr.CreateHandTrackerEXT) {
|
|
|
|
|
bool hand_trackers_created = true;
|
|
|
|
|
for (size_t i = 0; i < 2; i++) {
|
|
|
|
|
auto *hand = &this->xr.hands[i];
|
|
|
|
|
|
|
|
|
|
@@ -623,9 +683,29 @@ bool LunarWM_xr_init(LunarWM *this)
|
|
|
|
|
this->xr.session, &ci, &hand->hand_tracker);
|
|
|
|
|
if (res != XR_SUCCESS) {
|
|
|
|
|
wlr_log(WLR_ERROR, "Failed to create hand tracker: %d", res);
|
|
|
|
|
return false;
|
|
|
|
|
hand_trackers_created = false;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!hand_trackers_created) {
|
|
|
|
|
if (this->xr.DestroyHandTrackerEXT) {
|
|
|
|
|
for (size_t i = 0; i < 2; i++) {
|
|
|
|
|
auto *hand = &this->xr.hands[i];
|
|
|
|
|
if (hand->hand_tracker != XR_NULL_HANDLE) {
|
|
|
|
|
this->xr.DestroyHandTrackerEXT(hand->hand_tracker);
|
|
|
|
|
hand->hand_tracker = XR_NULL_HANDLE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
this->xr.hand_tracking_enabled = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!this->xr.hand_tracking_enabled) {
|
|
|
|
|
for (size_t i = 0; i < 2; i++) {
|
|
|
|
|
this->xr.hands[i].hand_tracker = XR_NULL_HANDLE;
|
|
|
|
|
}
|
|
|
|
|
this->xr.hand_tracking_system_properties.supportsHandTracking
|
|
|
|
|
= XR_FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
free(extension_properties);
|
|
|
|
|
|