visit-dav / visit

VisIt - Visualization and Data Analysis for Mesh-based Scientific Data
https://visit.llnl.gov
BSD 3-Clause "New" or "Revised" License
428 stars 110 forks source link

VisIt 3.4.1 with OSMesa exits immediately with error: GLEW could not be initialized: Missing GL version #19668

Open devilkingsatan666 opened 1 month ago

devilkingsatan666 commented 1 month ago

Describe the bug

When building dependencies for VisIt 3.4.1 with the following command:

env PAR_COMPILER=/opt/visit/3.4.1/linux-x86_64/bin/mpicc \
    PAR_COMPILER_CXX=/opt/visit/3.4.1/linux-x86_64/bin/mpicxx \
    PAR_INCLUDE=-I/opt/visit/3.4.1/linux-x86_64/include \
 ./build_visit3_4_1 --thirdparty-path /opt/visit/third_party --required --optional --osmesa --qt6 --vtk9 --parallel --no-visit --makeflags -j16

CMake complains that it cannot find OpenGL with the following error:

Making build directory VTK-9.2.6-build
"/opt/visit/third_party/cmake/3.24.3/linux-x86_64_gcc-11.4/bin/cmake" -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_INSTALL_PREFIX:PATH=/opt/visit/third_party/vtk/9.2.6/linux-x86_64_gcc-11.4 -DBUILD_SHARED_LIBS:BOOL=ON -DVTK_DEBUG_LEAKS:BOOL=false -DVTK_LEGACY_REMOVE:BOOL=true -DCMAKE_C_COMPILER:STRING=gcc -DCMAKE_CXX_COMPILER:STRING=g++ -DCMAKE_C_FLAGS:STRING=" -O2" -DCMAKE_CXX_FLAGS:STRING=" -O2" -DCMAKE_EXE_LINKER_FLAGS:STRING= -DCMAKE_MODULE_LINKER_FLAGS:STRING= -DCMAKE_SHARED_LINKER_FLAGS:STRING= -DVTK_BUILD_TESTING:STRING=OFF -DVTK_BUILD_DOCUMENTATION:BOOL=false -DVTK_REPORT_OPENGL_ERRORS:BOOL=false -DVTK_ALL_NEW_OBJECT_FACTORY:BOOL=true -DVTK_FORBID_DOWNLOADS:BOOL=true -DVTK_GROUP_ENABLE_Imaging:STRING=DONT_WANT -DVTK_GROUP_ENABLE_MPI:STRING=DONT_WANT -DVTK_GROUP_ENABLE_Qt:STRING=DONT_WANT -DVTK_GROUP_ENABLE_Rendering:STRING=DONT_WANT -DVTK_GROUP_ENABLE_StandAlone:STRING=DONT_WANT -DVTK_GROUP_ENABLE_Views:STRING=DONT_WANT -DVTK_GROUP_ENABLE_Web:STRING=DONT_WANT -DVTK_MODULE_ENABLE_VTK_CommonCore:STRING=YES -DVTK_MODULE_ENABLE_VTK_FiltersFlowPaths:STRING=YES -DVTK_MODULE_ENABLE_VTK_FiltersHybrid:STRING=YES -DVTK_MODULE_ENABLE_VTK_FiltersModeling:STRING=YES -DVTK_MODULE_ENABLE_VTK_GeovisCore:STRING=YES -DVTK_MODULE_ENABLE_VTK_IOEnSight:STRING=YES -DVTK_MODULE_ENABLE_VTK_IOGeometry:STRING=YES -DVTK_MODULE_ENABLE_VTK_IOLegacy:STRING=YES -DVTK_MODULE_ENABLE_VTK_IOPLY:STRING=YES -DVTK_MODULE_ENABLE_VTK_IOXML:STRING=YES -DVTK_MODULE_ENABLE_VTK_InteractionStyle:STRING=YES -DVTK_MODULE_ENABLE_VTK_RenderingAnnotation:STRING=YES -DVTK_MODULE_ENABLE_VTK_RenderingFreeType:STRING=YES -DVTK_MODULE_ENABLE_VTK_RenderingOpenGL2:STRING=YES -DVTK_MODULE_ENABLE_VTK_RenderingVolumeOpenGL2:STRING=YES -DVTK_MODULE_ENABLE_VTK_libxml2:STRING=YES -DVTK_MODULE_ENABLE_VTK_GUISupportQt:STRING=YES -DQt6_DIR:FILEPATH=/opt/visit/third_party/qt/6.4.2/linux-x86_64_gcc-11.4/lib/cmake/Qt6 -DVTK_WRAP_PYTHON:BOOL=true -DVTK_PYTHON_VERSION:STRING=3 -DPython3_EXECUTABLE:FILEPATH=/opt/visit/third_party/python/3.9.18/linux-x86_64_gcc-11.4/bin/python3 -DPython3_EXTRA_LIBS:STRING="-lpthread -ldl -lutil -lm" -DPython3_INCLUDE_DIR:PATH=/opt/visit/third_party/python/3.9.18/linux-x86_64_gcc-11.4/include/python3.9 -DPython3_LIBRARY:FILEPATH=/opt/visit/third_party/python/3.9.18/linux-x86_64_gcc-11.4/lib/libpython3.9.so -DOPENGL_INCLUDE_DIR:PATH= -DOPENGL_gl_LIBRARY:STRING= -DOPENGL_opengl_LIBRARY:STRING= -DOPENGL_glu_LIBRARY:FILEPATH= -DVTK_OPENGL_HAS_OSMESA:BOOL=ON -DOSMESA_LIBRARY:STRING="/opt/visit/third_party/osmesa/17.3.9/linux-x86_64_gcc-11.4/lib/libOSMesa.so" -DOSMESA_INCLUDE_DIR:PATH=/opt/visit/third_party/osmesa/17.3.9/linux-x86_64_gcc-11.4/include -DVTK_USE_X:BOOL=OFF -DVTK_MODULE_ENABLE_VTK_RenderingRayTracing:STRING=YES -Dospray_DIR=/opt/visit/third_party/ospray/3.0.0/linux-x86_64_gcc-11.4/ospray/lib/cmake/ospray-3.0.0 -DVTK_MODULE_USE_EXTERNAL_VTK_zlib:BOOL=ON -DZLIB_INCLUDE_DIR:PATH=/opt/visit/third_party/zlib/1.2.13/linux-x86_64_gcc-11.4/include -DZLIB_LIBRARY_RELEASE:FILEPATH=/opt/visit/third_party/zlib/1.2.13/linux-x86_64_gcc-11.4/lib/libz.so ../VTK-9.2.6
...
...
...
-- Found OSMesa: /opt/visit/third_party/osmesa/17.3.9/linux-x86_64_gcc-11.4/include (found version "11.2.0") 
CMake Error at /opt/visit/third_party/cmake/3.24.3/linux-x86_64_gcc-11.4/share/cmake-3.24/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
  Could NOT find OpenGL (missing: OPENGL_opengl_LIBRARY OPENGL_INCLUDE_DIR)
