I've implemented a small test here, but to be honest I'm not really sure what to test for :)
The current test only tests what the game in question seems to rely on, which is that TnLHalDevice should never be the only device enumerated by IDirect3D7_EnumDevices.
In addition to this, I think it's "reasonably possible" to make two additional assumptions, which is that RGBDevice is always and enumerated, and that if there is a TnlHal device, a Hal device is also present. Should I add such tests based on my assumptions (and limited test runs) only?
Thanks, David
On 9/2/07, Stefan Dösinger stefandoesinger@gmx.at wrote:
Am Sonntag, 2. September 2007 14:15 schrieb David Hedberg:
While this works as a "fix", it's obviously not a good one. In my (somewhat limited and at the moment not doublechecked) understanding, windows "always" returns (at least) two devices, one reporting T&L capable and one not. So I am wondering how one would implement a proper fix for this in wine.
It is quite likely that windows enumerates more than one device, but you have to keep an eye on the direct3d interface version. IDirect3D1 enumerates other devices than IDirect3D7, which is pretty tricky. IDirect3D7 only has HAL and TnLHal I think, others have HAL, TnLHal, MMX, RGB, Ramp. IDirect3D (1) does NOT enumerate the REF device.
What you could do is to add a test in dlls/ddraw/tests/d3d.c for this. The test could enumerate the devices, and verify that if the TnlHal device is enumerated, HAL is enumerated too, or something like that, depending on what Windows really does.
You've run into a pretty nasty and long-lasting problem here, a game that breaks with certain advertized or not advertized capabilities.