http://bugs.winehq.org/show_bug.cgi?id=20380
--- Comment #70 from Roderick Colenbrander thunderbird2k@gmail.com 2010-02-10 05:05:36 --- (In reply to comment #69)
Created an attachment (id=26172)
--> (http://bugs.winehq.org/attachment.cgi?id=26172) [details]
patch
(In reply to comment #68) Great thanks for explanations. Now i see - this is correct behavior and not a bug. But i think that generating a lot of exceptions is not a very good idea. At least in places where we may avoid access violations - IWineD3DBaseSurfaceImpl_Blt() is the case for Homm3. The first patch wasn't quite correct (it will degrade performance) but after applying it the game works :) Here the second patch - to avoid exceptions in IWineD3DBaseSurfaceImpl_Blt(). And again, though there likely a bug in Homm3 (which i will try to find), the game works.
You have to figure out why SurfaceImpl_Blt doesn't like the dibsection exceptions. It is the way the majority of all windows apps perform rendering using GDI. WineD3D is in this sense just a basic GDI app and basically the Blt call stalls until the exception has been resolved. Later on in x11_copy_to_screen we use GDI BitBlt to draw to the window.
This bug is very, very tricky. Personally I'm not convinced that SurfaceImpl_Blt is wrong. Have you investigated whether Homm3 isn't calling Lock directly? In that case we would directly expose the dibsection its memory to the game (some games have buggy code which messes up the exception handling).
Myself I think the issue is something somehow timing related. Perhaps somewhere the winex11_tsx11_lock code is missing or so.
Roderick