J'en avais déjà parlé dans un précédent article : les cartes vidéo 3dfx ont été à la base construite pour le gigantesque marché du PC qui lui est Little Endian.
Or, nos 68k sont Big Endian, ce qui entraîne une nécessaire conversion des données avec trois instructions : ror/swap/ror...
Bien sûr, ces trois instructions indispensables prennent déjà du temps au CPU et pèse aussi 6 octets à chaque conversion dans Warp3D !
En regardant de plus près le datasheet des 3dfx, il existe un bit appelé Swizzle qui permet de changer les registres internes du GPU en Big Endian :
Et ça fonctionne !!
Oui, après quelques modifications, ce bit est bien opérationnel et il est maintenant possible d'ôter toutes les conversions ror/swap/ror des W3D_AvengerLE.library et W3D_AvengerLEMU.library !
Le GPU "devient" en quelque sorte Big Endian, ce qui nous arrange bien !
J'ai ainsi pu commettre une très belle optimisation : 22,2 Ko de gagner sur la librairie ! Oui, vous avez encore bien lu, il y avait 22,2 Ko de ror/swap/ror dedans, et qui ont donc tous dégagés maintenant !! Allez, du balais !
Un grand MERCI aux ingénieurs 3dfx qui ont fait du bon travail !
Un peu de patience, je vais mettre les nouvelles versions en Downloads bientôt...
Bravo, car en lisant l'extrait du datasheet des 3dfx cela ne saute pas aux yeux .
RépondreSupprimerAs-tu obtenu un gain en fps pour GLBlitsQuake ?
Car en extrapolant :
Suppression des instructions "nop": 9ko=0,7fps ,
alors avec la suppression des instructions "ror/swap/ror": 22,2ko=1,7fps ?
Vincent V.
Avec mon 060, pas de speedup : je suppose que l'on arrive à une certaine saturation du bus Mediator. Après, je pense qu'avec un 030 ou 040, il y a du gain de vitesse puisque ces deux CPUs son moins puissants que le 060... Je vais faire quelques tests...
Supprimer