http://bugs.winehq.org/show_bug.cgi?id=34574
--- Comment #10 from Stefan Dösinger stefan@codeweavers.com 2013-09-25 08:46:35 CDT --- The incorrect positioning is more or less by design. The game renders to an offscreen ddraw surface and then tries to blit the result to the frontbuffer. The frontbuffer happens to be an offscreen surface as well (the shadow frontbuffer). The shadow frontbuffer is a lot bigger (screen size) than the GL drawable (window size). The old fallback code in surface_blt_special handles the copy via glCopyTexImage because the game's offscreen surface currently happens to be stored in the GL backbuffer. ARBfp_blit first copies the offscreen surface to a GL texture, then puts the destination surface (=ddraw frontbuffer) into the GL backbuffer and draws a textured quad. Later on the ddraw frontbuffer is copied back into a texture and blitted onto the real frontbuffer to make the contents show up on the screen.
The problem now is that the GL drawable is a lot smaller than the ddraw frontbuffer, so the blit from the game's offscreen surface to the shadow frontbuffer can only write to a part of the frontbuffer, cutting off parts of the draw. That's not fixable without FBOs. We should keep this restriction in mind when continuing with the blit cleanup - maybe we should fall back to CPU blits when blitting to an offscreen surface that is bigger than the GL drawable. Maybe we can keep the glCopyTexImage code, but this code only works properly by luck in this case (no stretching, and the source surface is upside down because it is an offscreen surface).