EGL Segmentation fault in VTK-9.0.1
I am trying to do some off-screen rendering stuff. OSMesa is working great, but EGL is not.
Got segmentation fault when I was trying to do renderWindow->render()
.
Gdb output
Reading symbols from build/OffScreenRendering...
(gdb) run
Starting program: /home/XXX/vtkExamples/OffScreenRenderingEgl/build/OffScreenRendering
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff79d0664 in vtkOpenGLCamera::Render (this=0x5555555a8a00, ren=0x5555555a3dc0)
at /home/XXX/VTK/VTK-9.0.1/Rendering/OpenGL2/vtkOpenGLCamera.cxx:55
55 vtkOpenGLState* ostate = win->GetState();
(gdb)
valgrind output
==37346== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
==37346==
==37346== 1 errors in context 1 of 1:
==37346== Invalid read of size 8
==37346== at 0x4D3C664: vtkOpenGLCamera::Render(vtkRenderer*) (vtkOpenGLCamera.cxx:55)
==37346== by 0x521F9CC: vtkRenderer::UpdateCamera() (vtkRenderer.cxx:485)
==37346== by 0x4E041A0: vtkOpenGLRenderer::DeviceRender() (vtkOpenGLRenderer.cxx:255)
==37346== by 0x521F1AB: vtkRenderer::Render() (vtkRenderer.cxx:377)
==37346== by 0x52348CD: vtkRendererCollection::Render() (vtkRendererCollection.cxx:51)
==37346== by 0x5201C8D: vtkRenderWindow::DoStereoRender() (vtkRenderWindow.cxx:337)
==37346== by 0x5201A4A: vtkRenderWindow::Render() (vtkRenderWindow.cxx:297)
==37346== by 0x10B51D: main (OffScreenRendering.cxx:35)
==37346== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==37346==
These are my codes.
compile-EGL.sh
if [ ! -d "VTK-9.0.1" ]; then
wget -c https://www.vtk.org/files/release/9.0/VTK-9.0.1.tar.gz -O - | tar -xz
fi
cd VTK-9.0.1
if [ ! -d "build" ]; then
mkdir build
fi
cd build
cmake .. \
-D"VTK_OPENGL_HAS_EGL:BOOL=ON" \
-D"VTK_OPENGL_HAS_OSMESA:BOOL=OFF" \
-D"VTK_USE_X:BOOL=OFF"
CMakeLists.txt
cmake_minimum_required(VERSION 3.3 FATAL_ERROR)
project(OffScreenRendering)
set(CMAKE_BUILD_TYPE Debug)
find_package(VTK COMPONENTS
vtkCommonCore
vtkCommonDataModel
vtkFiltersSources
vtkIOImage
vtkInteractionStyle
vtkRenderingCore
vtkRenderingFreeType
vtkRenderingOpenGL2 QUIET)
if (NOT VTK_FOUND)
message("Skipping OffScreenRendering: ${VTK_NOT_FOUND_MESSAGE}")
return ()
endif()
message (STATUS "VTK_VERSION: ${VTK_VERSION}")
if (VTK_VERSION VERSION_LESS "8.90.0")
# old system
include(${VTK_USE_FILE})
add_executable(OffScreenRendering MACOSX_BUNDLE OffScreenRendering.cxx )
target_link_libraries(OffScreenRendering PRIVATE ${VTK_LIBRARIES})
else ()
# include all components
add_executable(OffScreenRendering MACOSX_BUNDLE OffScreenRendering.cxx )
target_link_libraries(OffScreenRendering PRIVATE ${VTK_LIBRARIES})
# vtk_module_autoinit is needed
vtk_module_autoinit(
TARGETS OffScreenRendering
MODULES ${VTK_LIBRARIES}
)
endif ()
OffScreenRendering.cxx
// These 2 lines are needed due to:
// http://www.vtk.org/Wiki/VTK/VTK_6_Migration/Factories_now_require_defines
#define vtkRenderingCore_AUTOINIT 4(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingFreeTypeOpenGL,vtkRenderingOpenGL)
#define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL)
// #define VTK_USE_OFFSCREEN_EGL
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkPolyData.h>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkWindowToImageFilter.h>
#include <vtkPNGWriter.h>
#include <vtkGraphicsFactory.h>
int main ()
{
//sphere 1
vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(sphereSource->GetOutputPort());
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
// a renderer and render window
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
// renderWindow->SetOffScreenRendering(1);
renderer->AddActor(actor);
renderWindow->AddRenderer(renderer);
renderWindow->Render();
vtkSmartPointer<vtkWindowToImageFilter> windowToImageFilter =
vtkSmartPointer<vtkWindowToImageFilter>::New();
windowToImageFilter->SetInputBufferTypeToRGBA();
windowToImageFilter->SetInput(renderWindow);
windowToImageFilter->Update();
vtkSmartPointer<vtkPNGWriter> writer = vtkSmartPointer<vtkPNGWriter>::New();
writer->SetFileName("sphere.png");
writer->SetInputConnection(windowToImageFilter->GetOutputPort());
writer->Write();
return 0;
}
My system setup: Intel i5-8500 with UHD 630, Ubuntu 20.04 LTS.
Opengl versions: glxinfo | grep "version"
server glx version string: 1.4
client glx version string: 1.4
GLX version: 1.4
Max core profile version: 4.6
Max compat profile version: 4.6
Max GLES1 profile version: 1.1
Max GLES[23] profile version: 3.2
OpenGL core profile version string: 4.6 (Core Profile) Mesa 20.0.8
OpenGL core profile shading language version string: 4.60
OpenGL version string: 4.6 (Compatibility Profile) Mesa 20.0.8
OpenGL shading language version string: 4.60
OpenGL ES profile version string: OpenGL ES 3.2 Mesa 20.0.8
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20
GL_EXT_shader_implicit_conversions, GL_EXT_shader_integer_mix,