Skip to content

Commit 8d23644

Browse files
committed
Merge branch 'linuxvr'
2 parents 5c6a1d3 + 565a482 commit 8d23644

File tree

1 file changed

+38
-7
lines changed

1 file changed

+38
-7
lines changed

sources/libengine/virtualReality/platforms.cpp

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,23 @@
55
#include <Windows.h>
66
#pragma comment(lib, "opengl32") // wglGetCurrentDC
77
#define XR_USE_PLATFORM_WIN32
8+
#define GLFW_EXPOSE_NATIVE_WIN32
89
#endif // CAGE_SYSTEM_WINDOWS
910

11+
#ifdef CAGE_SYSTEM_LINUX
12+
#if defined(_GLFW_X11)
13+
#define XR_USE_PLATFORM_XLIB
14+
#define GLFW_EXPOSE_NATIVE_X11
15+
#endif
16+
#if defined(_GLFW_WAYLAND)
17+
#define XR_USE_PLATFORM_WAYLAND
18+
#define GLFW_EXPOSE_NATIVE_WAYLAND
19+
#endif
20+
#endif // CAGE_SYSTEM_LINUX
21+
22+
#include <GLFW/glfw3.h>
23+
#include <GLFW/glfw3native.h>
24+
1025
#define XR_USE_GRAPHICS_API_OPENGL
1126
#include <openxr/openxr_platform.h>
1227

@@ -45,22 +60,38 @@ namespace cage
4560

4661
#ifdef CAGE_SYSTEM_WINDOWS
4762

63+
CAGE_ASSERT(glfwGetPlatform() == GLFW_PLATFORM_WIN32);
4864
XrGraphicsBindingOpenGLWin32KHR binding;
4965
init(binding, XR_TYPE_GRAPHICS_BINDING_OPENGL_WIN32_KHR);
5066
binding.hDC = wglGetCurrentDC();
5167
binding.hGLRC = wglGetCurrentContext();
5268

53-
#else
69+
#elif defined(XR_USE_PLATFORM_XLIB)
5470

55-
CAGE_THROW_CRITICAL(Exception, "cage openxr currently works on windows only");
71+
if (glfwGetPlatform() != GLFW_PLATFORM_X11)
72+
CAGE_THROW_ERROR(Exception, "cannot initialize OpenXR for x11, glfw platform differs");
73+
XrGraphicsBindingOpenGLXlibKHR binding;
74+
init(binding, XR_TYPE_GRAPHICS_BINDING_OPENGL_XLIB_KHR);
75+
binding.xDisplay = glfwGetX11Display();
76+
// binding.visualid
77+
// binding.glxFBConfig
78+
binding.glxDrawable = glXGetCurrentDrawable();
79+
binding.glxContext = glXGetCurrentContext();
5680

57-
char binding[100] = {}; // dummy structure to allow compiling
58-
//XrGraphicsBindingOpenGLXlibKHR binding;
59-
//init(binding, XR_TYPE_GRAPHICS_BINDING_OPENGL_XLIB_KHR);
81+
#elif defined(XR_USE_PLATFORM_WAYLAND)
6082

61-
// todo some platform specific magic
83+
if (glfwGetPlatform() != GLFW_PLATFORM_WAYLAND)
84+
CAGE_THROW_ERROR(Exception, "cannot initialize OpenXR for wayland, glfw platform differs");
85+
XrGraphicsBindingOpenGLWaylandKHR binding;
86+
init(binding, XR_TYPE_GRAPHICS_BINDING_OPENGL_WAYLAND_KHR);
87+
binding.Display = glfwGetWaylandDisplay();
6288

63-
#endif // CAGE_SYSTEM_WINDOWS
89+
#else
90+
91+
CAGE_THROW_ERROR(Exception, "unsupported platform for OpenXR in cage");
92+
char binding[100] = {}; // dummy structure to allow compiling
93+
94+
#endif
6495

6596
XrSessionCreateInfo info;
6697
init(info, XR_TYPE_SESSION_CREATE_INFO);

0 commit comments

Comments
 (0)