Using DXVK with WINE on Linux

Preface

The Windows port of Final Fantasy XI was built using DirectX 8 (DX8). DX8 support is a mixed bag, even on Windows. Due to most modern video cards having dropped support for DX8, it is typically pushed through DX9 instead which loses some quality/performance. Wine does have DirectX to OpenGL functions, but often suffers with performance. Luckily, most modern video cards also support Vulkan, which is typically much more consistent. Vulkan is also advantageous as it allows users to take advantage of DXVK (Direct X to Vulkan).

This is a general guide on getting DXVK + dgVoodoo2 and/or D8VK up and running.

Assumptions

  • You have a working installation of Wine + Final Fantasy XI
    • WineHQ Staging is preferred (Latest is 8.9 at the time of writing)
  • You have a reasonably modern video card that supports Vulkan
  • You have Vulkan installed and working for your distribution (this differs by distribution)
  • You are using Ashita v3 (v4 or Windower also work, but the examples here will be Ashita v3 specific).
  • Optional (but recommended): Install Feral Gamemode. The process differs depending on your distribution:
    • Ubuntu: sudo apt install gamemode
    • Fedora: sudo dnf install gamemode
    • Other: Consult the Oracle

Downloading and Placement

  • Obtain the following:

    • DXVK: Typically the latest release is fine.
    • dgVoodoo2: Look for the “Latest stable version” (not the API)
    • D8VK: At the time of writing, D8VK has not been merged into DXVK, but a PR is open to do so.
      • NOTE: At the time of writing D8VK may have a few rendering nuances with FFXI depending on the driver stack you are using. YMMV.
  • Navigate to the Ashita ffxi-bootmod folder (e.g. cd ~/.wine-nocturnalsouls/drive_c/Program\ Files/Ashita/ffxi-bootmod)

  • Create a Folder called DXVK (e.g. mkdir ./DXVK)

  • Open the DXVK archive, extract the following files into the root of the DXVK folder (NOTE: retaining the case sensitivity is important):

    • x32\d3d11.dll
    • x32\dxgi.dll
  • Open the dgVooooo2 archive, extract the following files into the root of the DXVK folder (NOTE: retaining the case sensitivity is important):

    • MS\x86\D3D8.dll
    • dgVoodoo.conf
    • dgVoodooCpl.exe
  • Your DXVK folder root should now have the following files (and no sub-folders):

    D3D8.dll
    d3d11.dll
    dgVoodoo.conf
    dgVoodooCpl.exe
    dxgi.dll
    
  • Create a Folder called D8VK (e.g. mkdir ./D8VK)

  • Open the D8VK archive, extract the following files into the root of the DXVK folder:

    • x32\d3d8.dll
  • Your D8VK folder root should now have the following file (and no sub-folders):

    d3d8.dll
    
  • Create a bash script (switch_vk) to switch between DXVK + dgVoodoo2 and D8VK and place it in your ffxi-bootmod folder:

    #!/bin/bash
    
    D8VK=./d3d8.dll
    DXVK=./D3D8.dll
    
    if test -f "$D8VK"; then
        echo [Switching to DXVK]
        rm ./d3d8.dll
        ln -s ./DXVK/D3D8.dll
        ln -s ./DXVK/d3d11.dll
        ln -s ./DXVK/dgVoodoo.conf
        ln -s ./DXVK/dgVoodooCpl.exe
        ln -s ./DXVK/dxgi.dll
    else
        if test -f "$DXVK"; then
            echo [Switching to D8VK]
            rm D3D8.dll
            rm d3d11.dll
            rm dgVoodoo.conf
            rm dgVoodooCpl.exe
            rm dxgi.dll
            ln -s ./D8VK/d3d8.dll
        else
            echo [Default to D8VK]
            ln -s ./D8VK/d3d8.dll
        fi
    fi
    

Configuration

Prefix DLL overides

  • Ensure Final Fantasy XI is not running
  • Open winecfg for your prefix (e.g. WINEPREFIX=~/.wine-nocturnalsouls winecfg)
  • Navigate to the Libraries Tab
  • Add the following overrides (all lower case):
    • d3d11 (native)
    • d3d8 (native)
    • dxgi (native)
  • Ok out of winecfg

Initilization

  • Navigate to the Ashita ffxi-bootmod folder
  • ./switch_vk to default symlinks to use D8VK
  • Note that the paths are relative, not absolute, so make sure you are in the correct working directory
  • You can now re-run the script to swap between D8VK and DXVK + dgVooooo2.

Configuration of dgVoodoo2

  • Ensure Final Fantasy XI is not running
  • Navigate to the Ashita ffxi-bootmod folder
  • ./switch_vk to DXVK
    • You should see symlinks to dgvoodoo, D3D8, etc
  • Launch and Configure dgVoodoo2 (e.g. WINEPREFIX=~/.wine-nocturnalsouls wine ./dgVoodooCpl.exe)
    • If everything is working, you should now see a dgVoodoo Control Panel
    • General Tab:
      • Ensure the config folder points to C:\Program Files\Ashita\ffxi-bootmod
      • Select your video card from the drop down
      • Miscellaneous:
        • Un-check Keep window aspect ratio
        • Un-check Capture Mouse
    • DirectX Tab: Adjust the following:
      • Videocard: dgVoodoo Virtual 3D Accelerated Card
      • VRAM: 2048 MB
      • Antialiasing: Off
      • Miscellaneous: Un-check dgVoodoo Watermark
  • Click OK to close the configuration window.

Switching between D8VK and DXVK + dgVoodoo2

  • Ensure Final Fantasy XI is not running
  • Navigate to the Ashita ffxi-bootmod folder
  • Use ./switch_vk to toggle between libraries

Testing the configuration

  • Open a terminal
  • Navigate to the Ashita root folder (e.g. cd ~/.wine-nocturnalsouls/drive_c/Program\ Files/Ashita)
  • Launch Ashita using your Game profile and the DXVK_HUD ENV defined (to confirm it’s using DXVK). Example:
    • Gamemode: DXVK_HUD=1 WINEPREFIX=~/.wine-nocturnalsouls gamemoderun wine ./injector.exe nocturnalsouls.xml
    • Standard: DXVK_HUD=1 WINEPREFIX=~/.wine-nocturnalsouls wine ./injector.exe nocturnalsouls.xml
  • After providing your credentials, you should see a number of VULKAN info lines and your game should launch with the DXVK HUD visible
  • Congrats, if you want to disable the DXVK_HUD just remove it from the launch string.

A Note on Differences between the stacks

The instructions purposely include both libraries/stacks. In my testing a few things stood out:

D8VK: Noticeable stutters on MESA 23.2-devel during initial load and first load of assets. Mouse is not visible. Appears to be a feature complete DX8 implementation, nuances aside. DXVK + dgVoodoo2: Fewer stutters than D8VK, but does not appear to be feature complete (Weather/Distance Obscuration/Camera Lock are missing)

YMMV, toggle back and forth and choose the one that you prefer.

Conclusion

Good luck, have fun! 🐧

-webjester (2023-06-08)