Debug files (Proton log, GDB thread dump, per-thread CPU): https://gist.github.com/AbuBytes/3f124180f79a55a6373935183826f0e6
Hello @AbuBytes, we're using one issue report per unofficially supported game title, so I've gone ahead and transferred this issue report to https://github.com/ValveSoftware/Proton/issues/864#issuecomment-4075125236.
ge-proton10-32x1 2026-03proton 9.0-4x1 2026-03proton experimentalx1 2026-03DXVK_HUD=fps`)x1 2026-03PROTON_NO_ESYNC=1x1 2026-03PROTON_NO_FSYNC=1x1 2026-03PROTON_USE_WINED3D=0`x1 2026-03PROTON_USE_WINED3D=1`x1 2026-03WINEDEBUG=+d3d,+mfplat,+mmdevapi,+module,+ntdll`x1 2026-03WINEDEBUG=+relay`x1 2026-03WINEDLLOVERRIDES="gameoverlayrenderer64=d;gameoverlayrenderer=d"x1 2026-03WINEESYNC=0x1 2026-03WINEFSYNC=0`).x1 2026-03WINE_CPU_TOPOLOGY=4:0,1,2,3`x1 2026-03
Black Ops III: Game threads deadlocked in server_init_process_done on NVIDIA hybrid GPU laptop
System Information
Symptoms
After the Treyarch/Activision intro video plays successfully, the game shows a permanent black screen. DXVK HUD (
DXVK_HUD=fps) confirms frames are being presented at 62fps — the rendering pipeline works, but the game renders empty/black frames. No audio output (despite audio threads running andmmdevapirender buffers being filled). No crash. Process consumes ~270% CPU indefinitely.Root Cause Analysis
Using GDB attached to the running process, I identified that 5 game threads are permanently stuck in
server_init_process_done→NtWaitForMultipleObjects→__fsync_wait_objects. These threads never execute game code — stack inspection confirms no game code return addresses (0x140xxxxxx range) on any of their stacks.Stuck threads (all identical backtrace):
Backtrace (identical for all 5):
Working threads (not stuck):
Window, Input, dxvk-submit, dxvk-cs, dxvk-queue, Sound Decode, Sound Mix, Video Decode (×16), dxvk-shader-*, threaded-ml, Stream, StreamAsync — all function normally. The render pipeline works (swapchain created, frames presented via Vulkan), but there is no scene data to render because the gameplay threads (Database, Backend) that load assets are deadlocked.
strace profile of the game process:
Key Observations
Sync mechanism is irrelevant: Same deadlock with fsync, esync, and pure wineserver-side sync (
PROTON_NO_FSYNC=1 PROTON_NO_ESYNC=1 WINEESYNC=0 WINEFSYNC=0). The backtrace changes from__fsync_wait_objectsto__esync_wait_objectstowait_select_replyrespectively, but the threads remain stuck inNtWaitForMultipleObjectsregardless.Proton version is irrelevant: Identical behavior on Proton 9.0-4, 9.0 Beta, GE-Proton10-32, and Proton Experimental.
Steam overlay is irrelevant: Same deadlock with overlay fully removed (
LD_PRELOAD="" WINEDLLOVERRIDES="gameoverlayrenderer64=d;gameoverlayrenderer=d"). Confirmed via/proc/pid/mapsthat overlay .so was not loaded.Audio devices are irrelevant: Reduced from 9 ALSA devices (3 cards) to 1 card by unloading
snd_aloopkernel module and unbinding HDMI audio via sysfs. No effect.Display config is irrelevant: Tested Wine virtual desktop (1920x1080 via winecfg), single monitor (disabled HDMI-A-1 via
hyprctl keyword monitor HDMI-A-1,disable), config.ini with FullScreenMode=2/Monitor=0. No effect on the thread deadlock.Direct Wine launch behaves differently: When launching
BlackOps3.exedirectly throughwine64(bypassing Proton'ssteam.exewrapper), the game briefly shows the Wine virtual desktop and a safe mode dialog with game console — it does NOT black screen. However it crashes shortly after because it needs the Steam runtime. This strongly suggests thesteam.exe→BlackOps3.exeparent-child process launch path triggers the deadlock.Proton's BO3-specific workaround: Proton has a special code path for AppID 311210 that uses
wine(32-bit) +c:\Program Files (x86)\Steam\steam.exeinstead ofwine64+c:\windows\system32\steam.exe. Patching this to use the normal path did not fix the issue.Wineserver is healthy: strace on wineserver shows it actively processing ~12k writes/sec. It services other threads (Window, Input, Sound, DXVK) fine. It specifically never completes the init handshake for the 5 stuck threads.
vkcube/glxgears work fine: Both render correctly on the NVIDIA GPU via prime-run through Xwayland, confirming the GPU → compositor buffer handoff works. This is not a display/compositing issue.
What I Tried (35+ attempts)
PROTON_USE_WINED3D=0andPROTON_USE_WINED3D=1(WineD3D path showed GL_INVALID_OPERATION shader errors)VK_LOADER_DRIVERS_SELECT=nvidia_icd.jsonto hide AMD GPU from VulkanWINE_CPU_TOPOLOGY=4:0,1,2,3to reduce thread spawn parallelismWINEDEBUG=+relay(game crashes under the logging overhead before reaching black screen)WINEDEBUG=+d3d,+mfplat,+mmdevapi,+module,+ntdllanalysisdxvk.confwithdxgi.enableExclusiveFullscreen = False(read by DXVK butExclusive FS: 1persists)Reproduction
ps -T -p $(pgrep -f BlackOps3.exe) -o spid,%cpu,comm | sort -k2 -rnshows Database/2_Backend/BlackOps3.exe at 70-92% CPUthread apply all bt 10shows all busy threads stuck inserver_init_process_doneAttached Files
steam-311210.log— Proton log from a clean launch (Proton Experimental)gdb-thread-dump.txt— Full GDB backtrace of all ~80 threadsthread-cpu.txt— Per-thread CPU usage snapshot