SOC: Integrate DIB Engine

Stefan Dösinger stefan at codeweavers.com
Wed Apr 19 10:21:17 CDT 2006


Hi,
> One thing I'd like to try to work on is the DIB engine. Do we need
> someone to work on it still? This one is also interesting to me
> because we have some documentation already and that I have worked with
> bitmaps before too. I'd also like to find out how this stuff might
> integrate with the current changes going into ddraw.
>
> http://www.winehq.org/?page=fun_projects
> GDI Engine
For DirectX games, such as Age of Empires 2, I propably have an OpenGL-ish 
solution for the problem. I haven't looked at it in detail, so no promises 
that it is possible at all, but this was my idea:

Basically, DirectDraw apps do the following things with surfaces:
*Locking
*Blits
*GetDC

Basically there are two surface types: Render targets and offscreen surfaces. 
In the general case, locking is only done for offscreen surfaces, and 
basically during loading time, or when a surface has to be updated. In the 
current ddraw code, Blits are done in software, and they involve locking both 
surfaces. GetDC also holds a lock on the surface, which is essentially a dib 
section, and then doing the usual gdi stuff.

With opengl, the situation is a bit changed: Locking the surface requires 
transfering the data from and to video memory with glTexSubImage, 
glDrawPixels and friends. This is quite slow for full surfaces, but it 
usually occurs at loading time only. If some apps are bad-behaved and do a 
full lock of the rendertarget, this has a big performance impact at the 
moment, but this can be optimized a lot. Blits can be handled in hardware 
with 3D drawing, so they should work nice and fast :-)

The remaining problem is GetDC. At the moment this requires copying the 
complete surface from opengl to main memory, converting it to the servers bit 
depth, and copying it to a server-side pixmap. Here the new 
texture-from-pixmap glx extension can help. It should allow us to link the 
opengl texture directly to the pixmap gdi works on, without the need to copy 
it through wined3d. This extension is beeing designed for the new aiglx (and 
xgl?) stuff, so we can expect driver support soon, and the x server/opengl 
driver can optimize the image transfer nicely.

Well, what problems occur: The extension is not finished yet, we have to wait 
for this first. It's also not clear to me if the image transfer is supported 
in both ways, from pixmap to texture and from texture to pixmap. Furthermore, 
the textures should be in the server's color depth. For palettized surfaces, 
the conversion can be done when the game loads the surfaces, which is at the 
game loading time, if it is well-behaved. WineD3D already does that, if the 
card doesn't support palettized gl textures(most modern cards do not support 
that)

That's my basic idea, I haven't done any deeper investigation if that is 
possible at all, so I might be woken up from my daydreams now :-D

Stefan
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 191 bytes
Desc: not available
Url : http://www.winehq.org/pipermail/wine-devel/attachments/20060419/8b36d3fa/attachment.pgp


More information about the wine-devel mailing list