From the 2026-07-03 comprehensive review. Phase E prep for the Metal port (ADR-0001).
The good news: IRenderer is genuinely clean of D3D12 types, and no code outside src/render/ + src/renderer/ includes <d3d12.h> except CrashLogger (legit DRED need). The gap: getD3D12Renderer() escapes into 8 non-render call sites (Engine.cpp:290,1198,2133,2184,3560,4389,5652; StageWindow.cpp:314), and the entire editor 3D stage-view pass (Stage3DRenderer + ensureStageTarget/drawStageMesh/applyStageDePremul, getComposeTargetStableSrvSlot, getDefaultScreenMeshSlot) is D3D12-native and reached directly from UI code.
Work: lift those call sites onto IRenderer (or an IStageRenderer sub-interface). This is the main un-abstracted surface for the Metal port, and it lives in editor/UI code rather than being quarantined in the backend.
Also for the ports (from ADR-0014's accepted-races list): CompositorSystem.cpp:629 reads OutputSurface corners/UVs/brightness/gamma show-side while editor calibration writes them — accepted as benign on x86 aligned-word reads, but not guaranteed by the C++ memory model; revisit for ARM (Metal) before assuming the same tearing behavior.
From the 2026-07-03 comprehensive review. Phase E prep for the Metal port (ADR-0001).
The good news: IRenderer is genuinely clean of D3D12 types, and no code outside src/render/ + src/renderer/ includes <d3d12.h> except CrashLogger (legit DRED need). The gap:
getD3D12Renderer()escapes into 8 non-render call sites (Engine.cpp:290,1198,2133,2184,3560,4389,5652; StageWindow.cpp:314), and the entire editor 3D stage-view pass (Stage3DRenderer + ensureStageTarget/drawStageMesh/applyStageDePremul, getComposeTargetStableSrvSlot, getDefaultScreenMeshSlot) is D3D12-native and reached directly from UI code.Work: lift those call sites onto IRenderer (or an IStageRenderer sub-interface). This is the main un-abstracted surface for the Metal port, and it lives in editor/UI code rather than being quarantined in the backend.
Also for the ports (from ADR-0014's accepted-races list): CompositorSystem.cpp:629 reads OutputSurface corners/UVs/brightness/gamma show-side while editor calibration writes them — accepted as benign on x86 aligned-word reads, but not guaranteed by the C++ memory model; revisit for ARM (Metal) before assuming the same tearing behavior.