http://bugs.winehq.org/show_bug.cgi?id=3902
damjan.jov@gmail.com changed:
What |Removed |Added ---------------------------------------------------------------------------- Attachment #3838 is|0 |1 obsolete| |
------- Additional Comments From damjan.jov@gmail.com 2006-14-10 03:25 ------- Created an attachment (id=3851) --> (http://bugs.winehq.org/attachment.cgi?id=3851&action=view) client-side DIB copy patch, v2
Well, I'll be damned...
After hours of trying with no luck, I saw the message: Cannot change screen BPP from 32 to 16.
So I tried running X in 16-bit depth, and Heroes 4 worked substantially faster (with no patches).
I added the dirty rectangle patch - maybe ran a little faster. I added the client-side DIB copy patch - looked perfect, ran like lightning!
So why does it work in 16 bpp and not in 24? I switched X back to 24, and sure enough, it was still broken. Where I calculate witdhs and offsets, I tried multiplying by 4 instead of 3 - even worse. So I tried multiplying by 2 instead - looked perfect, ran like lightning.
But how can it be using 16 bpp when it reports 24? Well, incredibly enough, X_PHYSDEVICE's depth and X_PHYSDEVICE's bitmap's pixmap_depth are the X pixmap depth, NOT the client-side bitmap depth which is given by DIBSECTION's dsBm's bmBitsPixel (a fact which isn't documented anywhere).
When I changed the code to use the DIBSECTION values like it should, everything looks good and runs super-fast. I've already submitted the patch to wine-patches. Happy playing ;-).