virtio-gpu-gl-pci console tries to make GL context before widget is realized leading to crash
Host environment
- Operating system: Arch Linux
- OS/kernel version: Linux archlinux 6.3.7-arch1-1 #1 SMP PREEMPT_DYNAMIC Sat, 10 Jun 2023 00:35:35 +0000 x86_64 GNU/Linux
- Architecture: x86
- QEMU flavor: qemu-system-x86_64
- QEMU version: freshly cloned at commit b455ce4c
- QEMU command line:
./qemu-system-x86_64 -drive if=pflash,format=raw,readonly=on,file=/usr/share/edk2-ovmf/x64/OVMF_CODE.fd -device virtio-gpu-gl -display gtk,gl=on
Description of problem
When -vga none
is added to the command line, there is no crash.
When it is not, two GtkGLArea
widgets are created: one for VGA and one for virtio-gpu-gl-pci
. Only the first one is realized, but the virgl code tries to create a GL context for the second. In gd_gl_area_create_context
, gtk_widget_get_window(vc->gfx.drawing_area)
evaluates to NULL a crash follows:
qemu: Gdk: gdk_window_create_gl_context: assertion 'GDK_IS_WINDOW (window)' failed
qemu: Gdk: gdk_gl_context_set_required_version: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_realize: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_make_current: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_get_version: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gtk: gtk_gl_area_make_current: assertion 'gtk_widget_get_realized (widget)' failed
qemu: Gdk: gdk_window_create_gl_context: assertion 'GDK_IS_WINDOW (window)' failed
qemu: Gdk: gdk_gl_context_set_required_version: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_realize: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_make_current: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_get_version: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gtk: gtk_gl_area_make_current: assertion 'gtk_widget_get_realized (widget)' failed
qemu: Gdk: gdk_window_create_gl_context: assertion 'GDK_IS_WINDOW (window)' failed
qemu: Gdk: gdk_gl_context_set_required_version: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_realize: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_make_current: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_get_version: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gtk: gtk_gl_area_make_current: assertion 'gtk_widget_get_realized (widget)' failed
qemu: Gdk: gdk_window_create_gl_context: assertion 'GDK_IS_WINDOW (window)' failed
qemu: Gdk: gdk_gl_context_set_required_version: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_realize: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_make_current: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_get_version: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gtk: gtk_gl_area_make_current: assertion 'gtk_widget_get_realized (widget)' failed
qemu: Gdk: gdk_window_create_gl_context: assertion 'GDK_IS_WINDOW (window)' failed
qemu: Gdk: gdk_gl_context_set_required_version: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_realize: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_make_current: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_get_version: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gtk: gtk_gl_area_make_current: assertion 'gtk_widget_get_realized (widget)' failed
qemu: Gdk: gdk_window_create_gl_context: assertion 'GDK_IS_WINDOW (window)' failed
qemu: Gdk: gdk_gl_context_set_required_version: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_realize: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_make_current: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_get_version: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gtk: gtk_gl_area_make_current: assertion 'gtk_widget_get_realized (widget)' failed
qemu: Gdk: gdk_window_create_gl_context: assertion 'GDK_IS_WINDOW (window)' failed
qemu: Gdk: gdk_gl_context_set_required_version: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_realize: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_make_current: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_get_version: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gtk: gtk_gl_area_make_current: assertion 'gtk_widget_get_realized (widget)' failed
qemu: Gdk: gdk_window_create_gl_context: assertion 'GDK_IS_WINDOW (window)' failed
qemu: Gdk: gdk_gl_context_set_required_version: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_realize: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_make_current: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_get_version: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gtk: gtk_gl_area_make_current: assertion 'gtk_widget_get_realized (widget)' failed
qemu: Gdk: gdk_window_create_gl_context: assertion 'GDK_IS_WINDOW (window)' failed
qemu: Gdk: gdk_gl_context_set_required_version: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_realize: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_make_current: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_get_version: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gtk: gtk_gl_area_make_current: assertion 'gtk_widget_get_realized (widget)' failed
qemu: Gdk: gdk_window_create_gl_context: assertion 'GDK_IS_WINDOW (window)' failed
qemu: Gdk: gdk_gl_context_set_required_version: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_realize: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_make_current: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_get_version: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gtk: gtk_gl_area_make_current: assertion 'gtk_widget_get_realized (widget)' failed
qemu: Gdk: gdk_window_create_gl_context: assertion 'GDK_IS_WINDOW (window)' failed
qemu: Gdk: gdk_gl_context_set_required_version: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_realize: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_make_current: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gdk: gdk_gl_context_get_version: assertion 'GDK_IS_GL_CONTEXT (context)' failed
qemu: Gtk: gtk_gl_area_make_current: assertion 'gtk_widget_get_realized (widget)' failed
qemu: Gdk: gdk_gl_context_make_current: assertion 'GDK_IS_GL_CONTEXT (context)' failed
gl_version 0 - compat profile
WARNING: running without ARB/KHR robustness in place may crash
qemu-system-x86_64: ../libepoxy/src/dispatch_common.c:872: epoxy_get_proc_address: Assertion `0 && "Couldn't find current GLX or EGL context.\n"' failed.
Steps to reproduce
- Get OVMF. On Arch Linux, you can install the
edk2-ovmf
package. On other distros, find a similar package and modify the path in the command accordingly. - Run the command above.