Call Stack (most recent call first):
  /opt/visit/third_party/cmake/3.24.3/linux-x86_64_gcc-11.4/share/cmake-3.24/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE)
  CMake/patches/99/FindOpenGL.cmake:502 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  Rendering/OpenGL2/CMakeLists.txt:357 (find_package)

So, I changed the build file and specified the full path to my system's libGL.so and libGLU.so as follows:

    if [[ "$DO_VTK9" == "yes" ]] ; then
        if [[ "$DO_MESAGL" == "yes" ]] ; then
            vopts="${vopts} -DOPENGL_INCLUDE_DIR:PATH=${MESAGL_INCLUDE_DIR}"
            vopts="${vopts} -DOPENGL_gl_LIBRARY:STRING=${MESAGL_OPENGL_LIB}"
            vopts="${vopts} -DOPENGL_opengl_LIBRARY:STRING="
            vopts="${vopts} -DOPENGL_glu_LIBRARY:FILEPATH=${MESAGL_GLU_LIB}"
            # for now, until Mesa can be updated to a version that supports GLVND, set LEGACY preference
            vopts="${vopts} -DOpenGL_GL_PREFERENCE:STRING=LEGACY"
            vopts="${vopts} -DVTK_OPENGL_HAS_OSMESA:BOOL=ON"
            vopts="${vopts} -DOSMESA_LIBRARY:STRING=${MESAGL_OSMESA_LIB}"
            vopts="${vopts} -DOSMESA_INCLUDE_DIR:PATH=${MESAGL_INCLUDE_DIR}"

            if [[ "$DO_STATIC_BUILD" == "yes" ]] ; then
                if [[ "$DO_SERVER_COMPONENTS_ONLY" == "yes" || "$DO_ENGINE_ONLY" == "yes" ]] ; then
                    vopts="${vopts} -DVTK_OPENGL_HAS_OSMESA:BOOL=ON"
                    vopts="${vopts} -DOSMESA_LIBRARY:STRING=${MESAGL_OSMESA_LIB}"
                    vopts="${vopts} -DOSMESA_INCLUDE_DIR:PATH=${MESAGL_INCLUDE_DIR}"
                    vopts="${vopts} -DVTK_USE_X:BOOL=OFF"  
                fi 
            fi
        elif [[ "$DO_OSMESA" == "yes" ]] ; then
            #vopts="${vopts} -DOPENGL_INCLUDE_DIR:PATH="
            vopts="${vopts} -DOPENGL_INCLUDE_DIR:PATH=/usr/include"
            #vopts="${vopts} -DOPENGL_gl_LIBRARY:STRING="
            vopts="${vopts} -DOPENGL_gl_LIBRARY:STRING=/usr/lib/x86_64-linux-gnu/libGL.so"
            vopts="${vopts} -DOPENGL_opengl_LIBRARY:STRING="
            #vopts="${vopts} -DOPENGL_glu_LIBRARY:FILEPATH="
            vopts="${vopts} -DOPENGL_glu_LIBRARY:FILEPATH=/usr/lib/x86_64-linux-gnu/libGLU.so"
            vopts="${vopts} -DVTK_OPENGL_HAS_OSMESA:BOOL=ON"
            vopts="${vopts} -DOSMESA_LIBRARY:STRING=\"${OSMESA_LIB}\""
            vopts="${vopts} -DOSMESA_INCLUDE_DIR:PATH=${OSMESA_INCLUDE_DIR}"
            vopts="${vopts} -DVTK_USE_X:BOOL=OFF"
        fi

