Get window up and running

Signed-off-by: Slendi <slendi@socopon.com>
This commit is contained in:
2025-09-30 15:26:30 +03:00
parent d193ef0295
commit ed429d6a30
6 changed files with 300 additions and 111 deletions

View File

@@ -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();
}
}