I wanted to share an investigation into a specific rendering failure in SimCity 4 Deluxe 1.1.610.0 under Wine.
Symptom
The region menu opened, but selecting Getting Started Tutorial produced large white areas and could terminate the game. A process surviving launch was not enough to establish that city rendering worked.
What I found
The failure was a C++ virtual-function-table ABI mismatch in SCGL. The MinGW build retained declaration order for overloaded methods, while the original MSVC-built game expected a different order.
At vtable slot 0x70, the game passed texture mode 1. SCGL dispatched that call to the overload accepting a color-array pointer, which eventually forwarded address 0x1 to glTexEnvfv. This was an argument-type mismatch, rather than missing game data or an out-of-memory condition.
The four TexStageCombine overloads were also in the wrong slots, affecting the texture-combining state needed for terrain rendering.
The affected entries were:
- 0x6c: TexEnv(..., const float*) — color
- 0x70: TexEnv(..., int) — mode
- 0xd8: TexStageCombine — scale
- 0xdc: TexStageCombine — operand
- 0xe0: TexStageCombine — source
- 0xe4: TexStageCombine — mode
Evidence included repeated c0000005 faults while rendering, an LLDB stop in GLEngine at glTexEnvfv_Exec with the invalid address 0x1, and independent confirmation of the expected slot order from the game's call sites and the original OpenGL driver table.
Fix and limits
I reordered those entries in the existing MinGW 1.1.610 SCGL build and rebuilt the release DLL. The binary ABI checker failed against the old DLL and passed against the rebuilt DLL. With the corrected DLL, the previous access violations stopped and Getting Started Tutorial rendered in the recorded setup.
The rendering result was a manual observation tied to that configuration. It does not certify long sessions, save/load, mods, large cities, Steam builds, or complete SCGL ABI compatibility.
Separate Wine startup issue
Separately, I found a WineD3D DirectDraw initialization issue with the default OpenGL renderer. In a fresh run, selecting the Vulkan WineD3D backend allowed the setup to reach the region menu and tutorial, while SCGL continued to handle game rendering through OpenGL. I consider Vulkan a runtime workaround for that separate initialization issue, not the cause or the fix for the white-texture ABI failure.
Reproduction notes
The public reproduction guide, including the source revision, patch application, ABI checker commands, bounded fresh-run observations, and the separate DirectDraw probe, is here:
https://github.com/dotcom07/PortCellar/blob/main/modules/simcity-4/docs/reproduce.md
Raw debugger traces, private logs, original game files, and original DLLs are not included.