KhronosGroup / OpenXR-SDK-Source

Sources for OpenXR loader, basic API layers, and example code.
https://khronos.org/openxr
Apache License 2.0
647 stars 238 forks source link

Linux XCB compat #145

Open rpavlik opened 4 years ago

rpavlik commented 4 years ago

Hmm. When I pull this into the internal repo with CI, it fails during the xcb-backend build of the exported source. (Don't know why it doesn't fail with the normal source)

FAILED: /usr/bin/c++   -DOPENXR_HAVE_COMMON_CONFIG -DOS_LINUX_XCB_GLX -DXR_OS_LINUX -DXR_USE_GRAPHICS_API_OPENGL -DXR_USE_PLATFORM_XCB -DXR_USE_TIMESPEC -I../src/../include -I../src -Isrc/tests/hello_xr -I../src/common -I../include -Iinclude -I../external/include -fPIE   -Wall -std=gnu++14 -MMD -MT src/tests/hello_xr/CMakeFiles/hello_xr.dir/graphicsplugin_opengl.cpp.o -MF src/tests/hello_xr/CMakeFiles/hello_xr.dir/graphicsplugin_opengl.cpp.o.d -o src/tests/hello_xr/CMakeFiles/hello_xr.dir/graphicsplugin_opengl.cpp.o -c ../src/tests/hello_xr/graphicsplugin_opengl.cpp
In file included from ../src/tests/hello_xr/graphicsplugin_opengl.cpp:9:0:
../src/common/xr_linear.h:24:0: warning: ignoring #pragma clang diagnostic [-Wunknown-pragmas]
 #pragma clang diagnostic ignored "-Wunused-function"
 ^
../src/tests/hello_xr/graphicsplugin_opengl.cpp: In member function ‘virtual void {anonymous}::OpenGLGraphicsPlugin::InitializeDevice(XrInstance, XrSystemId)’:
../src/tests/hello_xr/graphicsplugin_opengl.cpp:124:55: error: ‘struct ksGpuContext’ has no member named ‘connection’
         m_graphicsBinding.connection = window.context.connection;
                                                       ^
../src/tests/hello_xr/graphicsplugin_opengl.cpp:125:57: error: ‘struct ksGpuContext’ has no member named ‘screenNumber’
         m_graphicsBinding.screenNumber = window.context.screenNumber;
                                                         ^
../src/tests/hello_xr/graphicsplugin_opengl.cpp:126:55: error: ‘struct ksGpuContext’ has no member named ‘fbconfigid’
         m_graphicsBinding.fbconfigid = window.context.fbconfigid;
                                                       ^
../src/tests/hello_xr/graphicsplugin_opengl.cpp:129:55: error: invalid conversion from ‘GLXContext {aka __GLXcontextRec*}’ to ‘xcb_glx_context_t {aka unsigned int}’ [-fpermissive]
         m_graphicsBinding.glxContext = window.context.glxContext;
                                                       ^

I'll dig into it further tomorrow.

Originally posted by @rpavlik in https://github.com/KhronosGroup/OpenXR-SDK-Source/pull/144#issuecomment-557314798

SamanthaBowen commented 4 years ago

I looked back at the definition for the 'ksGpuContext' struct in gfxwrapper_opengl.h and noticed the #elif defined(OS_LINUX_XLIB) || defined(OS_LINUX_XCB_GLX) directive that decides if the struct has the XLib fields. Was the || defined(OS_LINUX_XCB_GLX) supposed to go with the #elif defined(OS_LINUX_XCB) block of XCB fields instead? I thought I checked if the code compiled with XCB, but maybe I only checked OS_LINUX_XCB and not OS_LINUX_XCB_GLX.

rpavlik commented 4 years ago

Hmm, looks like the build system says:

    # XCB + XCB GLX is limited to OpenGL 2.1
    # add_definitions( -DOS_LINUX_XCB )
    # XCB + Xlib GLX 1.3
    add_definitions( -DOS_LINUX_XCB_GLX )

so it doesn't have all those fields. It does have connection - via window.connection, and the visualid and glxDrawable are still OK, but the other 3 are absent.

rpavlik commented 4 years ago

Almost looks like the XCB OpenGL graphics binding is only half of what it needs to be - as in, it's missing a XCB + GLX xlib version. What a mess.

rpavlik commented 4 years ago

Oh, interesting. The XCB hello_xr never ran because of a missing "platform adapter". I'll probably just partially revert/comment out the change to fix this for now.

rpavlik commented 4 years ago

and monado doesn't support the xcb binding. OK. So I have a partial fix available but for the release I'll just do the partial revert, so you can review the mess I made of the code :)

rpavlik commented 4 years ago

OK, the less-than-perfect fix has been released. There may actually be a spec bug here.

rpavlik-bot commented 4 years ago

An issue (number 1278) has been filed to correspond to this issue in the internal Khronos GitLab.

If you have a Khronos account, you can access that issue at KHR:openxr/openxr#1278.