DirectDraw et Poulsbo

Pouslbo c'est le petit nom de la puce Intel GMA 500. J'ai fait l'acquisition d'un Netbook Packard Bell équipé de ce chipset.
C'est pas mal comme puce, on peut faire tourner sans problème un jeu 3D ancienne génération comme Dungeon Siege.

Sauf que le driver XP livré par Intel est loin d'offrir toutes les possibilités de la puce !

Par exemple, le driver n'offre aucun support OpenGL !

Et des jeux DirecDraw ancienne génération comme Age of Empires ne tournent tout simplement pas.

J'ai voulu comprendre pourquoi et essayer de trouver une solution...et j'ai réussi ! En voici les explications.

Les jeux DirectDraw s'appuient sur la DLL C:\WINDOWS\SYSTEM32\DDRAW.DLL qui exporte une fonction DirectDrawCreate() qui est le point d'entrée dans l'API DirectDraw.

De par le fonctionnement de Windows, il est donc très facile de remplacer toute l'API DirectX en plaçant une nouvelle version de DDRAW.DLL dans le répertoire du jeu. Pour peu que cette DLL exporte une fonction DirectDrawCreate qui retourne une interface IDirectDraw, le jeu utilisera cette interface comme si c'était celle de Microsoft.

C'est ce que j'ai fait pour comprendre le problème de Age Of Empires avec Poulsbo.

De fait, le jeu commence par énumérer les modes graphiques supportés par la carte video, Poulsbo propose différentes résolutions en 16 et 32 bits...AOE n'y trouve pas son compte et se termine sur un message d'erreur.

En effet AOE tourne en mode 256 couleurs, et Poulsbo ne gère pas ce mode !

J'ai donc triché dans ma DLL en faisant croire à AOE que la carte supportait les modes qu'il attendait (640x480, 800x600 et 1024x768 en 8 bits) afin d'aller plus loin...et ça fonctionne.

Sauf que du coup AOE demande à IDirectDraw de passer en mode 640x480 en 8 bits, et Poulsbo refuse. J'ai là encore triché, en demandant à Poulsbo un mode 32 bits pour l'écran et un mode 8 bits en mémoire que je retourne à AOE. ça fonctionne presque...car AOE, pour afficher ses textes, fait un appel à la fonction GetDC de la surface DirectDraw, et quand elle est crée en 8bits, Pouslbo retourne une erreur.

J'ai donc poussé un peu plus loin l'émulation de DirectDraw en passant non plus par des surfaces DirectDraw mais de simples Bitmap (des DIB). Je garde cependant une surface DirectDraw primaire pour afficher le résultat final à l'écran.

Il faut finalement assez peu de code pour réaliser une DLL DirectDraw software qui supporte AOE. Celui ci se content de Locker une surface pour dessiner les personnages et les animations lui même, et il utilise les fonction Blt et BltFast pour copier des portions d'image - notamment la souris - à l'écran; rien de bien méchant finalement.

Si vous avez un chipset Intel GMA 500 et voulez jouer à Age of Empires, vous pouvez utiliser mon patch

Il reste un petit bug que je n'ai pas réussi à corriger, le texte au cours de la partie est affiché sur fond rouge...au lieu d'être sur fond transparent...pas un gros soucis je pense :)
Date de dernière modification : 20/10/2011