Add helper scripts and wlroots integration
Signed-off-by: Slendi <slendi@socopon.com>
This commit is contained in:
@@ -1,6 +1,13 @@
|
||||
#include "compositor.h"
|
||||
|
||||
#include "common.h"
|
||||
#include <wayland-server.h>
|
||||
// wlroots is a C library; wrap headers in extern "C"
|
||||
extern "C" {
|
||||
#include <wlr/backend.h>
|
||||
#include <wlr/util/log.h>
|
||||
}
|
||||
#include "wlr/openxr_gl.h"
|
||||
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
@@ -193,10 +200,40 @@ void Compositor::create_session()
|
||||
ci.createFlags = 0;
|
||||
OPENXR_CHECK(xrCreateSession, m_xr_instance, &ci, &m_session);
|
||||
}
|
||||
// --- wlroots integration: create Wayland display and OpenXR wlroots
|
||||
// backend --- initialize wlroots logging
|
||||
wlr_log_init(WLR_DEBUG, nullptr);
|
||||
// create Wayland display
|
||||
m_display = wl_display_create();
|
||||
if (!m_display) {
|
||||
throw std::runtime_error("Failed to create Wayland display");
|
||||
}
|
||||
// get event loop
|
||||
m_event_loop = wl_display_get_event_loop(m_display);
|
||||
if (!m_event_loop) {
|
||||
wl_display_destroy(m_display);
|
||||
throw std::runtime_error("Failed to get Wayland event loop");
|
||||
}
|
||||
// create the OpenXR wlroots backend
|
||||
m_backend = wlr_openxr_backend_create(m_display, m_event_loop);
|
||||
if (!m_backend || !wlr_backend_is_openxr(m_backend)) {
|
||||
wl_display_destroy(m_display);
|
||||
throw std::runtime_error("Failed to create OpenXR wlroots backend");
|
||||
}
|
||||
}
|
||||
|
||||
void Compositor::destroy_session()
|
||||
{
|
||||
// destroy wlroots backend and Wayland display
|
||||
if (m_backend) {
|
||||
wlr_backend_destroy(m_backend);
|
||||
m_backend = nullptr;
|
||||
}
|
||||
if (m_display) {
|
||||
wl_display_destroy(m_display);
|
||||
m_display = nullptr;
|
||||
}
|
||||
// destroy OpenXR session
|
||||
OPENXR_CHECK(xrDestroySession, m_session);
|
||||
}
|
||||
|
||||
@@ -249,11 +286,17 @@ void Compositor::poll_events()
|
||||
|
||||
void Compositor::run()
|
||||
{
|
||||
// start the wlroots backend (this also begins XrSession)
|
||||
if (!wlr_backend_start(m_backend)) {
|
||||
throw std::runtime_error("Failed to start wlroots backend");
|
||||
}
|
||||
while (m_running) {
|
||||
this->poll_events();
|
||||
// dispatch Wayland events
|
||||
wl_event_loop_dispatch(m_event_loop, 0);
|
||||
|
||||
if (m_session_running) {
|
||||
// TODO: Render frame
|
||||
// TODO: Render frame (per-eye rendering via OpenXR swapchain)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user