A guide on running the Eidos/Innerloop classic sim, Joint Strike Fighter (JSF) natively in Windows 10 with DxWrapper.
The previous article about running JSF in Windows 10, 'Running Joint Strike Fighter in Windows 10' concluded that the optimum settings were emulated 3dfx settings with nGlide v0.97 and a legacy 4 axis HOTAS.
Using software rendering at higher resolutions caused frequent crashes to the desktop (CTD) and attempts to use a modern HOTAS setup resulted in the game crashing at startup.
However, further testing with a DirectX wrapper, DxWrapper, has shown that a more stable software rendering solution is possible while using a modern HOTAS controller.
Installation & patching
Installation and patching remains unchanged and is identical to the process described in 'Running Joint Strike Fighter in Windows 10'. JSF v1.12 will continue to be used.
DirectX wrapper
The DirectX wrapper used is the latest DxWrapper version, v1.2.7300.25. Maintained by Elisha and available from GitHub at the DxWrapper project page. Since DxWrapper is compatible with Windows 11, this solution may be workable on Windows 11 although this hasn't been tested.
So firstly, a huge thank you to Elisha, the many project contributors and the maintainers and contributors of those projects that DxWrapper used source code from (you can read about them in the credits section). Without their hard work running this sim on Windows 10 would still be very problematic.
If you wish to test various DxWrapper options, there is a comprehensive wiki at the Github project page.
Installation
Download and extract DxWrapper. The following files were copied to the JSF installation folder:
dxwrapper.dll
dxwrapper.ini
Stub\ddraw.dll
Stub\dinput.dll
Note: Only the files need to be copied into the installation directory the Stub path does not need to be preserved.
Configuration
Each component wrapper is turned on on off in the compatibility section. The most important options will be briefly covered.
The HandleException issue seems to prevent the random CTD's. Instead at very high resolutions the flight engine seems have issues handling HUD sprites which results in artifacts around the outside of the HUD (where most of the HUD sprites reside) rather than in the centre of the screen.
EnableDdrawWrapper enables wrapping dx5 calls used by the game. Options within the [ddraw] section convert these calls to dx7. Dd7to9 enables conversion from DirectDraw 7 to 9. The [Dd7to9] section maintains the aspect ratio and removes scan lines from the intro movie (so you can tell the wrapper is working). The [d3d9] section has the option to run in a fullscreen window mode making it easier to close the game if it does crash.
Dinputto8 converts DirectInput calls to dx8 increasing modern HOTAS compatibility.
EnableDsoundWrapper enables the sound wrapper. Some artifacting seemed to occur simultaneously with sound triggers (midi music playing, wingman msgs, warnings). This may have been a coincidence but I've enabled the wrapper.
Game configuration
In order to run without in-game exceptions causing artifacting at higher resolutions both in-game lo-res emulation options must be enabled, big pixels and black lines, as shown in the screenshot.
My configuration
This is my current dxwrapper.ini configuration, the game plays without issue at 1920x1200 with a modern TM Warthog HOTAS and TFRP rudder pedals.
;; Config file for DirectX DLL Wrapper
;;
;; For details, see:
;; https://github.com/elishacloud/dxwrapper/wiki/Configuration
;;
[General]
RealDllPath = AUTO
WrapperMode = AUTO
LoadCustomDllPath =
ExcludeProcess =
IncludeProcess =
RunProcess =
WaitForProcess = 0
DisableLogging = 0
[Plugins]
LoadPlugins = 0
LoadFromScriptsOnly = 0
[Compatibility]
Dd7to9 = 1
D3d8to9 = 0
DDrawCompat = 0
Dinputto8 = 1
DisableGameUX = 1
EnableDdrawWrapper = 1
EnableD3d9Wrapper = 0
EnableDinput8Wrapper = 0
EnableDsoundWrapper = 1
HandleExceptions = 1
SingleProcAffinity = 1
[DDrawCompat]
DDrawCompat20 = 0
DDrawCompat21 = 0
DDrawCompat32 = 0
DDrawCompatDisableGDIHook = 0
DDrawCompatNoProcAffinity = 0
[ddraw]
ConvertToDirectDraw7 = 1
ConvertToDirect3D7 = 1
DdrawOverrideBitMode = 0
DdrawResolutionHack = 0
[Dd7to9]
DdrawAutoFrameSkip = 0
DdrawEmulateSurface = 0
DdrawEmulateLock = 0
DdrawForceMipMapAutoGen = 0
DdrawFlipFillColor = 0
DdrawFixByteAlignment = 0
DdrawEnableByteAlignment = 0
DdrawRemoveScanlines = 1
DdrawRemoveInterlacing = 0
DdrawReadFromGDI = 0
DdrawWriteToGDI = 0
DdrawDisableDirect3DCaps = 0
DdrawLimitDisplayModeCount = 0
DdrawCustomWidth = 0
DdrawCustomHeight = 0
DdrawUseNativeResolution = 0
DdrawOverrideWidth = 0
DdrawOverrideHeight = 0
DdrawIntegerScalingClamp = 0
DdrawMaintainAspectRatio = 1
[d3d9]
AnisotropicFiltering = 0
AntiAliasing = 0
EnableVSync = 0
ForceVsyncMode = 0
OverrideRefreshRate = 0
LimitPerFrameFPS = 0
EnableWindowMode = 0
WindowModeBorder = 0
SetInitialWindowPosition = 0
InitialWindowPositionLeft = 0
InitialWindowPositionTop = 0
FullscreenWindowMode = 1
ForceExclusiveFullscreen = 0
ForceMixedVertexProcessing = 0
ForceSystemMemVertexCache = 0
SetSwapEffectShim = 0
DisableMaxWindowedMode = 0
ForceDirect3D9On12 = 0
GraphicsHybridAdapter = 0
[FullScreen]
FullScreen = 0
ForceWindowResize = 0
WaitForWindowChanges = 0
[dinput8]
DeviceLookupCacheTime = 0
FilterNonActiveInput = 0
FixHighFrequencyMouse = 0
MouseMovementFactor = 0
MouseMovementPadding = 0
[dsound]
Num2DBuffers = 0
Num3DBuffers = 0
ForceCertification = 0
ForceExclusiveMode = 0
ForceSoftwareMixing = 0
ForceHardwareMixing = 0
ForceHQ3DSoftMixing = 0
ForceNonStaticBuffers = 0
ForceVoiceManagement = 0
ForcePrimaryBufferFormat = 0
PrimaryBufferBits = 16
PrimaryBufferSamples = 48000
PrimaryBufferChannels = 2
AudioClipDetection = 0
This is the above dxwrapper.ini config file, zipped and available for download.
Notes on running
If you have a default system glide wrapper like nGlide or a local Glide wrapper in the JSF install folder and the splash screen is enabled, you will see it when JSF starts, even if the in-game options specify software rendering rather than (emulated) 3dfx hardware rendering.
Initial joystick setup was a little problematic, when first setting up and jumping into a dogfight, keyboard controls had to be used before switching to mouse control and then finally switching to joystick control. This may have been a result of the testing I was carrying out at the time. Subsequently, I was able to use the joystick immediately.
HOTAS setup
Like many other sims, JSF prefers a HOTAS setup limited to 4 axes. For those with 4 axes or less this won't apply. For those with a HOTAS with more than 4 axes, HOTAS profiling software will need to be used to limit axes.
In my case I'm able to use TM TARGET to create a suitable profile with only 4 axes. They are specified as follows:
Physical axis | Windows axis |
Joystick x-axis | DX_X_AXIS |
Joystick y-axis | DX_Y_AXIS |
Throttle | DX_Z_AXIS |
Rudder pedals | DX_ZROT_AXIS |
This sim seems to prefer the z rotation axis rather than the x rotation axis for rudder.
Limitations
Although a huge step forward in compatibility, it is not perfect. At extremely high resolutions, e.g. 3840x2160 random freezing and artifacting will occur even with DxWrapper and in-game lo-res options enabled. This seems like a limit in the in-game engine's ability to handle sprite at these resolutions, so this may not be fixable with wrappers. This is shown in the below video.
Despite an increase in HOTAS compatibility the HOTAS buttons will be non-functional. Although this seems like a serious issue, it can be resolved with HOTAS profiling software (e.g. TARGET) or other joystick button mapping to keyboard software (e.g. Joy2Key, Joystick Gremlin, etc).
Use of the in-game button mapping software is not recommended as will crash once button 36 is reached, this may not be an issue if you have fewer buttons.
Hopefully this guide will allow you to play JSF at higher resolutions, good hunting!
Kommentit