research(vm2): retail runs SINGLE-PASS detail texturing - the #226 port targets the fallback

Live cdb read on the PDB-paired retail client (owner's AMD GPU):
  m_caps.bCanDoSinglePassDetailing = 1, trysinglepass = 1,
  MaxSimultaneousTextures = 8, bTexOpDotProduct3 = 1,
  LandscapeDetailTextures = 0, EnvironmentDetailTextures = 1,
  landscape/object detail surfaces null, building/environment non-null,
  tiling 4 everywhere.

So retail's detail combine on modern hardware is the texture-stage path in
D3DPolyRender::SetSurface (stage0 alpha PREMODULATE, stage1 colour
BLENDCURRENTALPHA): lerp(base*diffuse, detail.rgb, detail.a*diffuse.a) -
a mild DARKENING (~-10% mid-tones with 0x06006D58), not the
DSTCOLOR+INVSRCALPHA brightening that Campaign AR ported and that the
2026-08-21 findings doc + AR review both analysed. Those described the
fallback for adapters without D3DTEXOPCAPS_PREMODULATE; the reviewer's
guess that consumer drivers rarely advertised it was wrong.

VM1 now carries the re-port (SRCALPHA+INVSRCALPHA, detail.rgb /
detail.a*diffuseAlpha, neutral at a==0) together with the fade removal.
No distance fade exists on either path. Scripts are read-only attaches
with no breakpoints.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-22 18:23:27 +02:00
parent 4dbbe8fead
commit fe085cadaa
6 changed files with 228 additions and 4 deletions

View file

@ -0,0 +1,7 @@
# Campaign VM slice VM2 runner. Retail acclient.exe (2013 PDB-paired build) must be running and in-world.
$cdb = "C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\cdb.exe"
$script = "$PSScriptRoot\vm2-detail-caps.cdb"
$p = Get-Process -Name acclient -ErrorAction SilentlyContinue
if (-not $p) { Write-Error "acclient.exe is not running"; exit 1 }
Write-Host "attaching to acclient pid $($p.Id) ..."
& $cdb -pn acclient.exe -cf $script *>&1 | Tee-Object -FilePath "$PSScriptRoot\..\..\artifacts\vm2\vm2-detail-caps.console.log"

View file

@ -0,0 +1,43 @@
* Campaign VM slice VM2 - which detail-texturing path does retail run on this GPU?
* Read-only: attach, dump the capability + detail state, detach. No breakpoints.
.logopen C:\Users\erikn\source\repos\acdream\.claude\worktrees\peaceful-blackburn-5333f0\artifacts\vm2\vm2-detail-caps.log
.sympath C:\Users\erikn\source\repos\acdream\refs
.symopt+ 0x40
.reload /f acclient.exe
.echo === module / pdb identity ===
lmv m acclient
.echo === symbol resolution ===
x acclient!RenderDevice::render_device
x acclient!Render::*detail*
x acclient!Render::m_RenderPrefs
x acclient!trysinglepass
.echo === THE ANSWER: single-pass detailing capability ===
?? acclient!RenderDevice::render_device->m_caps.bCanDoSinglePassDetailing
?? acclient!RenderDevice::render_device->m_caps.bTexOpDotProduct3
?? acclient!RenderDevice::render_device->m_caps.bTexOpBumpEnvMap
?? acclient!RenderDevice::render_device->m_caps.MaxSimultaneousTextures
?? acclient!RenderDevice::render_device->m_caps.MaxTextureBlendStages
.echo === raw D3D caps (TextureOpCaps: 0x8000 = BLENDCURRENTALPHA, 0x10000 = PREMODULATE, 0x4000 = DOTPRODUCT3) ===
?? acclient!RenderDevice::render_device->m_D3DCaps.TextureOpCaps
?? acclient!RenderDevice::render_device->m_D3DCaps.MaxSimultaneousTextures
?? acclient!RenderDevice::render_device->m_D3DCaps.MaxTextureBlendStages
?? acclient!RenderDevice::render_device->m_D3DCaps.PixelShaderVersion
.echo === full m_caps dump ===
dt acclient!RenderDevice poi(acclient!RenderDevice::render_device) m_caps.
.echo === trysinglepass global ===
dd acclient!trysinglepass L1
.echo === detail category state (null = category off) ===
?? acclient!Render::landscape_detail_surface
?? acclient!Render::building_detail_surface
?? acclient!Render::environment_detail_surface
?? acclient!Render::object_detail_surface
?? acclient!Render::landscape_detail_tiling
?? acclient!Render::building_detail_tiling
?? acclient!Render::environment_detail_tiling
?? acclient!Render::object_detail_tiling
?? acclient!Render::curr_detail_src_blend
?? acclient!Render::curr_detail_dst_blend
?? acclient!Render::m_RenderPrefs.EnvironmentDetailTextures
.echo === done, detaching ===
.logclose
qd

View file

@ -0,0 +1,11 @@
.logopen C:\Users\erikn\source\repos\acdream\.claude\worktrees\peaceful-blackburn-5333f0\artifacts\vm2\vm2-trysinglepass.log
.sympath C:\Users\erikn\source\repos\acdream\refs
.reload /f acclient.exe
.echo === trysinglepass candidates (decomp: 00820e40 / 00835c04 / 00835c10, all init 1) ===
dd 00820e40 L1
dd 00835c04 L1
dd 00835c10 L1
.echo === RenderPrefs ===
dt acclient!Render::m_RenderPrefs
.logclose
qd