diff --git a/CMakeLists.txt b/CMakeLists.txt index e65ba23237b81453d88e1b85698992d6ca26588f..03496411dcccee60289cb1a4b407abc9a6f0040e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,6 +33,8 @@ option(ENABLE_GUI "whether the graphical user interface should be enabled" ON) option(ENABLE_GFX "whether graphics support should be enabled" ON) +option(USE_MESA "use software rendered Mesa instead of hardware GL" + OFF) option(ENABLE_IMG "whether the image processing module should be compiled" ON) option(ENABLE_INFO "whether openstructure should be compiled with support for the info library" @@ -187,7 +189,13 @@ if (ENABLE_INFO) endif() if (ENABLE_GFX) - find_package(OpenGL REQUIRED) + if(USE_MESA) + find_package(Mesa REQUIRED) + set(_USE_MESA ON) + else() + find_package(OpenGL REQUIRED) + set(_USE_MESA OFF) + endif() endif() if (ENABLE_IMG OR ENABLE_GFX) @@ -283,6 +291,7 @@ message(STATUS " Info support (-DENABLE_INFO) : ${_INFO}\n" " Graphical interface (-DENABLE_GUI) : ${_UI}\n" " OpenGL support (-DENABLE_GFX) : ${_OPENGL}\n" + " OpenGL via Mesa (-DUSE_MESA) : ${_USE_MESA}\n" " Image Processing support (-DENABLE_IMG) : ${_IMG}\n" " Shader support (-DUSE_SHADER) : ${_SHADER}\n" " Numpy support (-DUSE_NUMPY) : ${_NUMPY}\n" diff --git a/modules/config/CMakeLists.txt b/modules/config/CMakeLists.txt index 1e637d14470c6aa77af76cdd6c58e5ad5561c180..a95554b40456f3339bbbea2a7ef6833e829b5592 100644 --- a/modules/config/CMakeLists.txt +++ b/modules/config/CMakeLists.txt @@ -16,6 +16,12 @@ else() set(shader_support 0) endif() +if (USE_MESA) + set(mesa_support 1) +else() + set(mesa_support 0) +endif() + if (USE_NUMPY) set(numpy_support 1) else() diff --git a/modules/config/config.hh.in b/modules/config/config.hh.in index c2242500ee2e528294c5beb77a5c650f9adfe288..3268ebab4144946b5d78fcd83f2b0f3d816a4832 100644 --- a/modules/config/config.hh.in +++ b/modules/config/config.hh.in @@ -24,6 +24,7 @@ */ #define OST_SHADER_SUPPORT_ENABLED @shader_support@ +#define OST_MESA_SUPPORT_ENABLED @mesa_support@ #define OST_PROFILING_ENABLED @profiling_enabled@ #define OST_ANIMATIONS_ENABLED @animations_enabled@ #define OST_IMG_ENABLED @img_enabled@ diff --git a/modules/gfx/src/CMakeLists.txt b/modules/gfx/src/CMakeLists.txt index 9309a6af7ebec7fed643e303a732bf1b0c53b4ab..6028b64f857c2fd6c25e9ef12b485cf40ae1182c 100644 --- a/modules/gfx/src/CMakeLists.txt +++ b/modules/gfx/src/CMakeLists.txt @@ -180,8 +180,13 @@ else() endif() if (UNIX AND NOT APPLE) - list(APPEND OST_GFX_SOURCES impl/glx_offscreen_buffer.cc) - list(APPEND OST_GFX_IMPL_HEADERS glx_offscreen_buffer.hh) + if(USE_MESA) + list(APPEND OST_GFX_SOURCES impl/mesa_offscreen_buffer.cc) + list(APPEND OST_GFX_IMPL_HEADERS mesa_offscreen_buffer.hh) + else() + list(APPEND OST_GFX_SOURCES impl/glx_offscreen_buffer.cc) + list(APPEND OST_GFX_IMPL_HEADERS glx_offscreen_buffer.hh) + endif() endif() if (APPLE) @@ -200,13 +205,15 @@ if (USE_SHADER) list(APPEND OST_GFX_SOURCES impl/scene_fx.cc) list(APPEND OST_GFX_IMPL_HEADERS scene_fx.hh) if (NOT APPLE) - set(OST_GLEW_HEADERS - glew.h - glxew.h - wglew.h IN_DIR GL - ) - list(APPEND OST_GFX_SOURCES GL/glew.c) - include_directories("${STAGE_DIR}/include/ost/gfx") + if (NOT USE_MESA) + set(OST_GLEW_HEADERS + glew.h + glxew.h + wglew.h IN_DIR GL + ) + list(APPEND OST_GFX_SOURCES GL/glew.c) + include_directories("${STAGE_DIR}/include/ost/gfx") + endif() endif() endif() @@ -226,6 +233,9 @@ module(NAME gfx SOURCES ${OST_GFX_SOURCES} ${OST_GFX_MAP_SOURCES} include_directories(${PNG_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR}) # link against OpenGL and PNG libraries +if(USE_MESA) + link_directories(${OPENGL_LIBRARY_DIR}) +endif() target_link_libraries(ost_gfx ${OPENGL_LIBRARIES} ${PNG_LIBRARIES}) if (USE_SHADER) diff --git a/modules/gfx/src/glext_include.hh b/modules/gfx/src/glext_include.hh index 8188b1265d3c14a6002aca910e1aa183acc06027..183f6112cbd9bfb91bf57323faf759cad3e3918f 100644 --- a/modules/gfx/src/glext_include.hh +++ b/modules/gfx/src/glext_include.hh @@ -29,6 +29,12 @@ #include <ost/config.hh> #if OST_SHADER_SUPPORT_ENABLED +#ifdef OST_MESA_SUPPORT_ENABLED +# define OST_GL_VERSION_2_0 1 +# define GL_GLEXT_PROTOTYPES 1 +# include <GL/gl.h> +# include <GL/glext.h> +#else # if OST_MODULE==OST_GFX # define GLEW_BUILD # endif @@ -39,6 +45,7 @@ # include <ost/gfx/GL/wglew.h> # endif #endif +#endif #include <ost/gfx/gl_include.hh> @@ -53,3 +60,4 @@ #endif #endif #endif + diff --git a/modules/gfx/src/offscreen_buffer.hh b/modules/gfx/src/offscreen_buffer.hh index 2714cdbe06c6f778f0b67ccdc665de1bb0e63895..7b716c2f6610bf4e98d01450e3abd347a43d48ac 100644 --- a/modules/gfx/src/offscreen_buffer.hh +++ b/modules/gfx/src/offscreen_buffer.hh @@ -59,7 +59,11 @@ public: */ #if defined(__linux__) +#if OST_MESA_SUPPORT_ENABLED +#include "impl/mesa_offscreen_buffer.hh" +#else #include "impl/glx_offscreen_buffer.hh" +#endif #elif defined(__APPLE__) #include "impl/cgl_offscreen_buffer.hh" #elif defined(_MSC_VER) diff --git a/modules/gfx/src/shader.cc b/modules/gfx/src/shader.cc index b09c41a700c8d2d0f6cbc3408fa293d5239033ae..c3b8b1d79ae42f3a58aeda6f1c8606a5bd8dc389 100644 --- a/modules/gfx/src/shader.cc +++ b/modules/gfx/src/shader.cc @@ -59,12 +59,14 @@ Shader::Shader(): void Shader::PreGLInit() { #if !defined(__APPLE__) +#if !defined(OST_MESA_SUPPORT_ENABLED) GLenum err = glewInit(); if (GLEW_OK != err) { LOG_ERROR("glew failure: " << glewGetErrorString(err)); assert(false); } #endif +#endif } bool Shader::Compile(std::string shader_name, std::string shader_code,