Legacy texture capabilities: executable public COM fixture
Native status: UNEXECUTED. This assignment generated and disassembled the original x86 guest and tested its oracle offline. No VM, Boat, build, browser, renderer, game or worker was launched.
Base: 1262cbfcf8b5881543f2fb18c0f80b4bd9429306, fetched origin/main.
Owned addition: test/test-legacy-texture-caps-native.js and this note.
Evidence: scratch/runs/20261020-legacy-caps-native-fixture/.
The existing cube/filter/remaining suites compile extracted WAT helpers; none
executes a public descriptor call. The existing surface47 candidate exercises
surface storage through catalog-thunk routing and a game PE, not these device
descriptors. This fixture reuses the deterministic PE header/import generator
from tools/kernel32-native-fixture.js and the exact-module host setup of
test/test-wave-error-text-native.js. It does not duplicate their tests.
The generated PE has real kernel32 imports and original x86 code. Its guest calls LoadLibraryA(ddraw.dll), GetProcAddress(DirectDrawCreate), DirectDrawCreate, SetCooperativeLevel(NORMAL), CreateSurface (4x4 RGB, OFFSCREENPLAIN|3DDEVICE), QI(IDirect3D2), and CreateDevice(HAL). It queries the resulting device for Device1/3/7 and calls published vtable slots. No API catalog ID, thunk, object, vtable or successful return is manufactured. No WAT is extracted, compiled or transformed. The only module compiled by native mode is the supplied, SHA-256-checked production wasm.
| Public route | Descriptor coverage |
|---|---|
| Device1 GetCaps, slot 4 | HW and HEL, 172/204/252 bytes, aligned and +1 |
| Device2/3 GetCaps, slot 3 | HW and HEL, 172/204/252 bytes, aligned and +1 |
| Device7 GetCaps, slot 3 | fixed 236 bytes, no dwSize, aligned and +1 |
| IDirect3D1 EnumDevices, slot 4; D3D2/3, slot 3 | real six-argument x86 callback; copy 252-byte HW and HEL while live |
| IDirect3D7 EnumDevices, slot 3 | real four-argument callback; copy 236-byte descriptor while live |
There are 47 public calls and 45 captured descriptors. Legacy enumeration
continues through the project's fixed Ramp/RGB/HAL or RGB/HAL sequence to HAL,
then cancels. D3D7 captures its first HAL and cancels. Thus both HAL/HEL builders
are covered, but this is not a universal Windows driver-order test. Invalid HW
descriptors from the skipped software devices are not interpreted as advertised
capabilities. Enum callbacks preserve EBP/ESI/EDI and use ret 24 or ret 16.
The main guest records EAX and ESP immediately following every call, before
any host continuation could restore the stack. HRESULTs, output pointers,
leading/trailing canaries, primitive sizes, descriptor dwSize, callback context,
continuation/cancellation count, outer RET and bounded completion are checked.
For legacy enumeration, HAL is the final device: its count proves continuation
to HAL but cannot distinguish honoring CANCEL from natural exhaustion. D3D7
cancels at the first of two devices and therefore checks early cancellation.
Both line and triangle masks must retain 0xf7df texture capabilities (no
CUBEMAP, PROJECTED preserved), 0xc3 legacy filters or 0x030003c3 D3D7 filters
(point/linear retained, unsupported mip modes absent), and 0xf7 address
capabilities (no BORDER; WRAP/MIRROR/CLAMP/INDEPENDENTUV retained). D3D7 texture
ops remain 0x3ff.
Offline validation passed 1,053 negative controls using the same result
checker: old cube/border masks, clearing PROJECTED or point/linear, restoring
each legacy mip bit, every canary, every call's wrong ESP, failed HRESULTs,
wrong sizes, callback count/context and incomplete execution. These are
synthetic oracle vectors, not successful COM calls. Deterministic generation,
syntax and scoped diff checks passed. disassembly.txt exposes actual PUSH,
indirect CALL, immediate result/ESP stores, callback copies and RET cleanup.
Offline checks cannot prove that the production interpreter executes this guest.
Reproduce offline from a checkout containing this change:
node test/test-legacy-texture-caps-native.js --offline --out=scratch/runs/20261020-legacy-caps-native-fixture
objdump -D -b binary -m i386 --adjust-vma=0x403000 scratch/runs/20261020-legacy-caps-native-fixture/guest-code.bin
The evidence snapshot includes the test and existing PE generator; replay.js
regenerates the PE and rechecks hashes without dependencies or production
execution. identities.json records base Git blob IDs and SHA-256 identities.
Generated binaries are ignored artifacts: recover them from that snapshot or
the committed generator, not from a presumed Git binary backup.
Future serialized native command, from a complete runtime checkout with this test applied, using the already recorded canonical ee139a094 module:
node test/test-legacy-texture-caps-native.js \
--wasm=build/wine-assembly.wasm \
--sha256=5e66c75862052b13b73f80bdcbcd67a1a65fd99d3e9e79d33f96548d00cc2a21 \
--out=scratch/runs/20261020-legacy-caps-native-execution
That hash is a coordinator-recorded prior module, not a module validated here. The runtime owner must verify its provenance and availability before execution. If scheduling a newer canonical module, record its source commit/hash and pass that exact SHA-256 instead. Native mode refuses a mismatch and records actual call/descriptor observations before checking them when execution completes. Unexpected host dependencies fail loudly; there is no success fallback. No native run or build is authorized by this fixture-only assignment.
The public creation route exists in the reviewed source; no missing API prerequisite was identified. Actual route execution remains pending. A future failure must retain its exact API/slot/ABI evidence and stop for coordinator assignment; this fixture is not permission to repair production code. This closes fixture availability only, not native qualification. It does not test cube allocation rejection, texture-format enumeration, mip storage, sampling, rendering, backend parity or games. Canary checks on enumeration copies protect fixture copies; they cannot establish bounds of the driver's internally allocated callback descriptors.