http://bugs.winehq.org/show_bug.cgi?id=35776
--- Comment #9 from Kol kol@MV8660.spb.edu --- First, the above debug patch from Comment#7 with WINEDEBUG="fixme+all" prints nothing about "Filtering redundant WINED3D_MAP_DISCARD". I tested Crysis 1 running under Wine 1.7.19 with patch from Bug#35718 fixing bug (1). Also double buffering was forced, otherwise the game crashes on load due to Bug#18799. The framerate was measured by the GPU benchmark of the game.
I carried out some experiments absolutely not understanding what I do and found that the cause of bug (2) is connected with the WINED3D_BUFFER_NOSYNC flag. With commit c1032e977bb9f850e3aea28dd79e3d7c2244cd6c the framerate is <30 but if buffer->flags |= WINED3D_BUFFER_NOSYNC; is set unconditionally in "wined3d_buffer_map()" function in "dlls/wined3d/buffer.c" the framerate grows to ~50 FPS as before the commit. In this case some graphical glitches (green flashes on textures) are seen.
The other way to improve the framerate is to restore a structure which "wined3d_buffer_map()" has before the commit. If I replace else if (!buffer_is_dirty(buffer)) by else if (!dirty) and insert BOOL dirty = buffer_is_dirty(buffer); at the start of "wined3d_buffer_map()", I have 50 FPS again. In this case the game runs correctly.
Maybe, the bug (2) is specific to my video system (Nvidia driver 331.20, GTX460), because the slowdown is absent on the Radeon card (Comment#8).
Also I checked that patch "http://bugs.winehq.org/attachment.cgi?id=48915" from Bug#36787 does not affect the considered problem.