When I further built VisIt, ld reported undefined references to XOpenDisplay, XDisplayName, and XCloseDisplay. So, I manually added -lX11 to the tail of the following files:

engine/main/CMakeFiles/engine_par.dir/link.txt
engine/main/CMakeFiles/engine_ser.dir/link.txt
engine/main/CMakeFiles/engine_par_exe.dir/link.txt
engine/main/CMakeFiles/engine_ser_exe.dir/link.txt

Finally, VisIt was successfully built, packaged, and installed under /opt/visit. Unfortunately, the following error occurred when I tried to run VisIt:

u6600540@station03:~/Downloads/WarpX$ /opt/visit/bin/visit
Running: gui3.4.1
Running: viewer3.4.1 -geometry 1504x1048+416+32 -borders 26,4,4,4 -shift 0,0 -preshift 4,26 -defer -host 127.0.0.1 -port 5600
Running: mdserver3.4.1 -host 127.0.0.1 -port 5601
Error opening plugin file: /opt/visit/3.4.1/linux-x86_64/plugins/databases/libMIDXDatabase.so (/opt/visit/3.4.1/linux-x86_64/plugins/databases/libMIDXDatabase.so: undefined symbol: _ZN3MPI8Datatype4FreeEv)
2024-07-17 09:43:21.021 (   0.665s) [        C9E21C80]vtkOpenGLRenderWindow.c:511    ERR| vtkGenericOpenGLRenderWindow (0x5b39bcaa9e80): GLEW could not be initialized: Missing GL version
2024-07-17 09:43:21.036 (   0.680s) [        C9E21C80]vtkOpenGLRenderWindow.c:511    ERR| vtkGenericOpenGLRenderWindow (0x5b39bcaa9e80): GLEW could not be initialized: Missing GL version
VisIt's viewer exited abnormally! Aborting the Graphical User Interface. VisIt's developers may be reached via our GitHub discussions, https://github.com/visit-dav/visit/discussions

Helpful additional information

Expected behavior

The viewer should appear without exiting abnormally.

Desktop

cyrush commented 3 weeks ago

@devilkingsatan666 --osmesa builds VisIt with offscreen rendering support, so it should not need to use your system GL libs. Wiring them back in may have confused he build.

Are you trying to use the compiler wrappers from an existing visit install, I see:

/opt/visit/3.4.1/linux-x86_64/bin/mpicc

I suggest using --mpich to let visit build a copy of mpich thats not package in another visit build.

devilkingsatan666 commented 2 weeks ago

@cyrush Thank you so much for your reply. I wired them back to solve the CMake error: "Could NOT find OpenGL (missing: OPENGL_opengl_LIBRARY OPENGL_INCLUDE_DIR)." Should I wire them back to the GL provided in the /Path_To_VisIt/third_party/osmesa directory?

/opt/visit/3.4.1/linux-x86_64/bin/mpicc is OpenMPI of version 4.1.6 I pre-installed for this build of VisIt.

cyrush commented 2 weeks ago

Yes, the intent is for Mesa to take the place of system GL. Not sure what went wrong, but you may need to start with a clean build and dive into the VTK configure issue.

If you installed OpenMPI that should work --- we also can package mpich with visit and it would end up in a similar path if you installed a visit binary. I wanted to make sure something wasn't cross wired there.