diff --git a/changes/sdk/pr.153.gh.OpenXR-SDK-Source.md b/changes/sdk/pr.153.gh.OpenXR-SDK-Source.md new file mode 100644 index 000000000..15c02baeb --- /dev/null +++ b/changes/sdk/pr.153.gh.OpenXR-SDK-Source.md @@ -0,0 +1,4 @@ +--- +- issue.151.gh.OpenXR-SDK-Source +--- +Improve portability and fix building of loader on MinGW. Toolchain files now provided for cross-building for Windows from Debian. diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 94674ced9..e0f1c02a3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -249,6 +249,10 @@ if((OPENGL_FOUND OR OpenGLES_FOUND) ) endif() set_target_properties(openxr-gfxwrapper PROPERTIES FOLDER ${HELPER_FOLDER}) + if(WIN32) + target_link_libraries(openxr-gfxwrapper PUBLIC gdi32) + endif() + message( STATUS "Enabling OpenGL support in hello_xr, loader_test, and conformance, if configured" diff --git a/src/cmake/mingw-w64-toolchain-32bit.cmake b/src/cmake/mingw-w64-toolchain-32bit.cmake new file mode 100644 index 000000000..720a89dc7 --- /dev/null +++ b/src/cmake/mingw-w64-toolchain-32bit.cmake @@ -0,0 +1,33 @@ +# Toolchain file for 32-bit MinGW build on *nix +# Developed for use with Debian and its derivatives +# +# Copyright 2019 Collabora, Ltd. +# SPDX-License-Identifier: BSL-1.0 + +set(CMAKE_SYSTEM_NAME "Windows") + +set(TARGET i686-w64-mingw32) +set(PREFIX ${TARGET}-) +set(SUFFIX -posix) # required for threads +set(CMAKE_C_COMPILER ${PREFIX}gcc${SUFFIX}) +set(CMAKE_CXX_COMPILER ${PREFIX}g++${SUFFIX}) +set(CMAKE_RC_COMPILER ${PREFIX}windres) + +set(CMAKE_C_COMPILER_AR ${PREFIX}gcc-ar${SUFFIX}) +set(CMAKE_CXX_COMPILER_AR ${PREFIX}gcc-ar${SUFFIX}) +set(CMAKE_C_COMPILER_RANLIB ${PREFIX}gcc-ranlib${SUFFIX}) +set(CMAKE_CXX_COMPILER_RANLIB ${PREFIX}gcc-ranlib${SUFFIX}) +set(CMAKE_NM ${PREFIX}gcc-nm${SUFFIX}) +set(CMAKE_OBJCOPY ${PREFIX}objcopy) +set(CMAKE_OBJDUMP ${PREFIX}objdump) +set(CMAKE_RANLIB ${PREFIX}ranlib) +set(CMAKE_STRIP ${PREFIX}strip) + +if(NOT CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX /usr/${TARGET}) +endif() + +set(CMAKE_FIND_ROOT_PATH /usr/${TARGET}) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) diff --git a/src/cmake/mingw-w64-toolchain.cmake b/src/cmake/mingw-w64-toolchain.cmake new file mode 100644 index 000000000..4927b211e --- /dev/null +++ b/src/cmake/mingw-w64-toolchain.cmake @@ -0,0 +1,33 @@ +# Toolchain file for 64-bit MinGW build on *nix +# Developed for use with Debian and its derivatives +# +# Copyright 2019 Collabora, Ltd. +# SPDX-License-Identifier: BSL-1.0 + +set(CMAKE_SYSTEM_NAME "Windows") + +set(TARGET x86_64-w64-mingw32) +set(PREFIX ${TARGET}-) +set(SUFFIX -posix) # required for threads +set(CMAKE_C_COMPILER ${PREFIX}gcc${SUFFIX}) +set(CMAKE_CXX_COMPILER ${PREFIX}g++${SUFFIX}) +set(CMAKE_RC_COMPILER ${PREFIX}windres) + +set(CMAKE_C_COMPILER_AR ${PREFIX}gcc-ar${SUFFIX}) +set(CMAKE_CXX_COMPILER_AR ${PREFIX}gcc-ar${SUFFIX}) +set(CMAKE_C_COMPILER_RANLIB ${PREFIX}gcc-ranlib${SUFFIX}) +set(CMAKE_CXX_COMPILER_RANLIB ${PREFIX}gcc-ranlib${SUFFIX}) +set(CMAKE_NM ${PREFIX}gcc-nm${SUFFIX}) +set(CMAKE_OBJCOPY ${PREFIX}objcopy) +set(CMAKE_OBJDUMP ${PREFIX}objdump) +set(CMAKE_RANLIB ${PREFIX}ranlib) +set(CMAKE_STRIP ${PREFIX}strip) + +if(NOT CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX /usr/${TARGET}) +endif() + +set(CMAKE_FIND_ROOT_PATH /usr/${TARGET}) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) diff --git a/src/tests/hello_xr/graphicsplugin_opengl.cpp b/src/tests/hello_xr/graphicsplugin_opengl.cpp index ed3cab281..f284cb4fc 100644 --- a/src/tests/hello_xr/graphicsplugin_opengl.cpp +++ b/src/tests/hello_xr/graphicsplugin_opengl.cpp @@ -3,6 +3,12 @@ // SPDX-License-Identifier: Apache-2.0 #include "pch.h" + +#ifdef __MINGW32__ +#define GL_ATTRIBUTE __attribute__((stdcall)) +#else +#define GL_ATTRIBUTE +#endif #include "common.h" #include "geometry.h" #include "graphicsplugin.h" @@ -149,17 +155,15 @@ struct OpenGLGraphicsPlugin : public IGraphicsPlugin { #if !defined(XR_USE_PLATFORM_MACOS) glEnable(GL_DEBUG_OUTPUT); - glDebugMessageCallback( - [](GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, - const void* userParam) { - ((OpenGLGraphicsPlugin*)userParam)->DebugMessageCallback(source, type, id, severity, length, message); - }, - this); + glDebugMessageCallback((GLDEBUGPROC)&OpenGLGraphicsPlugin::DebugMessageCallbackTrampoline, this); #endif // !defined(XR_USE_PLATFORM_MACOS) InitializeResources(); } - + static void GL_ATTRIBUTE DebugMessageCallbackTrampoline(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, + const GLchar* message, const void* userParam) { + ((OpenGLGraphicsPlugin*)userParam)->DebugMessageCallback(source, type, id, severity, length, message); + } void InitializeResources() { glGenFramebuffers(1, &m_swapchainFramebuffer);