lovr/src/modules/headset/headset.c

66 lines
1.8 KiB
C

#include "headset/headset.h"
#include "util.h"
HeadsetInterface* lovrHeadsetDisplayDriver = NULL;
HeadsetInterface* lovrHeadsetTrackingDrivers = NULL;
static bool initialized = false;
bool lovrHeadsetInit(HeadsetDriver* drivers, size_t count, float supersample, float offset, uint32_t msaa, bool overlay) {
if (initialized) return false;
initialized = true;
HeadsetInterface** trackingDrivers = &lovrHeadsetTrackingDrivers;
for (size_t i = 0; i < count; i++) {
HeadsetInterface* interface = NULL;
switch (drivers[i]) {
#ifdef LOVR_USE_DESKTOP
case DRIVER_DESKTOP: interface = &lovrHeadsetDesktopDriver; break;
#endif
#ifdef LOVR_USE_OPENXR
case DRIVER_OPENXR: interface = &lovrHeadsetOpenXRDriver; break;
#endif
#ifdef LOVR_USE_WEBXR
case DRIVER_WEBXR: interface = &lovrHeadsetWebXRDriver; break;
#endif
default: continue;
}
bool hasDisplay = interface->renderTo != NULL;
bool shouldInitialize = !hasDisplay || !lovrHeadsetDisplayDriver;
if (shouldInitialize && interface->init(supersample, offset, msaa, overlay)) {
if (hasDisplay) {
lovrHeadsetDisplayDriver = interface;
}
*trackingDrivers = interface;
trackingDrivers = &interface->next;
}
}
lovrAssert(lovrHeadsetDisplayDriver, "No headset display driver available, check t.headset.drivers in conf.lua");
return true;
}
void lovrHeadsetDestroy() {
if (!initialized) return;
initialized = false;
HeadsetInterface* driver = lovrHeadsetTrackingDrivers;
while (driver) {
if (driver != lovrHeadsetDisplayDriver) {
driver->destroy();
}
HeadsetInterface* next = driver->next;
driver->next = NULL;
driver = next;
}
if (lovrHeadsetDisplayDriver) {
lovrHeadsetDisplayDriver->destroy();
lovrHeadsetDisplayDriver = NULL;
}
}