@@ -8,7 +8,6 @@
|
||||
#include "vec.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <math.h>
|
||||
#include <spawn.h>
|
||||
#include <stdlib.h>
|
||||
@@ -199,10 +198,10 @@ bool LunarWM_init(LunarWM *wm)
|
||||
config_manager_reload(wm->cman);
|
||||
}
|
||||
|
||||
if (getenv("DISPLAY") != NULL || getenv("WAYLAND_DISPLAY") != NULL) {
|
||||
wlr_log(WLR_ERROR, "This compositor can only be ran in DRM mode.");
|
||||
return false;
|
||||
}
|
||||
// if (getenv("DISPLAY") != NULL || getenv("WAYLAND_DISPLAY") != NULL) {
|
||||
// wlr_log(WLR_ERROR, "This compositor can only be ran in DRM mode.");
|
||||
// return false;
|
||||
// }
|
||||
|
||||
if (!LunarWM_wayland_init(wm)) {
|
||||
wlr_log(WLR_ERROR, "Failed to initialize wlroots");
|
||||
@@ -219,8 +218,11 @@ bool LunarWM_init(LunarWM *wm)
|
||||
}
|
||||
|
||||
if (!LunarWM_xr_init(wm)) {
|
||||
wlr_log(WLR_ERROR, "Failed to initialize OpenXR");
|
||||
return false;
|
||||
wlr_log(WLR_ERROR, "Failed to initialize OpenXR! Disabling XR...");
|
||||
wm->xr.available = false;
|
||||
LunarWM_xr_cleanup(wm);
|
||||
} else {
|
||||
wm->xr.available = true;
|
||||
}
|
||||
|
||||
wlr_log(WLR_INFO, "OpenGL ES version: %s", glGetString(GL_VERSION));
|
||||
@@ -315,101 +317,110 @@ void LunarWM_run(LunarWM *wm)
|
||||
WindowShouldClose();
|
||||
BeginDrawing();
|
||||
|
||||
LunarWM_xr_poll_events(wm);
|
||||
if (wm->xr.available) {
|
||||
LunarWM_xr_poll_events(wm);
|
||||
|
||||
if (!wm->xr.session_running) {
|
||||
EndDrawing();
|
||||
continue;
|
||||
}
|
||||
|
||||
XrFrameState frame_state = {
|
||||
.type = XR_TYPE_FRAME_STATE,
|
||||
};
|
||||
XrFrameWaitInfo frame_wait_info = {
|
||||
.type = XR_TYPE_FRAME_WAIT_INFO,
|
||||
};
|
||||
if (xrWaitFrame(wm->xr.session, &frame_wait_info, &frame_state)
|
||||
!= XR_SUCCESS) {
|
||||
wlr_log(WLR_ERROR, "Failed to wait for OpenXR frame");
|
||||
return;
|
||||
}
|
||||
|
||||
XrFrameBeginInfo frame_begin_info = {
|
||||
.type = XR_TYPE_FRAME_BEGIN_INFO,
|
||||
};
|
||||
XrResult res = xrBeginFrame(wm->xr.session, &frame_begin_info);
|
||||
if (res != XR_FRAME_DISCARDED && res != XR_SUCCESS) {
|
||||
wlr_log(WLR_ERROR, "Failed to begin the OpenXR Frame: %d", res);
|
||||
return;
|
||||
}
|
||||
|
||||
if (wm->xr.hand_tracking_enabled) {
|
||||
for (size_t i = 0; i < 2; i++) {
|
||||
LunarWM_Hand *hand = &wm->xr.hands[i];
|
||||
bool const unobstructed = true;
|
||||
if (!wm->xr.LocateHandJointsEXT
|
||||
|| hand->hand_tracker == XR_NULL_HANDLE) {
|
||||
continue;
|
||||
}
|
||||
|
||||
XrHandJointsMotionRangeInfoEXT mri = {
|
||||
.type = XR_TYPE_HAND_JOINTS_MOTION_RANGE_INFO_EXT,
|
||||
};
|
||||
mri.handJointsMotionRange = unobstructed
|
||||
? XR_HAND_JOINTS_MOTION_RANGE_UNOBSTRUCTED_EXT
|
||||
: XR_HAND_JOINTS_MOTION_RANGE_CONFORMING_TO_CONTROLLER_EXT;
|
||||
|
||||
XrHandJointsLocateInfoEXT li = {
|
||||
.type = XR_TYPE_HAND_JOINTS_LOCATE_INFO_EXT,
|
||||
.next = &mri,
|
||||
.baseSpace = wm->xr.local_space,
|
||||
.time = frame_state.predictedDisplayTime,
|
||||
};
|
||||
|
||||
XrHandJointLocationsEXT hji = {
|
||||
.type = XR_TYPE_HAND_JOINT_LOCATIONS_EXT,
|
||||
.jointCount = XR_HAND_JOINT_COUNT_EXT,
|
||||
.jointLocations = hand->joint_locations,
|
||||
};
|
||||
|
||||
if (wm->xr.LocateHandJointsEXT(
|
||||
hand->hand_tracker, &li, &hji)
|
||||
!= XR_SUCCESS) {
|
||||
wlr_log(WLR_ERROR, "Failed to locate hand joints");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LunarWM_RenderLayerInfo render_layer_info = {
|
||||
.predicted_display_time = frame_state.predictedDisplayTime,
|
||||
.layer_projection.type = XR_TYPE_COMPOSITION_LAYER_PROJECTION,
|
||||
};
|
||||
bool const session_active
|
||||
= (wm->xr.session_state == XR_SESSION_STATE_SYNCHRONIZED)
|
||||
|| (wm->xr.session_state == XR_SESSION_STATE_VISIBLE)
|
||||
|| (wm->xr.session_state == XR_SESSION_STATE_FOCUSED);
|
||||
if (session_active && (frame_state.shouldRender != 0u)) {
|
||||
bool rendered
|
||||
= LunarWM_render_layer(wm, &render_layer_info, dt);
|
||||
if (rendered) {
|
||||
render_layer_info.layers[render_layer_info.layers_count]
|
||||
= (XrCompositionLayerBaseHeader *)&render_layer_info
|
||||
.layer_projection;
|
||||
}
|
||||
}
|
||||
|
||||
XrFrameEndInfo frame_end_info = {
|
||||
.type = XR_TYPE_FRAME_END_INFO,
|
||||
.displayTime = frame_state.predictedDisplayTime,
|
||||
.environmentBlendMode = wm->xr.environment_blend_mode,
|
||||
.layerCount = render_layer_info.layers_count,
|
||||
.layers = (XrCompositionLayerBaseHeader const **)
|
||||
render_layer_info.layers,
|
||||
};
|
||||
if (xrEndFrame(wm->xr.session, &frame_end_info) != XR_SUCCESS) {
|
||||
wlr_log(WLR_ERROR, "Failed to end OpenXR frame");
|
||||
return;
|
||||
}
|
||||
|
||||
EndDrawing();
|
||||
} else {
|
||||
|
||||
ClearBackground(RED);
|
||||
|
||||
if (!wm->xr.session_running) {
|
||||
EndDrawing();
|
||||
continue;
|
||||
}
|
||||
|
||||
XrFrameState frame_state = {
|
||||
.type = XR_TYPE_FRAME_STATE,
|
||||
};
|
||||
XrFrameWaitInfo frame_wait_info = {
|
||||
.type = XR_TYPE_FRAME_WAIT_INFO,
|
||||
};
|
||||
if (xrWaitFrame(wm->xr.session, &frame_wait_info, &frame_state)
|
||||
!= XR_SUCCESS) {
|
||||
wlr_log(WLR_ERROR, "Failed to wait for OpenXR frame");
|
||||
return;
|
||||
}
|
||||
|
||||
XrFrameBeginInfo frame_begin_info = {
|
||||
.type = XR_TYPE_FRAME_BEGIN_INFO,
|
||||
};
|
||||
XrResult res = xrBeginFrame(wm->xr.session, &frame_begin_info);
|
||||
if (res != XR_FRAME_DISCARDED && res != XR_SUCCESS) {
|
||||
wlr_log(WLR_ERROR, "Failed to begin the OpenXR Frame: %d", res);
|
||||
return;
|
||||
}
|
||||
|
||||
if (wm->xr.hand_tracking_enabled) {
|
||||
for (size_t i = 0; i < 2; i++) {
|
||||
LunarWM_Hand *hand = &wm->xr.hands[i];
|
||||
bool const unobstructed = true;
|
||||
if (!wm->xr.LocateHandJointsEXT
|
||||
|| hand->hand_tracker == XR_NULL_HANDLE) {
|
||||
continue;
|
||||
}
|
||||
|
||||
XrHandJointsMotionRangeInfoEXT mri = {
|
||||
.type = XR_TYPE_HAND_JOINTS_MOTION_RANGE_INFO_EXT,
|
||||
};
|
||||
mri.handJointsMotionRange = unobstructed
|
||||
? XR_HAND_JOINTS_MOTION_RANGE_UNOBSTRUCTED_EXT
|
||||
: XR_HAND_JOINTS_MOTION_RANGE_CONFORMING_TO_CONTROLLER_EXT;
|
||||
|
||||
XrHandJointsLocateInfoEXT li = {
|
||||
.type = XR_TYPE_HAND_JOINTS_LOCATE_INFO_EXT,
|
||||
.next = &mri,
|
||||
.baseSpace = wm->xr.local_space,
|
||||
.time = frame_state.predictedDisplayTime,
|
||||
};
|
||||
|
||||
XrHandJointLocationsEXT hji = {
|
||||
.type = XR_TYPE_HAND_JOINT_LOCATIONS_EXT,
|
||||
.jointCount = XR_HAND_JOINT_COUNT_EXT,
|
||||
.jointLocations = hand->joint_locations,
|
||||
};
|
||||
|
||||
if (wm->xr.LocateHandJointsEXT(hand->hand_tracker, &li, &hji)
|
||||
!= XR_SUCCESS) {
|
||||
wlr_log(WLR_ERROR, "Failed to locate hand joints");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LunarWM_RenderLayerInfo render_layer_info = {
|
||||
.predicted_display_time = frame_state.predictedDisplayTime,
|
||||
.layer_projection.type = XR_TYPE_COMPOSITION_LAYER_PROJECTION,
|
||||
};
|
||||
bool const session_active
|
||||
= (wm->xr.session_state == XR_SESSION_STATE_SYNCHRONIZED)
|
||||
|| (wm->xr.session_state == XR_SESSION_STATE_VISIBLE)
|
||||
|| (wm->xr.session_state == XR_SESSION_STATE_FOCUSED);
|
||||
if (session_active && (frame_state.shouldRender != 0u)) {
|
||||
bool rendered = LunarWM_render_layer(wm, &render_layer_info, dt);
|
||||
if (rendered) {
|
||||
render_layer_info.layers[render_layer_info.layers_count]
|
||||
= (XrCompositionLayerBaseHeader *)&render_layer_info
|
||||
.layer_projection;
|
||||
}
|
||||
}
|
||||
|
||||
XrFrameEndInfo frame_end_info = {
|
||||
.type = XR_TYPE_FRAME_END_INFO,
|
||||
.displayTime = frame_state.predictedDisplayTime,
|
||||
.environmentBlendMode = wm->xr.environment_blend_mode,
|
||||
.layerCount = render_layer_info.layers_count,
|
||||
.layers
|
||||
= (XrCompositionLayerBaseHeader const **)render_layer_info.layers,
|
||||
};
|
||||
if (xrEndFrame(wm->xr.session, &frame_end_info) != XR_SUCCESS) {
|
||||
wlr_log(WLR_ERROR, "Failed to end OpenXR frame");
|
||||
return;
|
||||
}
|
||||
|
||||
EndDrawing();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user