Dans mon dernier article, j'avais parl� des cartes 3Dfx et de leurs bonnes capacit�s
� fournir une accell�ration mat�riel pour Mesa. J'ai abord� les avantages et les inconv�nients
de l'utilisation de Mesa+3Dfx, et aujourd'hui, je voudrais insister sur les inconv�nients et
comment le d�veloppeur peut les contourner.
Pour commencer, l'article informatif de Miguel explique
comment utiliser la biblioth�que GLUT pour tracer dans des fenêtres filles (sous-fenêtres) incluses dans la
fenêtre principale. En utilisant des sous-fenêtres, un nouveau contexte est cr�� s�par�ment
de celui de la fenêtre principale. Malheureusement, le pilote 3Dfx pour Mesa ne supporte qu'un
contexte pour l'instant. Si vous essayez d'utiliser des sous-fenêtres avec une 3Dfx, vous
constaterez qu'au lieu de se tracer dans la fenêtre principale, la sous-fenêtre la recouvre.
Ceci provoque un effet de clignotement rapide tant que les deux fenêtres sont trac�es alternativement.
Cela n'est �videmment pas l'effet souhait�, aussi devront nous attendre les futures explications de
Miguel sur la fa�on de contourner le probl�me en utilisants des sous-fenêtres en manipulant les piles
matricielles.
Deuxi�mement, je voudrais montrer comment on peut s'affranchir du probl�me qui consiste � conserver
la souris active (focus) en utilisant le rendu plein �cran avec une 3Dfx. Le rendu plein �cran
avec une 3Dfx est r�alis� au moyen du tampon de la 3Dfx au lieu de celui de l'adaptateur de votre carte
video 2D. Le r�sultat est que la fenêtre est cr�e pour le programme sur le bureau en 2D, mais que tout
le rendu l'est en plein �cran par la 3Dfx. Sur un syst�me mono-moniteur, la 3Dfx prend le dessus et vous
ne pourrez pas voir la fenêtre sur le bureau 2D. Par contre sur un syst�me � deux moniteurs, l'un vous
montrera votre bureau 2D et la fenêtre cr�e pour le programme, tandis que sur l'autre moniteur vous
pourrez voir le rendu plein �cran du programme.
Sur les syst�mes mono-moniteur, il peut être parfois difficile de maintenir la fenêtre
principale active sur le bureau 2D parce que vous ne pourrez pas voir la fenêtre. Si la fenêtre sur
le bureau 2D perd la main (le focus), elle ne pourra plus accepter d'entr�es. Si le programme ne peut
pas accepter des entr�es pour d�tecter quand l'utilisateur appuie sur une touche de sortie d�termin�e
et que cet utilisateur ne peut pas voir le bureau 2D pour localiser le bouton dans la fenêtre, et
donc terminer le programme, il ne pourra pas le quitter!
Une astuce que vous pouvez utiliser pour contourner ce probl�me, est d'utiliser les fonctions
glutFullScreen() et glViewport(). La fonction glutFullScreen() redimensionne la fenêtre du programme
aux dimension du bureau 2D de telle sorte qu'elle y soit en plein �cran. Vous pouvez appeler glutFullScreen()
apr�s avoir cr�� une fenêtre pour la dimensionner en plein �cran sur le bureau 2D. Quand la fenêtre
occupe tout l'�cran, la souris ne peut plus quitter la fenêtre et cette derni�re � toujours la main (focus).
La fonction glViewport() dit au programme quelle sera l'�tendue de la zone de trac� sur l'�cran.
Quand vous sp�cifiez une telle zone (viewport), tous les trac�s sont rendus dans cette zone. Pour la 3Dfx,
o� normalement vous devriez appeller glViewport() dans une fonction de rappel de redimensionnement pour
d�finir le viewport aux nouvelles dimensions de la fenêtre, appelez glViewport() avec les dimensions de la
r�solution de la 3Dfx. Si la 3Dfx fonctionne � 640x480, appellez glViewport(0,0,800,600). Ceci fera tracer
le programme aux dimensions du viewport que vous avez sp�cifi�es � la r�solution de la carte 3Dfx même si la
fenêtre est en plein �cran.
J'ai inclus une version modifi�e de triangles ombr�s et liss�s de Miguel pour marcher avec la 3Dfx
(../../common/March1998/example3.c,../../common/March1998/Makefile). J'ai simplement exclus les
sous-fenêtres ajout� glutFullscreen() au bon endroit (apr�s la cr�ation de la fenêtre) et chang� glViewport()
dans la fonction de rappel de redimensionnement pour forcer le viewport � 640x480 (la r�solution de ma
carte 3Dfx). Remarquez que si vous l'ex�cutez sans la 3Dfx (en n'affectant pas la variable d'environnement
MESA_GLX_FX) la fenêtre du programme s'ouvrira aux dimension de votre bureau, mais le trac� est seulement
rendu sur une surface de 640x480 dans cette fenêtre. Si vous ex�cutez le programme avec la 3Dfx, le trac�
s'effectue sur la totalit� de la 3Dfx et le programme perd la main.
Remarqez aussi que quand le programme est ex�cut� sans la 3Dfx, il peut être vraiment tr�s lent
du fait du rafraîchissement de toute la fenêtre au lieu de se limiter au viewport. Ceci porte un coup
aux performances quand le rendu s'effectue sur le bureau 2D mais c'est correct avec le plein �cran 3Dfx.
Pour cette raison, vous pouvez �crire vos programmes pour d�tecter si la 3Dfx est utilis�e (en lisant la
variable d'environnement MESA_GLX_FX) et en utilisant soit le truc de glutFullScreen() qui force le
glViewport() si la 3Dfx est d�tect�e, soit ne pas utiliser le truc si la 3Dfx n'est pas d�tect�e.
|