This release is somewhat uneventful feature wise, but rolls out several additional performance improvements to our not so long ago added CPU ProcessVertices implementation, and also includes the usual amount of bugfixes and game specific workarounds, as per the below changelog. These will affect a few prolific titles, but I'll save the feature highlight for some of the more obscure ones. This one in particular goes to the 🐸s.
| Fogger (1997) | Frogger 2: Swampy's Revenge |
|---|---|
|
|
Parallel point lights
We've had this rare type of lights on our radar for quite some time, although D7VK outright rejected their creation before v1.11. They were only ever supported by D3D6 and earlier D3D APIs and their use was limited to only two known titles: The Sims and Hidden & Dangerous. As such, handling them wasn't exactly a priority. In this release we've added a fairly accurate emulation path which is compatible with both our CPU-driven vertex lighting and DXVK's fixed function lighting (done with shaders).
The difference in both games is hardly noticeable, as these types of lights really play second fiddle to the more common directional lights, and are never used by themselves. On early graphics hardware they were only ever useful as a computationally cheaper alternative to point lights, but such concerns are unfounded on any "reasonably modern" GPUs of the early 21st century.
The only exclusive use of parallel point lights we are aware of can be found in the DX6.1 SDK D3D light sample. Here's a video of how it looks now with D7VK, in case you are haunted by an academic curiosity.
Fixes/additions:
- Added support for D3DLIGHT_PARALLELPOINT lights, by emulating them with maximum range and no attenuation point lights. This has had a minor visual impact on The Sims and Hidden & Dangerous. Other, yet unaccounted for, early D3D titles may be positively impacted.
- Pulled in the latest upstream DXVK code, including a fix which drastically improves the compilation speed of the fixed function shaders. There's a global positive impact, and one of a greater degree in particular on HW T&L D3D7 games.
- Properly handled a rare case of cross-API texture interface use, which has fixed rendering in Grandia II (thanks to @CkNoSFeRaTU for spotting the problem).
- Added a workaround for front buffer emulation which has fixed missing load screens/backgrounds in Praetorians and Empire of the Ants.
- Fixed a bug that caused missing texture transparency on Nvidia cards in Frogger (1997).
- Worked around color key precision issues in Frogger 2: Swampy's Revenge.
- Fixed various v1.10 regressions and missing validations caused by our now reduced use of proxied DDraw objects.
- Added a workaround to improve draw performance in Star Trek: Armada.
- Fixed black screen during intro video playback in Age of Wonders II.
- Improved device creation speed, positively affecting games which spam multiple devices on initialization to test for hardware support (e.g. Empire Earth).
- Improved the robustness of our D3D3 implementation.
- Added several tweaks to reduce the CPU usage of (CPU) ProcessVertices calls. While generally unimportant, these will improve CPU bottlenecks in games and mods which abuse SWVP calculations in conjuction with draws.
- Fixed an oversight which prevented proper texturing in GoldSrc titles such as (the original) Half-Life (thanks to @CkNoSFeRaTU). That being said, please don't use D3D6 with any GoldSrc games, as it performs quite poorly when compared to OpenGL.
- Added several workarounds for (the original) The Sims games & DLCs, with the caveat that there are still a few known problems with some versions of the game. These have been, by far, the most horrendous things I've had "the pleasure" to fix/work around so far.
- Fixed several global handle sharing cases, which are specific to early D3D APIs and DDraw. A GTA 2 bug should now resolve itself once the underlying problem is also addressed in Wine's DDraw implementation.
For the next release we've taken on the rather daunting challenge of both squeezing the most performance possible out of our CPU ProcessVertices implementation by throwing some SSE2 at it (this one's on @CkNoSFeRaTU), and to finally, and hopefully permanently, properly synchronize DDraw's swapchain flipping with DXVK's D3D9 backend swapchain flipping. See you all on the next one, with hopefully some good news on both fronts.

