diff --git a/CMakeLists.txt b/CMakeLists.txt index a88557da1..117d4a8a7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,6 +52,7 @@ endif() cmake_dependent_option(TARGET_GLES2 "Build for OpenGL ES 2 / WebGL 1.0" ON "TARGET_GLES" OFF) cmake_dependent_option(TARGET_DESKTOP_GLES "Build for OpenGL ES on desktop" OFF "TARGET_GLES" OFF) +option(TARGET_HEADLESS "Build command-line utilities for use on a headless machines" OFF) # Magnum Info (currently only using GLX, CGL, WGL/EGL on Windows or on NaCl) if(CORRADE_TARGET_UNIX OR CORRADE_TARGET_NACL OR CORRADE_TARGET_WINDOWS) @@ -194,9 +195,15 @@ endif() if(TARGET_DESKTOP_GLES) set(MAGNUM_TARGET_DESKTOP_GLES 1) endif() +if(TARGET_HEADLESS) + set(MAGNUM_TARGET_HEADLESS 1) +endif() if(BUILD_GL_TESTS) - if(CORRADE_TARGET_APPLE) + if(MAGNUM_TARGET_HEADLESS) + set(WITH_WINDOWLESSEGLAPPLICATION ON) + set(GL_TEST_LIBRARIES Magnum MagnumWindowlessEglApplication) + elseif(CORRADE_TARGET_APPLE) set(WITH_WINDOWLESSCGLAPPLICATION ON) set(GL_TEST_LIBRARIES Magnum MagnumWindowlessCglApplication) elseif(CORRADE_TARGET_UNIX AND (NOT MAGNUM_TARGET_GLES OR MAGNUM_TARGET_DESKTOP_GLES)) diff --git a/doc/building.dox b/doc/building.dox index 7890e2968..b6d2092d3 100644 --- a/doc/building.dox +++ b/doc/building.dox @@ -167,6 +167,11 @@ available for desktop OpenGL only, see @ref requires-gl. `TARGET_GLES` is set. - `TARGET_DESKTOP_GLES` -- Target OpenGL ES on desktop, i.e. use OpenGL ES emulation in desktop OpenGL library. Might not be supported in all drivers. +- `TARGET_HEADLESS` -- Build command-line utilities for use on a headless + machine. Basically it means that EGL with no display attachment is being + used everywhere instead of platform-specific toolkits like CGL, GLX or WGL. + Supported mainly on OpenGL ES drivers, for desktop OpenGL the only driver + that supports this configuration is NVidia >= 355. The features used can be conveniently detected in depending projects both in CMake and C++ sources, see @ref cmake and @ref Magnum/Magnum.h for more diff --git a/doc/cmake.dox b/doc/cmake.dox index 73892ee0f..dd4d9fe62 100644 --- a/doc/cmake.dox +++ b/doc/cmake.dox @@ -183,7 +183,9 @@ are also available as preprocessor variables if including - `MAGNUM_TARGET_GLES3` -- Defined if compiled for OpenGL ES 3.0 - `MAGNUM_TARGET_DESKTOP_GLES` -- Defined if compiled with OpenGL ES emulation on desktop OpenGL -- `MAGNUM_TARGET_WEBGL` --- Defined if compiled for WebGL +- `MAGNUM_TARGET_WEBGL` -- Defined if compiled for WebGL +- `MAGNUM_TARGET_HEADLESS` -- Defined if compiled for headless machines. See + @ref MAGNUM_TARGET_HEADLESS documentation for more information. Workflows without imported targets are deprecated and the following variables are included just for backwards compatibility and only if diff --git a/modules/FindMagnum.cmake b/modules/FindMagnum.cmake index 11aa63e0e..ae7b4fd4e 100644 --- a/modules/FindMagnum.cmake +++ b/modules/FindMagnum.cmake @@ -109,6 +109,7 @@ # MAGNUM_TARGET_DESKTOP_GLES - Defined if compiled with OpenGL ES # emulation on desktop OpenGL # MAGNUM_TARGET_WEBGL - Defined if compiled for WebGL +# MAGNUM_TARGET_HEADLESS - Defined if compiled for headless machines # # Additionally these variables are defined for internal usage: # @@ -207,7 +208,8 @@ set(_magnumFlags TARGET_GLES2 TARGET_GLES3 TARGET_DESKTOP_GLES - TARGET_WEBGL) + TARGET_WEBGL + TARGET_HEADLESS) foreach(_magnumFlag ${_magnumFlags}) string(FIND "${_magnumConfigure}" "#define MAGNUM_${_magnumFlag}" _magnum_${_magnumFlag}) if(NOT _magnum_${_magnumFlag} EQUAL -1) diff --git a/src/Magnum/Magnum.h b/src/Magnum/Magnum.h index 39652c3ac..3461be9c3 100644 --- a/src/Magnum/Magnum.h +++ b/src/Magnum/Magnum.h @@ -143,6 +143,18 @@ which you might want to be aware of. Implies also @ref MAGNUM_TARGET_GLES and */ #define MAGNUM_TARGET_WEBGL #undef MAGNUM_TARGET_WEBGL + +/** +@brief Headless target + +Defined if the engine is built for use on a headless machine (without any +graphical desktop environment). Basically it means that EGL with no display +attachment is being used everywhere instead of platform-specific toolkits like +CGL, GLX or WGL. Note that this might not be supported on all platforms, see +@ref Platform::WindowlessEglApplication for more information. +*/ +#define MAGNUM_TARGET_HEADLESS +#undef MAGNUM_TARGET_HEADLESS #endif /** @{ @name Basic type definitions diff --git a/src/Magnum/Platform/CMakeLists.txt b/src/Magnum/Platform/CMakeLists.txt index 520eefeed..f9e870a60 100644 --- a/src/Magnum/Platform/CMakeLists.txt +++ b/src/Magnum/Platform/CMakeLists.txt @@ -657,7 +657,9 @@ endif() if(WITH_MAGNUMINFO) add_executable(magnum-info magnum-info.cpp) target_link_libraries(magnum-info Magnum) - if(CORRADE_TARGET_APPLE) + if(MAGNUM_TARGET_HEADLESS) + target_link_libraries(magnum-info MagnumWindowlessEglApplication) + elseif(CORRADE_TARGET_APPLE) target_link_libraries(magnum-info MagnumWindowlessCglApplication) elseif(CORRADE_TARGET_NACL) target_link_libraries(magnum-info MagnumWindowlessNaClApplication) diff --git a/src/Magnum/Platform/magnum-info.cpp b/src/Magnum/Platform/magnum-info.cpp index a3854cbe3..7d2895e61 100644 --- a/src/Magnum/Platform/magnum-info.cpp +++ b/src/Magnum/Platform/magnum-info.cpp @@ -56,7 +56,9 @@ #include "Magnum/TransformFeedback.h" #endif -#ifdef CORRADE_TARGET_NACL +#ifdef MAGNUM_TARGET_HEADLESS +#include "Magnum/Platform/WindowlessEglApplication.h" +#elif defined(CORRADE_TARGET_NACL) #include "Magnum/Platform/WindowlessNaClApplication.h" #elif defined(CORRADE_TARGET_APPLE) #include "Magnum/Platform/WindowlessCglApplication.h" @@ -168,7 +170,9 @@ MagnumInfo::MagnumInfo(const Arguments& arguments): Platform::WindowlessApplicat Debug() << " +---------------------------------------------------------+"; Debug() << ""; - #ifdef MAGNUM_WINDOWLESSNACLAPPLICATION_MAIN + #ifdef MAGNUM_WINDOWLESSEGLAPPLICATION_MAIN + Debug() << "Used application: Platform::WindowlessEglApplication"; + #elif defined(MAGNUM_WINDOWLESSNACLAPPLICATION_MAIN) Debug() << "Used application: Platform::WindowlessNaClApplication"; #elif defined(MAGNUM_WINDOWLESSCGLAPPLICATION_MAIN) Debug() << "Used application: Platform::WindowlessCglApplication"; @@ -245,6 +249,9 @@ MagnumInfo::MagnumInfo(const Arguments& arguments): Platform::WindowlessApplicat #ifdef MAGNUM_TARGET_WEBGL Debug() << " MAGNUM_TARGET_WEBGL"; #endif + #ifdef MAGNUM_TARGET_HEADLESS + Debug() << " MAGNUM_TARGET_HEADLESS"; + #endif Debug() << ""; /* Create context here, so the context creation info is displayed at proper diff --git a/src/Magnum/Test/AbstractOpenGLTester.h b/src/Magnum/Test/AbstractOpenGLTester.h index 54a1f5ef3..b8778334d 100644 --- a/src/Magnum/Test/AbstractOpenGLTester.h +++ b/src/Magnum/Test/AbstractOpenGLTester.h @@ -32,7 +32,9 @@ #include "Magnum/DebugOutput.h" #include "Magnum/Renderer.h" -#if defined(CORRADE_TARGET_APPLE) +#ifdef MAGNUM_TARGET_HEADLESS +#include "Magnum/Platform/WindowlessEglApplication.h" +#elif defined(CORRADE_TARGET_APPLE) #include "Magnum/Platform/WindowlessCglApplication.h" #elif defined(CORRADE_TARGET_UNIX) && (!defined(MAGNUM_TARGET_GLES) || defined(MAGNUM_TARGET_DESKTOP_GLES)) #include "Magnum/Platform/WindowlessGlxApplication.h" diff --git a/src/Magnum/Text/CMakeLists.txt b/src/Magnum/Text/CMakeLists.txt index 7c6579de9..0f97736d9 100644 --- a/src/Magnum/Text/CMakeLists.txt +++ b/src/Magnum/Text/CMakeLists.txt @@ -63,7 +63,9 @@ if(WITH_FONTCONVERTER) add_executable(magnum-fontconverter fontconverter.cpp) target_include_directories(magnum-fontconverter PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) target_link_libraries(magnum-fontconverter Magnum MagnumText) - if(CORRADE_TARGET_APPLE) + if(MAGNUM_TARGET_HEADLESS) + target_link_libraries(magnum-fontconverter MagnumWindowlessEglApplication) + elseif(CORRADE_TARGET_APPLE) target_link_libraries(magnum-fontconverter MagnumWindowlessCglApplication) elseif(CORRADE_TARGET_UNIX AND NOT TARGET_GLES) target_link_libraries(magnum-fontconverter MagnumWindowlessGlxApplication) diff --git a/src/Magnum/Text/fontconverter.cpp b/src/Magnum/Text/fontconverter.cpp index cc5007139..78a90dbf4 100644 --- a/src/Magnum/Text/fontconverter.cpp +++ b/src/Magnum/Text/fontconverter.cpp @@ -32,7 +32,9 @@ #include "Magnum/Text/DistanceFieldGlyphCache.h" #include "Magnum/Trade/AbstractImageConverter.h" -#ifdef CORRADE_TARGET_APPLE +#ifdef MAGNUM_TARGET_HEADLESS +#include "Magnum/Platform/WindowlessEglApplication.h" +#elif defined(CORRADE_TARGET_APPLE) #include "Magnum/Platform/WindowlessCglApplication.h" #elif defined(CORRADE_TARGET_UNIX) #include "Magnum/Platform/WindowlessGlxApplication.h" diff --git a/src/Magnum/TextureTools/CMakeLists.txt b/src/Magnum/TextureTools/CMakeLists.txt index bb74b0957..e93c999c6 100644 --- a/src/Magnum/TextureTools/CMakeLists.txt +++ b/src/Magnum/TextureTools/CMakeLists.txt @@ -53,7 +53,9 @@ if(WITH_DISTANCEFIELDCONVERTER) add_executable(magnum-distancefieldconverter distancefieldconverter.cpp) target_include_directories(magnum-distancefieldconverter PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) target_link_libraries(magnum-distancefieldconverter Magnum MagnumTextureTools) - if(CORRADE_TARGET_APPLE) + if(MAGNUM_TARGET_HEADLESS) + target_link_libraries(magnum-distancefieldconverter MagnumWindowlessEglApplication) + elseif(CORRADE_TARGET_APPLE) target_link_libraries(magnum-distancefieldconverter MagnumWindowlessCglApplication) elseif(CORRADE_TARGET_UNIX AND NOT TARGET_GLES) target_link_libraries(magnum-distancefieldconverter MagnumWindowlessGlxApplication) diff --git a/src/Magnum/TextureTools/distancefieldconverter.cpp b/src/Magnum/TextureTools/distancefieldconverter.cpp index 2c55c73b9..bded817b8 100644 --- a/src/Magnum/TextureTools/distancefieldconverter.cpp +++ b/src/Magnum/TextureTools/distancefieldconverter.cpp @@ -38,7 +38,9 @@ #include "Magnum/Trade/AbstractImageConverter.h" #include "Magnum/Trade/ImageData.h" -#ifdef CORRADE_TARGET_APPLE +#ifdef MAGNUM_TARGET_HEADLESS +#include "Magnum/Platform/WindowlessEglApplication.h" +#elif defined(CORRADE_TARGET_APPLE) #include "Magnum/Platform/WindowlessCglApplication.h" #elif defined(CORRADE_TARGET_UNIX) #include "Magnum/Platform/WindowlessGlxApplication.h" diff --git a/src/Magnum/configure.h.cmake b/src/Magnum/configure.h.cmake index 0a4e7da66..54abfa21d 100644 --- a/src/Magnum/configure.h.cmake +++ b/src/Magnum/configure.h.cmake @@ -30,3 +30,4 @@ #cmakedefine MAGNUM_TARGET_GLES3 #cmakedefine MAGNUM_TARGET_DESKTOP_GLES #cmakedefine MAGNUM_TARGET_WEBGL +#cmakedefine MAGNUM_TARGET_HEADLESS