Skip to content

[Feature]: Add rendering wrapper support (DXVK/D3D9On12) for graphics modernization #3471

@bwiemz

Description

@bwiemz

Is your feature request related to a problem?

Supreme Commander: Forged Alliance is a legacy 32-bit DirectX 9 game. On modern hardware (especially newer GPUs with limited DX9 driver optimization), the game can experience poor performance, stuttering, and compatibility issues. Players are stuck with a 2007-era rendering pipeline with no way to leverage modern graphics APIs like Vulkan or DirectX 12 through the FAF client.

Currently, users who want to use DXVK or D3D9On12 must manually download wrapper DLLs, place them in the game directory, and remove them afterward — a cumbersome process that most players won't attempt.

Describe the solution you'd like

Add a Rendering API dropdown in the FAF client settings (under Game Configuration) that lets users choose between:

  • DirectX 9 (Default) — Native rendering, no changes
  • DirectX 12 (D3D9On12) — Uses Microsoft's D3D9-to-D3D12 translation layer via ForceD3D9On12
  • Vulkan (DXVK) — Uses DXVK to translate DX9 calls to Vulkan

The client should:

  1. Auto-download the required wrapper DLLs from GitHub releases on first use (following the existing pattern used for the map generator and FAF debugger downloads)
  2. Inject DLLs into the game's execution directory before launch
  3. Clean up DLLs automatically when the game exits
  4. Fall back gracefully to DirectX 9 if the download fails (with a user notification)
  5. Cache DLLs persistently so they only need to be downloaded once

This brings modern rendering to SC:FA with zero manual effort from the user, potentially improving performance significantly on modern GPUs.

Describe alternatives you've considered

  1. Manual DLL placement — Require users to download and place DXVK/D3D9On12 DLLs themselves. Poor UX and most users won't bother.
  2. Bundle DLLs with the client — Ship wrapper DLLs as part of the client distribution. Simpler but increases client size and raises licensing concerns (DXVK is LGPL, ForceD3D9On12 has its own license).
  3. System-wide D3D9On12 activation — Use Windows registry or app compatibility settings to force D3D9On12 globally. Too invasive and doesn't work for DXVK.
  4. Build-time download only — Download DLLs during the Gradle build. Doesn't help end users who install from a release build.

The auto-download approach (option 1 in the solution) was chosen as it follows existing FAF client patterns, requires no manual user intervention, and avoids bundling third-party binaries.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions