http://bugs.winehq.org/show_bug.cgi?id=30019
--- Comment #1 from Stefan Dösinger stefan@codeweavers.com 2012-02-26 14:34:24 CST --- Created attachment 39092 --> http://bugs.winehq.org/attachment.cgi?id=39092 ddraw: Make D3DVBCAPS_WRITEONLY vertex buffers dynamic
I can reproduce the bug. The main problem is that the app is using a dynamic buffer, but ddraw.dll doesn't forward this to wined3d correctly. Thus wined3d ignores the DISCARD and NOOVERWRITE flags, forcing a CPU-GPU sync every time the buffer is locked. This patch fixes the ddraw side of the problem.
The next issue is that the app sets up the lighting in a way that forces us into drawStridedSlow("Using software emulation because not all material properties could be tracked"). This in turn requires a system memory copy of the dynamic buffer, which is (for some reason) just as slow as a static buffer. So the attached patch doesn't fix the performance on its own.
The best fix for the lighting problem is a vertex pipeline replacement, which will not happen for Wine 1.4. The next best fix is not using a VBO for dynamic vertex buffers if a system memory copy has to be maintained. Once that is done, 6c53871d302cdd257675b88a01a7b6fc4944b06e can be reverted since the functionality is no longer needed.