Context
The M3.0 milestone prompt's 'RenderContextD3DImpl' parenthetical conflated rive's two D3D backends. This issue records the verified decision to NOT build a D3D11 bridge.
Findings (verified this session)
- rive HAS a D3D11 backend, but it cannot support zero-copy external-record:
RenderContextD3DImpl::MakeContext(ComPtr<ID3D11Device>, ComPtr<ID3D11DeviceContext>, D3DContextOptions) (render_context_d3d_impl.hpp:176, .cpp:411) stores the immediate ID3D11DeviceContext as m_gpuContext and flush() issues every Set/Draw/Dispatch directly onto it (.cpp:1589+), including m_gpuContext->ClearState() (:1595). There is NO command-list parameter, NO FlushDescriptor::externalCommandBuffer (grep: none), and no deferred-context FinishCommandList/ExecuteCommandList path — nothing to ride along in wgpu's stream, and ClearState() would clobber a shared immediate context.
- DECISIVE: wgpu-hal 27.0.4 has NO dx11 backend (modules: auxil, dx12, gles, metal, noop, vulkan). wgpu's Windows DEFAULT is D3D12. So there is no scenario where the bridge runs on a wgpu D3D11 device, and D3D11 offers nothing over D3D12.
Scope / Decision
- Do NOT add D3D11 shim entry points (none exist today — correct).
- The Windows story is fully covered by: D3D12 fast path (M3a), forced-Vulkan (the shipping M1b/M2 path), and the CPU-copy floor (works on dx12 today, needs a Vulkan ICD).
- If a future consumer ever force-pins wgpu to D3D11 AND needs native rive, the ONLY viable model is the CPU-copy floor (rive renders on its own device, CPU-copy into a wgpu D3D11 texture) — never zero-copy. Re-open only with that concrete need.
Acceptance criteria
- Decision captured in the backend roadmap doc with the cited evidence; issue closed as 'wontfix/by-design' (kept for the record).
Refs
vendor/rive-runtime/renderer/include/rive/renderer/d3d11/render_context_d3d_impl.hpp:176
vendor/rive-runtime/renderer/src/d3d11/render_context_d3d_impl.cpp:411,1589,1595
wgpu-hal-27.0.4/src/ (no dx11 module)
the D3D12 feasibility spike (summarized in ROADMAP.md)
Context
The M3.0 milestone prompt's 'RenderContextD3DImpl' parenthetical conflated rive's two D3D backends. This issue records the verified decision to NOT build a D3D11 bridge.
Findings (verified this session)
RenderContextD3DImpl::MakeContext(ComPtr<ID3D11Device>, ComPtr<ID3D11DeviceContext>, D3DContextOptions)(render_context_d3d_impl.hpp:176,.cpp:411) stores the immediateID3D11DeviceContextasm_gpuContextandflush()issues every Set/Draw/Dispatch directly onto it (.cpp:1589+), includingm_gpuContext->ClearState()(:1595). There is NO command-list parameter, NOFlushDescriptor::externalCommandBuffer(grep: none), and no deferred-context FinishCommandList/ExecuteCommandList path — nothing to ride along in wgpu's stream, and ClearState() would clobber a shared immediate context.Scope / Decision
Acceptance criteria
Refs
vendor/rive-runtime/renderer/include/rive/renderer/d3d11/render_context_d3d_impl.hpp:176vendor/rive-runtime/renderer/src/d3d11/render_context_d3d_impl.cpp:411,1589,1595wgpu-hal-27.0.4/src/(no dx11 module)the D3D12 feasibility spike (summarized in ROADMAP.md)