godot: Radeon Vulkan (radv) driver crash on Linux with -O1 or -O2 optimizations (target=release_debug build with GCC 10)
Godot version:
master (0cd98ec7e13038d09a77cf821e930be79026f943)
OS/device including version: Mageia 8 (Linux)
CPU: Topology: Quad Core model: Intel Core i7-8705G bits: 64 type: MT MCP L2 cache: 8192 KiB
Graphics: Device-1: Intel HD Graphics 630 driver: i915 v: kernel
Device-2: Advanced Micro Devices [AMD/ATI] Polaris 22 XL [Radeon RX Vega M GL] driver: amdgpu v: kernel
Display: x11 server: Mageia X.org 1.20.8 driver: intel,v4l resolution: 1: 1920x1080 2: 1920x1080
OpenGL: renderer: AMD VEGAM (DRM 3.37.0 5.7.9-desktop-1.mga8 LLVM 10.0.0) v: 4.6 Mesa 20.1.1
Issue specific to the AMD GPU, using the radv driver from Mesa 20.1.1.
Compiling with:
gcc (Mageia 10.2.0-0.RC.1.mga8) 10.2.0
Issue description:
While I can run Godot fine with a tools=yes target=debug build (default parameters), an optimized tools=yes target=release_debug build crashes on the AMD Radeon RX Vega M GPU with Mesa’s radv.
If I force the use of the Intel GPU, it doesn’t crash.
Backtrace (I built with target=debug debug_symbols=full to have more debug info):
Thread 1 "godot.linuxbsd." received signal SIGSEGV, Segmentation fault.
0x00007ffff78a6ce4 in __memmove_avx_unaligned_erms () from /lib64/libc.so.6
(gdb) bt
#0 0x00007ffff78a6ce4 in __memmove_avx_unaligned_erms () from /lib64/libc.so.6
#1 0x00007ffff54c97ef in memcpy (__len=<optimized out>, __src=0x6226a8c, __dest=<optimized out>) at /usr/include/bits/string_fortified.h:34
#2 radv_flush_constants (cmd_buffer=cmd_buffer@entry=0x62262a0, stages=<optimized out>, stages@entry=31) at ../src/amd/vulkan/radv_cmd_buffer.c:2410
#3 0x00007ffff54ca615 in radv_upload_graphics_shader_descriptors (cmd_buffer=cmd_buffer@entry=0x62262a0, pipeline_is_dirty=pipeline_is_dirty@entry=true) at ../src/amd/vulkan/radv_cmd_buffer.c:2651
#4 0x00007ffff54cd6e0 in radv_draw (cmd_buffer=0x62262a0, info=info@entry=0x7fffffffc720) at ../src/amd/vulkan/radv_cmd_buffer.c:4837
#5 0x00007ffff54cf69e in radv_CmdDrawIndexed (commandBuffer=<optimized out>, indexCount=<optimized out>, instanceCount=<optimized out>, firstIndex=<optimized out>, vertexOffset=<optimized out>,
firstInstance=<optimized out>) at ../src/amd/vulkan/radv_cmd_buffer.c:4901
#6 0x0000000002becb1d in RasterizerCanvasRD::_render_item (this=0x7fffe8427020, p_draw_list=<optimized out>, p_item=<optimized out>, p_framebuffer_format=<optimized out>, p_canvas_transform_inverse=...,
current_clip=<optimized out>, p_lights=<optimized out>, p_pipeline_variants=<optimized out>) at servers/rendering/rasterizer_rd/rasterizer_canvas_rd.cpp:864
#7 0x0000000002bee717 in RasterizerCanvasRD::_render_items (this=0x7fffe8427020, p_to_render_target=..., p_item_count=<optimized out>, p_canvas_transform_inverse=..., p_lights=0x0, p_screen_uniform_set=...)
at servers/rendering/rasterizer_rd/rasterizer_canvas_rd.cpp:1362
#8 0x0000000002bef23a in RasterizerCanvasRD::canvas_render_items (this=0x7fffe8427020, p_to_render_target=..., p_item_list=<optimized out>, p_modulate=..., p_light_list=0x0, p_canvas_transform=...)
at servers/rendering/rasterizer_rd/rasterizer_canvas_rd.cpp:1524
#9 0x0000000002bda8ff in RenderingServerCanvas::render_canvas (this=<optimized out>, p_render_target=..., p_canvas=p_canvas@entry=0x73bdf70, p_transform=..., p_lights=0x0,
p_masked_lights=p_masked_lights@entry=0x0, p_clip_rect=...) at servers/rendering/rendering_server_canvas.cpp:265
#10 0x0000000002a382f9 in RenderingServerViewport::_draw_viewport (this=0x62ab370, p_viewport=0x7479bb0, p_eye=XRInterface::EYE_MONO) at servers/rendering/rendering_server_viewport.cpp:257
#11 0x0000000002a39709 in RenderingServerViewport::draw_viewports (this=0x62ab370) at servers/rendering/rendering_server_viewport.cpp:413
#12 0x0000000002a0a7ca in RenderingServerRaster::draw (this=0x5ba65d0, p_swap_buffers=<optimized out>, frame_step=0.39811098575592041) at servers/rendering/rendering_server_raster.cpp:112
#13 0x00000000007d4e3e in Main::iteration () at main/main.cpp:2204
#14 0x00000000007b5359 in OS_LinuxBSD::run (this=this@entry=0x7fffffffd1d0) at platform/linuxbsd/os_linuxbsd.cpp:238
#15 0x00000000007b0cf3 in main (argc=1, argv=0x7fffffffd6c8) at platform/linuxbsd/godot_linuxbsd.cpp:55
This is likely a Mesa driver bug, but opening an issue here to track it and see if it might be triggered by something specific we do.
The only difference between target=debug and target=release_debug is the optimization level (-O2) and the use of -rdynamic. I suspect that the optimization might be the problem, I’ll do some tests to figure it out, and open a Mesa bug report.
Steps to reproduce:
scons p=linuxbsd tools=yes target=release_debug debug_symbols=full- Run it, poof
Minimal reproduction project: Crashes even in the project manager.
About this issue
- Original URL
- State: closed
- Created 4 years ago
- Comments: 23 (20 by maintainers)
Here you create a command buffer:
https://github.com/godotengine/godot/blob/2efba270899b2852fa67cad05a55fc81decb24cd/drivers/vulkan/rendering_device_vulkan.cpp#L7186
maybe the buffer is in a bad state and
Mesathan reads more that it ought to? I would dump its content at the place it crashes.valgrinddoes seem to find some invalid reads: