A tester ran 4.12.233 under Proton and it died on first mission load. The cause turned out to name itself, and to be a Windows bug we have been shipping the whole time. Wine implements d3dx9_43 itself, and 63 of its 329 exports are stubs. The game imports twenty of them and exactly one is stubbed: D3DXConcatenateMeshes, called once per session from ConsolidateStaticObjects on the first-mission-load latch - so every player hits it on their first race. Wine raised EXCEPTION_WINE_STUB naming the function in plain text, and our own crash filter caught it and wrote a minidump, which is how a self-describing failure arrived as a mystery. The fix is one file, and it was overdue on Windows. d3dx9_43.dll is a HARD import of the exe - only steam_api.dll is delay-loaded - and it is not part of Windows. It ships with the June 2010 DirectX End-User Runtime and nothing else. Any customer on a clean Windows 10 or 11 who never installed that redistributable cannot start the game at all: the loader fails at 0xC0000135 before WinMain, no window, no log line. Every machine this has been built or tested on had the SDK or some older game installed, which is precisely why nobody has ever seen it. pack-dist now extracts the DLL from the SDK's redist cab into dist. Wine prefers an application-directory DLL over its builtin, so the same file closes the Windows failure and the Linux blocker together, and it is verified working on a stock prefix with nothing installed. The SDK terms nominate DXSETUP as the delivery method for this redistributable; the loose DLL is what is verified and is near-universal practice, but that wants confirming before a public release. /LARGEADDRESSAWARE, because the same session reported VmSize 3193MB and an older Wine that died before video init with the address space exhausted. The game is not using that memory: measured here, a standalone mission peaks at 166MB committed against 795MB of address space. The gap is reservations, mapped files, and mostly the graphics driver mapping VRAM apertures into our process - under wined3d's OpenGL path that grows several times over. For a 32-bit process the 2GB address ceiling is a hard limit with nothing to do with RAM, so it is entirely possible to run out of addresses while using 170MB. The flag raises it to 4GB, frees nothing, and changes no behaviour. Worth having on Windows too: 795MB of 2GB is already 40% before 1080p, eight pods, and the 100MB buffer RP412RECORDSIZE takes when recording is armed. And two diagnostics so the next one costs a log line instead of an investigation. The crash filter now decodes 0x80000100 and writes the offending module.function before the minidump; startup probes wine_get_version in ntdll and logs the platform beside the version banner. Neither can appear on Windows - verified: the smoke run's log has the version line and no platform line. Not fixed here, deliberately: the durable version of this is to write the mesh merge by hand, since D3DXSimplifyMesh and D3DXSplitMesh are stubs too and any future mesh work hits the same wall. And the field test ran wined3d, not DXVK, so the child-window Present with GDI panes clipped over it - the risk the assessment led with - is still untested. The doc records both, along with the prediction it got wrong: the windowsapp.lib import was called a load-time failure risk under Wine, and it simply is not one. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
224 lines
11 KiB
XML
224 lines
11 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
<ItemGroup Label="ProjectConfigurations">
|
|
<ProjectConfiguration Include="Debug|Win32">
|
|
<Configuration>Debug</Configuration>
|
|
<Platform>Win32</Platform>
|
|
</ProjectConfiguration>
|
|
<ProjectConfiguration Include="Release|Win32">
|
|
<Configuration>Release</Configuration>
|
|
<Platform>Win32</Platform>
|
|
</ProjectConfiguration>
|
|
</ItemGroup>
|
|
<PropertyGroup Label="Globals">
|
|
<ProjectGuid>{01B740F7-5D4E-4E42-893F-CE018E5EE785}</ProjectGuid>
|
|
<RootNamespace>RP_L4</RootNamespace>
|
|
<Keyword>Win32Proj</Keyword>
|
|
</PropertyGroup>
|
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
|
<PropertyGroup Label="Configuration">
|
|
<ConfigurationType>Application</ConfigurationType>
|
|
<PlatformToolset>v143</PlatformToolset>
|
|
<CharacterSet>Unicode</CharacterSet>
|
|
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
|
</PropertyGroup>
|
|
<PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
|
|
<UseDebugLibraries>true</UseDebugLibraries>
|
|
</PropertyGroup>
|
|
<PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
|
|
<UseDebugLibraries>false</UseDebugLibraries>
|
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
|
</PropertyGroup>
|
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
|
<PropertyGroup>
|
|
<OutDir>$(SolutionDir)$(Configuration)\</OutDir>
|
|
<IntDir>$(Configuration)\</IntDir>
|
|
<TargetName>rpl4opt</TargetName>
|
|
<!-- Legacy DirectX SDK (June 2010) after the Windows SDK so modern headers/libs win;
|
|
only d3dx9 and dxerr actually come from it. -->
|
|
<IncludePath>$(IncludePath);$(DXSDK_DIR)Include;..\extern\steamworks_sdk_165\sdk\public</IncludePath>
|
|
<LibraryPath>$(LibraryPath);$(DXSDK_DIR)Lib\x86;..\extern\steamworks_sdk_165\sdk\redistributable_bin</LibraryPath>
|
|
</PropertyGroup>
|
|
<PropertyGroup Condition="'$(Configuration)'=='Debug'">
|
|
<LinkIncremental>true</LinkIncremental>
|
|
</PropertyGroup>
|
|
<PropertyGroup Condition="'$(Configuration)'=='Release'">
|
|
<LinkIncremental>false</LinkIncremental>
|
|
</PropertyGroup>
|
|
<ItemDefinitionGroup>
|
|
<ClCompile>
|
|
<WarningLevel>Level3</WarningLevel>
|
|
<ConformanceMode>false</ConformanceMode>
|
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
|
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
|
<!-- The engine's on-disk and on-wire binary formats assume 1-byte packing. -->
|
|
<StructMemberAlignment>1Byte</StructMemberAlignment>
|
|
<!-- RP412_STEAM: Steam transport available; activated at runtime by RP412STEAM=1. -->
|
|
<PreprocessorDefinitions>WIN32;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;WINDOWS_IGNORE_PACKING_MISMATCH;_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS;RP412_STEAM;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
<DisableSpecificWarnings>4996;4244;4267;4305;4018;4138;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
|
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
|
</ClCompile>
|
|
<Link>
|
|
<SubSystem>Windows</SubSystem>
|
|
<TargetMachine>MachineX86</TargetMachine>
|
|
<!-- Same source files are compiled into both Munga_l4.lib and this exe
|
|
(WTPresets.cpp et al.), as in the original projects. -->
|
|
<AdditionalOptions>/FORCE:MULTIPLE %(AdditionalOptions)</AdditionalOptions>
|
|
<AdditionalLibraryDirectories>..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
|
<!-- legacy_stdio_definitions satisfies the June-2010 dxerr.lib on modern MSVC. -->
|
|
<AdditionalDependencies>ws2_32.lib;dinput8.lib;dxguid.lib;OpenAL32.lib;libsndfile-1.lib;d3d9.lib;legacy_stdio_definitions.lib;steam_api.lib;delayimp.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
|
<!-- steam_api.dll is DELAY-LOADED so the game runs without it: a
|
|
statically imported DLL that is merely absent kills the process
|
|
at load time, before any window or log line (0xC0000135). Now
|
|
nothing touches it until Steam is actually asked for, and
|
|
SteamNetTransport_ClientLibraryPresent() gates the call sites so
|
|
a missing DLL falls back to TCP instead of raising the
|
|
delay-load helper's fatal exception. delayimp.lib supplies that
|
|
helper. -->
|
|
<DelayLoadDLLs>steam_api.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
|
|
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
|
<!-- /LARGEADDRESSAWARE: a 32-bit process gets 2GB of user ADDRESS
|
|
SPACE by default, which is a separate and much scarcer resource
|
|
than memory. Measured standalone mission: 166MB committed
|
|
against 795MB of address space - the graphics driver maps VRAM
|
|
apertures and its own bookkeeping into our map, and managed-pool
|
|
resources are shadowed in system memory as well as VRAM, so the
|
|
map runs about five times the memory actually used. Under Wine
|
|
the same mission mapped 3193MB, because wined3d routes through
|
|
OpenGL and the NVIDIA driver maps far more aggressively; on an
|
|
older Wine that exhausted the space outright and the game died
|
|
before video init with nothing useful in the log. This raises
|
|
the ceiling to 4GB on any 64-bit host. It frees no memory and
|
|
changes no behaviour - it stops the process running out of
|
|
numbers. Equally worth having on Windows: 795MB of 2GB is
|
|
already 40% before 1080p, eight pods, and the 100MB spool
|
|
buffer RP412RECORDSIZE takes when recording is armed. -->
|
|
<LargeAddressAware>true</LargeAddressAware>
|
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
</Link>
|
|
<!-- rpl4build.h is generated, not committed: the patch number is the
|
|
repository's commit count, so a hardcoded one would be stale the
|
|
moment it was committed. The script rewrites the header only when
|
|
the stamp actually changes, so this does not drag RPL4.CPP through
|
|
a recompile on every build. -->
|
|
<PreBuildEvent>
|
|
<Command>powershell -NoProfile -ExecutionPolicy Bypass -File "$(ProjectDir)..\stamp-version.ps1"</Command>
|
|
<Message>Stamping the build version from git</Message>
|
|
</PreBuildEvent>
|
|
</ItemDefinitionGroup>
|
|
<ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
|
|
<ClCompile>
|
|
<Optimization>Disabled</Optimization>
|
|
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
|
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
|
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
</ClCompile>
|
|
<Link>
|
|
<AdditionalDependencies>d3dx9d.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
|
</Link>
|
|
</ItemDefinitionGroup>
|
|
<ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
|
|
<ClCompile>
|
|
<Optimization>Full</Optimization>
|
|
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
|
<EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>
|
|
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
|
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
</ClCompile>
|
|
<Link>
|
|
<AdditionalDependencies>d3dx9.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
|
<OptimizeReferences>true</OptimizeReferences>
|
|
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
|
|
</Link>
|
|
</ItemDefinitionGroup>
|
|
<ItemGroup>
|
|
<ProjectReference Include="..\MUNGA_L4\Munga_L4.vcxproj">
|
|
<Project>{F988B198-A386-40DD-A50E-9A5CE17A92A5}</Project>
|
|
</ProjectReference>
|
|
</ItemGroup>
|
|
<ItemGroup>
|
|
<ClCompile Include=".\RPL4.CPP" />
|
|
<ClCompile Include=".\RPL4APP.cpp" />
|
|
<ClCompile Include=".\RPL4CONSOLE.cpp" />
|
|
<ClCompile Include=".\RPL4FE.cpp" />
|
|
<ClCompile Include=".\RPL4ENVIRON.cpp" />
|
|
<ClCompile Include=".\RPL4LOBBY.cpp" />
|
|
<ClCompile Include=".\RPL4ARND.cpp" />
|
|
<ClCompile Include=".\RPL4GAUG.cpp" />
|
|
<ClCompile Include=".\RPL4GRND.cpp" />
|
|
<ClCompile Include=".\RPL4MODE.cpp" />
|
|
<ClCompile Include=".\RPL4MPPR.cpp" />
|
|
<ClCompile Include=".\RPL4MSSN.cpp" />
|
|
<ClCompile Include=".\RPL4PB.cpp" />
|
|
<ClCompile Include=".\RPL4SPOOLSTATS.cpp" />
|
|
<ClCompile Include=".\RPL4TOOL.cpp" />
|
|
<ClCompile Include=".\RPL4VID.cpp" />
|
|
<ClCompile Include=".\WTPresets.cpp" />
|
|
<ClCompile Include="..\RP\BLOCKER.cpp" />
|
|
<ClCompile Include="..\RP\BOOSTER.cpp" />
|
|
<ClCompile Include="..\RP\CHUTE.cpp" />
|
|
<ClCompile Include="..\RP\CRUSHER.cpp" />
|
|
<ClCompile Include="..\RP\DEMOPACK.cpp" />
|
|
<ClCompile Include="..\RP\RIVET.cpp" />
|
|
<ClCompile Include="..\RP\RPCNSL.cpp" />
|
|
<ClCompile Include="..\RP\RPDIRECT.cpp" />
|
|
<ClCompile Include="..\RP\RPMSSN.cpp" />
|
|
<ClCompile Include="..\RP\RPPLAYER.cpp" />
|
|
<ClCompile Include="..\RP\RPREG.cpp" />
|
|
<ClCompile Include="..\RP\RPTOOL.cpp" />
|
|
<ClCompile Include="..\RP\RUNNER.cpp" />
|
|
<ClCompile Include="..\RP\SCORZONE.cpp" />
|
|
<ClCompile Include="..\RP\THRUSTER.cpp" />
|
|
<ClCompile Include="..\RP\VTV.cpp" />
|
|
<ClCompile Include="..\RP\VTVMPPR.cpp" />
|
|
<ClCompile Include="..\RP\VTVPWR.cpp" />
|
|
<ClCompile Include="..\RP\VTVSUB.cpp" />
|
|
<ClCompile Include="..\RP\WEAPSYS.cpp" />
|
|
</ItemGroup>
|
|
<ItemGroup>
|
|
<ClInclude Include=".\RPL4.h" />
|
|
<ClInclude Include=".\RPL4.HPP" />
|
|
<ClInclude Include=".\RPL4APP.h" />
|
|
<ClInclude Include=".\RPL4CONSOLE.h" />
|
|
<ClInclude Include=".\RPL4FE.h" />
|
|
<ClInclude Include=".\rpl4environ.h" />
|
|
<ClInclude Include=".\RPL4LOBBY.h" />
|
|
<ClInclude Include=".\RPL4ARND.h" />
|
|
<ClInclude Include=".\RPL4GAUG.h" />
|
|
<ClInclude Include=".\RPL4GRND.h" />
|
|
<ClInclude Include=".\RPL4MODE.h" />
|
|
<ClInclude Include=".\RPL4MPPR.h" />
|
|
<ClInclude Include=".\RPL4MSSN.h" />
|
|
<ClInclude Include=".\RPL4PB.h" />
|
|
<ClInclude Include=".\RPL4VER.h" />
|
|
<ClInclude Include=".\RPL4VID.h" />
|
|
<ClInclude Include=".\WTPresets.h" />
|
|
<ClInclude Include="..\RP\BLOCKER.h" />
|
|
<ClInclude Include="..\RP\BOOSTER.h" />
|
|
<ClInclude Include="..\RP\CHUTE.h" />
|
|
<ClInclude Include="..\RP\CRUSHER.h" />
|
|
<ClInclude Include="..\RP\DEMOPACK.h" />
|
|
<ClInclude Include="..\RP\RIVET.h" />
|
|
<ClInclude Include="..\RP\RP.h" />
|
|
<ClInclude Include="..\RP\RPCNSL.h" />
|
|
<ClInclude Include="..\RP\RPDIRECT.h" />
|
|
<ClInclude Include="..\RP\RPMSSN.h" />
|
|
<ClInclude Include="..\RP\RPPLAYER.h" />
|
|
<ClInclude Include="..\RP\RPREG.h" />
|
|
<ClInclude Include="..\RP\RPTOOL.h" />
|
|
<ClInclude Include="..\RP\RUNNER.h" />
|
|
<ClInclude Include="..\RP\SCORZONE.h" />
|
|
<ClInclude Include="..\RP\THRUSTER.h" />
|
|
<ClInclude Include="..\RP\VTV.h" />
|
|
<ClInclude Include="..\RP\VTVMPPR.h" />
|
|
<ClInclude Include="..\RP\VTVPWR.h" />
|
|
<ClInclude Include="..\RP\VTVSUB.h" />
|
|
<ClInclude Include="..\RP\WEAPSYS.h" />
|
|
</ItemGroup>
|
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
|
</Project>
|
|
|