VirtIO-GPU commands may be processed outside of main-loop, from a CPU thread. This results in GL context switch failure because context is held by main-loop thread when GL is invoked from CPU thread. Always release GL context after performing GL operations such that other threads could take over the context.
0 SDL_GL_MakeCurrent() (libSDL3) 1 SDL_GL_MakeCurrent_REAL() (libSDL2) 2 sdl2_gl_make_context_current() (ui/sdl2-gl.c:201) 3 make_current() (virglrenderer.c:639) 4 vrend_finish_context_switch() (vrend_renderer.c:11630) 5 vrend_hw_switch_context() (vrend_renderer.c:11613) 6 vrend_renderer_force_ctx_0() (vrend_renderer.c:12986) 7 virgl_renderer_force_ctx_0() (virglrenderer.c:460) 8 virtio_gpu_virgl_process_cmd() (virtio-gpu-virgl.c:1013) 9 virtio_gpu_process_cmdq() (virtio-gpu.c:1050) 10 virtio_gpu_gl_handle_ctrl() (virtio-gpu-gl.c:86) 11 aio_bh_poll() (util/async.c) 12 aio_poll() (util/aio-posix.c) 13 blk_pwrite() (block/block-gen.c:1985) 14 pflash_update() (pflash_cfi01.c:396) 15 pflash_write() (pflash_cfi01.c:541) 16 memory_region_dispatch_write() (system/memory.c:1554) 17 flatview_write() (system/physmem.c:3333) 18 address_space_write() (system/physmem.c:3453) 19 kvm_cpu_exec() (accel/kvm/kall-all.c:3248) 20 kvm_vcpu_thread_fn() (accel/kvm/kaccel-ops.c:53) Signed-off-by: Dmitry Osipenko <[email protected]> --- ui/sdl2-gl.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ui/sdl2-gl.c b/ui/sdl2-gl.c index 55e22a7a3d59..936b15f737d8 100644 --- a/ui/sdl2-gl.c +++ b/ui/sdl2-gl.c @@ -57,6 +57,8 @@ static void sdl2_gl_render_surface(struct sdl2_console *scon) surface_gl_render_texture(scon->gls, scon->surface); SDL_GL_SwapWindow(scon->real_window); + + SDL_GL_MakeCurrent(scon->real_window, NULL); } void sdl2_gl_update(DisplayChangeListener *dcl, @@ -73,6 +75,8 @@ void sdl2_gl_update(DisplayChangeListener *dcl, SDL_GL_MakeCurrent(scon->real_window, scon->winctx); surface_gl_update_texture(scon->gls, scon->surface, x, y, w, h); scon->updates++; + + SDL_GL_MakeCurrent(scon->real_window, NULL); } void sdl2_gl_switch(DisplayChangeListener *dcl, @@ -91,6 +95,7 @@ void sdl2_gl_switch(DisplayChangeListener *dcl, if (surface_is_placeholder(new_surface) && qemu_console_get_index(dcl->con)) { qemu_gl_fini_shader(scon->gls); scon->gls = NULL; + SDL_GL_MakeCurrent(scon->real_window, NULL); sdl2_window_destroy(scon); return; } @@ -105,6 +110,8 @@ void sdl2_gl_switch(DisplayChangeListener *dcl, } surface_gl_create_texture(scon->gls, scon->surface); + + SDL_GL_MakeCurrent(scon->real_window, NULL); } void sdl2_gl_refresh(DisplayChangeListener *dcl) -- 2.52.0
