La carte 3D : 3dfx Voodoo Graphics

Avec -voodoo, l'émulateur ajoute une 3dfx Voodoo Graphics (SST-1) dans un slot PCI. Dans BeOS, le support 3dfx du projet BeOS-Glide la trouve comme une vraie carte : le driver thdfx, la librairie Glide 2.x, OpenGL (Mesa 3.2.1), les tests de 3dfx, les démos OpenGL et des jeux tournent dessus (Virtua Racing, Mage Slayer).

La carte émulée

carteVoodoo Graphics, PCI 121a:0001, révision 2 ; un BAR mémoire de 16 Mo
FBI4 Mo de frame buffer : deux ou trois buffers 16 bits et le z-buffer, 640x480 ou 800x600
TMUdeux (-voodoo, comme les cartes Obsidian), ou un seul (-voodoo1tmu, la Diamond Monster 3D et la plupart des cartes du commerce) ; 4 Mo de textures chacun
DACICS5342 (les PLL que Glide lit pour l'identifier)

Avec deux TMU, les jeux appliquent deux textures en une passe (texture et lightmap) ; certains, comme le portage de Mage Slayer, n'affichent leurs lightmaps qu'à cette condition.

Comme la vraie carte, la Voodoo a sa propre sortie vidéo : tant qu'un programme Glide tourne, la fenêtre de l'émulateur montre l'image de la Voodoo à la place de l'écran Cirrus, puis revient au bureau quand il se termine.

Installer le support 3dfx dans BeOS

Le paquet prêt à installer, 3dfx-beos-ppc-1.0.tar.gz, est dans les téléchargements.

  1. Le passer dans BeOS par le dossier partagé : mettre l'archive dans un dossier de l'hôte, par exemple partage/, puis lancer

    bebox -romdump flash.bin -hd0 beos.img -voodoo -share partage

    Dans BeOS, monter le disque partagé (menu Mount du bureau) et copier l'archive sur le disque de BeOS avant de la décompresser (le disque partagé est en FAT). Dans un Terminal :

    cd /boot/home
    gunzip -c 3dfx-beos-ppc-1.0.tar.gz | tar xf -
  2. Installer la version Voodoo Graphics (install.sh sans argument installe celle de la Voodoo 2, qui n'est pas émulée) :

    cd 3dfx-beos-ppc-1.0
    sh install.sh voodoo1

    Le script doit afficher OK: card found (/dev/3dfx_0). S'il répond que le driver est installé mais que /dev/3dfx_0 n'est pas apparu : vérifier que l'émulateur a été lancé avec -voodoo, puis redémarrer BeOS.

L'installation copie le driver dans ~/config/add-ons/kernel/drivers, Glide et Mesa dans ~/config/lib, et les commandes glidereset et voodoo dans ~/config/bin. Le mode d'emploi complet du paquet est dans son README.txt (LISEZMOI.txt en français).

Tests Glide

Depuis un Terminal, dans le dossier des tests (ils lisent leurs textures .3df) :

cd tests/voodoo1
./test00 -n 300      # efface l'écran
./test01 -n 300      # points
./test11 -n 300      # écritures directes dans le frame buffer
./test17 -n 300      # textures
./test21 -n 300      # composition de textures (lightmap)

Sans -n, un test attend une touche. Les 24 tests (test00 à test23) tournent.

OpenGL

Les démos de Mesa pour la 3Dfx (plein écran, clavier par le Terminal ; h : aide, Échap : quitter) :

cd opengl/demos
./teapot
./fire
./tunnel

Un programme OpenGL ordinaire de BeOS (BGLView) passe sur la Voodoo sans être recompilé, avec la commande voodoo :

voodoo /boot/apps/GLTeapot/GLTeapot
voodoo opengl/glspin

Sa fenêtre reste sur le bureau (clavier, souris) et l'image 3D est en plein écran sur la Voodoo.

Jeux

Des jeux Glide tournent avec le son, comme Virtua Racing et le portage Glide de Mage Slayer ; ils ne sont pas fournis : ils appartiennent à leurs ayants droit. Les jeux qui utilisent la Voodoo demandent -voodoo (deux TMU).

Dépannage

SymptômeCause et remède
install.sh ne trouve pas la carteémulateur lancé sans -voodoo, ou BeOS pas encore redémarré après l'installation
un test plante au démarrage ou les textures manquentpaquet ancien : sa lib Voodoo Graphics ne détectait pas sa mémoire de textures sur PowerPC (il fallait SST_TMUMEM_SIZE=4) et son lava.3df faisait planter test21. Utiliser celui des téléchargements
la fenêtre reste sur l'image 3D après un plantagetaper glidereset dans le Terminal : il ouvre et referme l'écran de la Voodoo, ce qui rend l'affichage au Cirrus
c'est lentCtrl droit + F10 montre dans le titre la vitesse que l'émulateur atteint
image ou comportement suspectessayer BEBOX_VOODOO_NOTHREAD=1 (rendu dans le thread principal) pour savoir si le thread de rendu est en cause

Variables d'environnement de Glide utiles : FX_GLIDE_NO_SPLASH=1 (pas de logo 3dfx), SST_INITDEBUG=1 (trace de l'initialisation de la carte).

Fonctionnement

L'émulation suit les définitions de registres et le code d'initialisation des sources Glide 2 publiées par 3dfx, et le comportement du pipeline décrit par l'émulation Voodoo de MAME (Aaron Giles).

  • Bus : registres (avec la sélection de puce par l'adresse et la correspondance alternative), LFB et mémoire de textures dans le BAR ; la BeBox étant big-endian et le PCI little-endian, les octets arrivent inversés comme sur la vraie machine, et Glide les remet dans l'ordre avec stwbrx/lwbrx ou les bits de swizzle de la carte.
  • Triangles : paramètres itérés depuis le sommet A, centres de pixels, rectangle de clipping, origine Y ; Gouraud, Z et W.
  • TMU : tous les formats de textures (NCC, palettes), mipmaps, filtrage bilinéaire, clamp ou répétition, perspective, unité de combinaison de texture ; le TMU 1 alimente le TMU 0.
  • Pixels : combinaison de couleur et d'alpha, chroma key, test alpha, brouillard (table, alpha, Z), mélange, dithering 4x4 et 2x2, masques d'écriture, buffer alpha ou de profondeur.
  • LFB : lecture et écriture dans tous les formats, avec ou sans le pipeline de pixels.
  • Vidéo : timing, retour vertical, permutation des buffers synchronisée sur le retour vertical (les commandes suivantes attendent dans la FIFO).
  • Thread : le rendu tourne dans son propre thread, en parallèle de l'émulation des processeurs. Le thread de l'émulation garde le timing vidéo et le registre de statut ; les lectures qui dépendent du rendu attendent qu'il ait fini. Le programme ne peut pas prendre plus d'une image d'avance sur le rendu, ce qui limite la latence des commandes.

Pas émulé : la Voodoo 2, le SLI, le mélange trilinéaire et les textures de détail (les facteurs de combinaison basés sur le LOD valent 0).