qmlglsink: QtGLVideoItem destructor breaks Qt rendering with "QEGLPlatformContext: eglSwapBuffers failed: 3001" error if GstGLVideoItem is never used in pipeline on IMX8MM Vivante EGL
Issue originally discovered in 1.22.1, but reproduced with 1.22.6 too. Using Qt 5.15.15.
This is what happens when QML scene changes (items destroyed via StackView.replace()
etc), in result destroying GstGLVideoItem
:
(GST_DEBUG="*:3,gl*:7,qt*:7"
output)
Nov 09 09:39:21 imx8mmevk envInitScript.sh[1648]: 0:03:08.195660703 1648 0xaaaae23f9600 INFO qtglwidget qtitem.cc:144:~QtGLVideoItem: 0xaaaae2dcd580 Destroying QtGLVideoItem and invalidating the proxy 0xaaaae2e3e240
Nov 09 09:39:21 imx8mmevk envInitScript.sh[1648]: 0:03:08.195935191 1648 0xaaaae23f9600 DEBUG glcontext gstglcontext.c:746:gst_gl_context_finalize:<glwrappedcontext0> End of finalize
Nov 09 09:39:21 imx8mmevk envInitScript.sh[1648]: 0:03:08.196394171 1648 0xaaaae23f9600 TRACE gldisplay gstgldisplay.c:251:gst_gl_display_finalize:<gldisplayvivfb0> finalizing
Nov 09 09:39:21 imx8mmevk envInitScript.sh[1648]: 0:03:08.212644957 1648 0xaaaae23f9600 TRACE gldisplay gstgldisplay.c:251:gst_gl_display_finalize:<gldisplayegl0> finalizing
Nov 09 09:39:21 imx8mmevk envInitScript.sh[1648]: QEGLPlatformContext: eglSwapBuffers failed: 3001
Nov 09 09:39:21 imx8mmevk envInitScript.sh[1648]: QEGLPlatformContext: eglSwapBuffers failed: 3001
Nov 09 09:39:21 imx8mmevk envInitScript.sh[1648]: QEGLPlatformContext: eglSwapBuffers failed: 3001
Nov 09 09:39:21 imx8mmevk envInitScript.sh[1648]: QEGLPlatformContext: eglSwapBuffers failed: 3001
Nov 09 09:39:21 imx8mmevk envInitScript.sh[1648]: QEGLPlatformContext: eglSwapBuffers failed: 3001
Nov 09 09:39:21 imx8mmevk envInitScript.sh[1648]: QEGLPlatformContext: eglSwapBuffers failed: 3001
Nov 09 09:39:21 imx8mmevk envInitScript.sh[1648]: QEGLPlatformContext: eglSwapBuffers failed: 3001
Nov 09 09:39:21 imx8mmevk envInitScript.sh[1648]: QEGLPlatformContext: eglSwapBuffers failed: 3001
Nov 09 09:39:21 imx8mmevk envInitScript.sh[1648]: QEGLPlatformContext: eglSwapBuffers failed: 3001
...
Qt application UI hangs, output is being spammed with QEGLPlatformContext: eglSwapBuffers failed: 3001
, and does not recover.
This reproduces only when g_object_set(m_sink, "widget", m_item, nullptr);
is never called, i.e. GstGLVideoItem item exists but is never used in qmlglsink
, and so far only in IMX8MM ARM device with Vivante EGL backend. On X11 Linux amd64 machines there's no such issue.
Qt application is launched like this:
export QT_QPA_PLATFORM=eglfs
export QT_QPA_EGLFS_INTEGRATION=eglfs_viv
export QT_QPA_EGLFS_FB=/dev/fb0
export QT_QPA_EGLFS_FORCE888=32
export QT_QPA_EGLFS_FORCEVSYNC=1
export QT_QPA_EGLFS_KMS_CONFIG="/etc/kms.conf"
export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event1
export QT_QPA_EVDEV_MOUSE_PARAMETERS=/dev/input/event1
export QT_QPA_FB_HIDECURSOR=1
./MyApp -platform eglfs