proton 10.0-4x1 2026-08proton 11.0-1x1 2026-08proton 5.13x1 2026-08PROTON_LOG=1x1 2026-08PROTON_LOG=1`x1 2026-08PROTON_USE_WINED3D=1x1 2026-08PROTON_USE_WINED3D=1`x1 2026-08WINEDEBUG=+wincodecs,+sehx1 2026-08PROTON_USE_WINED3D=1 %command%x1 2026-080xc0000005x1 2026-08
Compatibility Report
4498200Workaround TL;DR
With Proton 10.0-4, the game launches and the main menu renders correctly.
System Information
I confirm:
"haven't found" - Tbf, yes but I currently didn't searched for, so thats why I could'nt find one - sorry, if a dupe exists
PROTON_LOG=1diff-steam-4498200.log
p11-steam-4498200.log
p10-steam-4498200.log
Symptoms
With Proton 10.0-4, the game launches and the main menu renders correctly.
With Proton 11.0-1, the game itself launches, but parts of the main menu fail to render correctly. The game log reports an exception while decoding an image through SharpDX/WIC:
Using
PROTON_USE_WINED3D=1 %command%same issue as well, so the issue does not appear to be DXVK-specific.Switching back to Proton 10.0-4 immediately resolves the issue.
Reproduction
System.NullReferenceExceptionin:ComStreamBaseVtbl.ReadImpl -> BitmapDecoder.GetFrame.Technical analysis
I compared WIC traces from Proton 10.0-4 and Proton 11.0-1.
The failing object in Proton 11 is created as:
9456a480-e88b-43ea-9e73-0b2d9b71b1caisCLSID_WICJpegDecoder.Proton 10.0-4
When the relevant JPEG reaches
GetFrame(), the trace shows:The frame is then processed normally and the game renders correctly.
Proton 11.0-1
For the corresponding JPEG decoder,
GetFrame()enters a different code path:So immediately before the access violation, Wine calls the underlying stream as effectively:
The access violation is a write to address 0.
The managed application stack identifies the callback receiving this call as:
and this becomes a managed:
The Proton trace subsequently also shows a CLR exception with:
which is consistent with the
NullReferenceExceptionobserved by the game.Likely regression trigger
This appears closely related to the Wine change:
The new
jpeg_decoder_get_metadata_blocks()implementation replaced the previous stub and contains calls equivalent to:as well as further
stream_read(..., NULL)calls while parsing APP1/Exif metadata.This matches the Proton 11 trace very closely:
whereas Proton 10.0-4 still shows:
and works.
API compatibility detail
According to the COM
ISequentialStream::Readcontract,pcbReadmay beNULLif the caller is not interested in the number of bytes actually read.Therefore Wine's call is apparently valid COM usage.
This suggests that the application/SharpDX stream implementation has a latent compatibility issue and assumes that
pcbReadis always non-NULL. However, the application works with Proton 10 and fails with Proton 11 because the newer Wine WindowsCodecs JPEG metadata path exposes this behavior.For that reason I am reporting this as a Proton regression / application compatibility regression, even though the underlying SharpDX behavior may technically be non-compliant or insufficiently defensive.
Possible Wine compatibility workaround
If avoiding
NULLforpcbReadis acceptable for application compatibility, the JPEG metadata parser could use a local variable, for example:instead of:
This is not necessary according to the COM API contract, but should avoid triggering the SharpDX stream implementation used by this game.
Test matrix
PROTON_USE_WINED3D=1Proton 5.13 was just a tip from ChatGPT
Summary
The regression appears to be:
The strongest suspect is therefore the interaction between the newer Wine
windowscodecsJPEG APP1 metadata implementation and SharpDX's managed COM stream wrapper.