Programmation directx 8 tutorial 2 : capacites de l'adaptateur graphique

Contenu du snippet

Ce deuxième tutorial va permettre d'analyser les possibilité de notre adaptateur graphique qu'il soit une carte accélératrice 3D, ou un bon vieux Chipset aidé du CPU. Ce tutorial est optionnel pour faire de la 3D. Il est utile pour que la création d'applicationspuisse être portable d'une machine à une autre, nos ordinateurs possédant tous leurs caractéristiques graphiques. Il va également permettre en connaissant les capacités de l'adaptater graphique, de mieux cibler d'où viennent certaines erreurs d'Automation (Vous savez, quand ça plante dans directX et qu'on ne comprend jamais tout de suite pourquoi)
Voilà, bon courage.

Source / Exemple :


'TUTORIAL 2 - ETUDE DES CAPACITES DE L'ADAPTATEUR GRAPHIQUE
'P. ROUSSEAU Alias LaPatoshe
'Introduction
'Comme je l'ai laissé entrevoir dans le Tutorial 1 visible sur ce site, il existe des modes graphique dans
'Direct3D qui peuvent être supportés ou non par l'Adaptateur graphique. Si on ne connait pas les possibilités
'de notre carte graphique, DirectX8 permet de les énumérer via plusieurs fonctions de l'objet Direct3D8.
'Il permet également de tester les fonctions de calcul graphique (tel que les calculs vectoriels,
'matriciels, les éclairages...) de notre carte et prévoit si elles sont supportées matériellement.
'En effet, les cartes ou composants graphiques du commerce telle que les G-FORCE par exemple possèdent
'des fonctions enregistrées de calcul divers accelélérant considérablement la vitesse de rendu
'des graphisme 3D. Cependant, d'autre cartes, notamment sur les ordinateurs dit de bureau ou vendu
'dans des configurations dites bas de gamme possèdent des cartes ou composants graphiques simples, ne possédant
'pas de fonctions de calcul 3D d'enregistrées. Pour ces dernières, il va faloir émuler via le processeur ces
'fonctions.

'Le présent Tutorial va donc vous montrer comment obtenir le nombre de carte graphiques présentes dans votre
'machine, leurs noms et leurs pilotes, les capacités de calcul d'affichage matérielles et logicielles de la
'carte, les modes graphiques supportés.

'Nous allons pour cela ouvrir un nouveau projet contenant une feuille nommée Form1 et nous faisons toujours
'référence à DirectX8 dans notre menu Projet.
'Ce Projet n'affichera pas de rendu, il va se contenter de l'énumération des capacités de notre carte
'graphiques et autres descriptions de notre carte graphique qui seront affichées dans des controles VB de
'type Label et list.

'Sur la feuille Form1, nous allons placer huit controls Label et trois controls liste.
'Placez en propriété de Caption du Label1 : Nombre d'adaptateurs graphique
'Effacez la propriété de caption du label2, et placez le Label2 en face du Label 1
'Placez en propriété de Caption du label3 : Nom et Pilote de l'adaptateur
'Placez le Label 4 en face du Label3 et effacez sa propriété de Caption
'Prévoyez une fenêtre assez grande pour le label4, car les noms de Carte et
'leur pilote peuvent être de grande taille
'Placez en propriété de caption du Label5 : Type de calcul 3D
'Effacez la propriété caption du Label6 et placez le controle en face du Label5
'Placez en propriété de caption du label7 : Résolutions graphiques
'Placez la liste1 en face du Label7 ; C'est elle qui va contenir les résolutions
'Placez en propriété de caption du label 8 : Capacité de calcul
'Placez en face du Label8 la liste 2 qui contiendra les possibilités de calcul 3D matérielle (Pcapam)
'Placez à côté de list2 la list3 qui contiendra les possibilités de calcul 3D logiciel (Pcapal)
'Nota : Une carte 3D possédant des fonctions accélératrices matérielles, peut aussi se voir
'émuler ces fonctions si on le désire en la paramétrant en REF lors de la création du Device
'(Qui peut le plus peut le moins)

'Début du Programme
'Nos déclarations d'objet DirectX8 ne changent pas
Dim PDirectX As New DirectX8
Dim Pdirect3D As Direct3D8
Dim PDirect3Ddevice8 As Direct3DDevice8 'Nous ne nous en servirons pas dans ce tutorial, je le laisse pour
                                        ' en laisser prendre l'habitude

'Nous allons maintenant déclarer les variables et structures suivantes:
Dim Pnbcarte As Long 'variable qui va contenir le nombre de cartes graphiques de la machine.
'                     C'est juste pour information, car en fait, dans ce tutorial, nous
'                     n'étudierons que celle déclarée par défaut dans windows et
'                     qui correspondra au numéro d'indice 0
Dim Pcarteinfo As D3DADAPTER_IDENTIFIER8 'C'est la structure qui va contenir les informations
'                      de base de la carte graphique (son nom, son pilote...)
Dim Pcpta As Long 'Compteur à utilité multiple
Dim Pcptb As Long 'deuxième compteur
Dim Pmot As String 'Cette variable va recevoir les informations textuelles sur la
'                   carte graphique avant qu'on ne les place dans les Labels 2 et 4

Dim Pcapam As D3DCAPS8 'Structure chargée de contenir les capacités matérielles de calcul de notre carte
'                   graphique (nb de lumière, nb de points affichables ...)

Dim Pcapal As D3DCAPS8 'Idem, mais on placera dans celle ci les capacités 3D données par l'émulation Logicielle.

Dim Pnbmode As Long 'nombre de résolution graphique de notre adaptateur graphique
Dim Pmode As D3DDISPLAYMODE 'structure qui va contenir les différente résolutions graphiques possibles
Dim PHAL As Boolean 'Variable que nous utiliserons si l'acceleration materielle est supportée ou non

Private Sub Form_Load()
Set Pdirect3D = PDirectX.Direct3DCreate() 'On déclare comme d'acoutumé notre objet Direct3D

'La nouvelle partie de code qui va permettre d'obtenir les premières informations sur la ou
'les cartes graphiques de notre appareil débute ici
'Pour obtenir toutes les informations voulues sur la ou les cartes graphiques de la machine,
'on va se servir essenciellement des fonctions de l'objet de base Direct3D8.
Pnbcarte = Pdirect3D.GetAdapterCount 'On obtient le nombre de cartes ou composants graphiques présents dans
'la machine, nombre qui est placé dans Pnbcarte. Comme dit précédemment, on étudiera uniquement
'la carte graphique n°0.
Label2.Caption = Str(Pnbcarte) 'Le Label2 indique le nombre de cartes graphiques présente dans
'                               notre machine.
Pdirect3D.GetAdapterIdentifier 0, 0, Pcarteinfo 'fonction de Direct3D demandant à placer dans
'                           la structure Pcarteinfo les données de la carte graphique n°0.
'                           Le numéro de la carte graphique est le premier 0 passé en paramètre
'                           de la fonction GetAdapterIdentifier.
'                           Le deuxième zéro correspond à un flag mais j'ignore à quoi il
'                           correspond exactement. Je le laisse à 0 comme le conseille le SDK
'                           Nous allons soutirer maintenant de notre structure Pcarteinfo,
'                           toutes les informations compréhensibles à savoir le nom de la carte,
'                           et son pilote. Les autres informations sont plus ou moins utiles,
'                           et sont pour certaines inscrites sous forme de pointeur.

'Seulement, voila, notre structure PcarteInfo pour ce qui est du nom de la carte graphique et de
'son pilote, ne contient pas ces informations sous forme d'une chaine string simple. On ne peut pas écrire
'par exemple nomcarte=Pcarteinfo.Description.
'Il faut procéder à un bouclage sur cette fonction qui à chaque passage va nous permettre de récuperer
'le nom de l'adaptateur graphique lettre par lettre
'Voici la méthode :
Pmot = ""
For Pcpta = 0 To 511 'debut de la boucle; 511 est la longueur totale de la chaine que peut former le nom
'                    de notre carte graphique
    Pmot = Pmot & Chr$(Pcarteinfo.Description(Pcpta)) 'Pmot est notre variable string qui va contenir le
'                                 nom de notre carte graphique.
'                                 A chaque augmentation de PCpta, on récupère la lettre suivante sous
'                                 forme ASCII contenue dans la propriété Description de Pcarteinfo.
Next Pcpta 'fin de boucle ; a ce stade, Pmot contient la phrase entière décrivant notre adaptateur graphique

Label4.Caption = Pmot 'On affiche dans le Label 4 la description de notre carte graphique

'On va maintenant faire la même chose pour le pilote de notre carte
Pmot = ""
For Pcpta = 0 To 511
    Pmot = Pmot & Chr$(Pcarteinfo.Driver(Pcpta)) 'Ici, c'est la propriété Driver qui contient nos informations
Next Pcpta
Label4.Caption = Label4.Caption + " - " + Pmot 'On ajoute dans notre label4 le pilote

'Si vous jetez un coup d'oeil à PcarteInfo, vous pouvez voir qu'il existe aussi une propriété Révision, ou
'encore DriverVersionHighPart mais je ne m'y suis jamais vraiment intéressé. Mieux vaut prendre dans DirectX
'l'essentiel pour commencer sous peine d'être noyé sous une tonne d'information dont nous ne nous servirons
'jamais (Y a qu'à voir la taille de l'aide du SDK)

'Maintenant, nous allons rechercher les résolutions supportées. .
'Pour énumérer les résolutions graphiques, on va dans un premier temps demander à Direct3D de nous en donner
'le nombre que nous allons placer dans notre variable Pnbmode

Pnbmode = Pdirect3D.GetAdapterModeCount(0) '0 correspond à l'adaptateur graphique n°0. On aurait pu le
'                                           remplacer par D3DADAPTER_DEFAULT

'On va utiliser la structure Pmode de type D3DDISPLAYMODE déclarée précédemment
'Cette structure que nous plaçons dans une boucle va être chargée tour à tout avec chacune des résolutions
'possible via la fonction EnumAdapterDisplayModes de Direct3D8. A chaque passage, nous allons implémenter
'avec cette résolution le contrôle list1.

For Pcptb = 0 To Pnbmode - 1
    Pdirect3D.EnumAdapterModes 0, Pcptb, Pmode 'On place dans Pmode le mode graphique n°Pctb de l'adapteur
'                                               graphique n°0 (on aurait pu inscrire D3DADAPTER_DEFAULT)
    
    List1.AddItem Pmode.Width & " " & Pmode.Height & " " & Pmode.Format 'On place dans la liste1 le mode n°Pctb chargé
'                                                           dans Pmode .L'information du Format contenue dans Pmode
                                                            'correspond à la valeur décimale d'une des constantes de
'                                                           mode de couleur (16 bits, 24 bits ou 32 Bits... et leurs
'                                                           variantes. Ces valeurs décimales peuvent être traduites,
'                                                           en tapant CONST_D3DFORMAT dans l'index de l'aide du SDK).
'                                                           Pour info, il s'agit des formats supportés lors de la création
'                                                           d'un Device (voir tutorial 1, variable PstructParameter). Cela
'                                                           ne correspond pas forcément aux résolutions possibles visibles dans
'                                                           l'affichage de Windows (Panneau de Configuration). Pour certaines machines,
'                                                           le fait de supporter par exemple D3DFMT_A8R8G8B8 (32 Bits) permet également
'                                                           de supporter ses variantes (D3DFMT_X8R8G8B8), mais ce n'est pas toujours le cas.
'                                                           Respecter lors de créations de Device le format suivant la résolution si vous
'                                                           demandez un Format D3DFMT_A8R8G8B8 en résolution 720 X 480 et que cette dernière
'                                                           apparait uniquement supporter le D3DFMT_R5G6B5, vous aurez une erreur, même si D3DFMT_R5G6B5 est
'                                                           hiérarchiquement inférieur au D3DFMT_A8R8G8B8.

Next Pcptb 'fin de boucle

'Maintenant que nous connaissons notre carte graphique, son pilote, sa résolution, et même sans connaitre tout
'ça, nous allons nous intéresser à ses capacités de calcul(autrement dit, est ce que notre Carte Graphique
'peut effectuer les calculs 2D et 3D que va lui demander DirectX en utilisant ses fonctions materielles,
'ou va t il falloir les simuler par émulation logicielle ?)

'Nous allons le savoir en testant la réaction de notre programme lors de la déclaration de la carte comme
'supportant toutes fonctions de calcul 2D 3D nous n'allons pas créer un Device en le déclarant HAL avec tous
'ses paramètres comme dans le tutorial 1(Ca serait trop long par rapport à ce qu'on peut faire d'autre).
'Nous allons demander à l'adaptateur graphique ses capacités lorsque nous le déclarons comme pouvant utiliser
'ses fonctions 2D et 3D matérielles en le déclarant directement HAL.
'Si notre carte graphique ne possède aucune fonctions 2D 3D (encore appelée accélération 2D 3D), alors, une
'erreur devrait se produire (sauf exception voir nota en fin de tutorial) et c'est la détection de cette erreur
'qui va nous permettre de dire que notre carte graphique supporte matériellement les calculs 2D 3D ou s'il
'faut les émuler de façon logicielle.

'Nous allons utiliser la fonctions de Direct3D8 chargeant dans la structure Pcapam les capacités matérielles de
'calcul graphiques de notre carte.

Pdirect3D.GetDeviceCaps 0, D3DDEVTYPE_HAL, Pcapam 'Charge les capacités Graphique de notre carte par défaut (0)
'                                                  en mode matériel dans Pcapam

'Si ce code génère une erreur en dehors erreur de syntaxe, cela signifie que l'accélération matérielle n'est
'pas supportée et donc, que notre carte graphique ne supporte pas l'accélération 3D matérielle (HAL).

If Err.Number = D3DERR_NOTAVAILABLE Then 'test effectuant si une erreur a été detectée lors de l'utilisation
'                                         du HAL
    
    Label6.Caption = "Pas d'Accélération matérielle, Accélération Logicielle"
    PHAL = False 'On demande donc à direct3D de ne pas s'occuper des capacités de notre carte en accélération
'                 Matérielle (variable utile pour l'énumération des listes 2 et 3 qu'on verra après)
Else
    Label6.Caption = "Accélération matérielle et Logicielle"
    PHAL = True 'Variable qui va vous servir pour l'implémentation des listes 2 et 3
End If

'Maintenant que l'on sait si notre carte supporte le mode HAL (accélération matérielle), et que si oui, ses
'capacités matérielles sont chargées dans PCapam, nous allons charger ses capacités logicielle dans Pcapal, c'est
'à dire que peut faire notre affichage via DirectX si on émule de façon logiciel ses fonctions de calcul

Pdirect3D.GetDeviceCaps 0, D3DDEVTYPE_REF, Pcapal 'On place les capacités logicielles dans capal

'Maintenant, nous allons mettre dans la list2 toutes les capacités Hardware si elles sont supportées et dans
'la liste 3 toutes les capacités locicielles

If PHAL = True Then
    List2.AddItem Pcapam.MaxPrimitiveCount 'Nombre de primitive gérées par le matériel
    List2.AddItem Pcapam.MaxSimultaneousTextures 'Nombre de texture simultanées
    List2.AddItem Pcapam.MaxActiveLights 'Nombre de lumières
    'Tout ceci est un échantillon, essayez avec les autres données de Pcapam
End If

'on place maintenant dans list3 les mêmes données mais en accélération logiciel
'On n'a pas besoin de test de l'accélération logicielle car elle est toujours supportée
List3.AddItem Pcapal.MaxPrimitiveCount
List3.AddItem Pcapal.MaxSimultaneousTextures
List3.AddItem Pcapal.MaxActiveLights 'Si comme moi vous obtenez -1 cela  signifie lumières infinies

'Et oui, il semble que l'accélération logicielle permette l'emploi de beaucoup plus l'éléments en même
'temps, mais sachez qu'il s'agit d'un mode de calcul plus lent par rapport aux calculs matériels, car ils sont
'effectués par le Processeur de l'ordinateur. Si comme moi en capacité logiciel, vous obtenez -1 pour le
'maximum d'éclairages (MaxActiveLights), cela signifie qu'il est illimité.

'Nota:
'Pour info, en addentum du tutorial 1, et d'après ce que je viens de constater récémment, en traduction du SDK
'le fait de créer un Device en indiquant HAL ou REF, indique que l'on va soit utiliser les fonctions accélératrice connues
'materiellement par notre carte graphique, ou qu'on va toutes les émuler.
'D'après ce que j'ai compris du SDK et de certains tutoriaux dédiés à DirectX, La constante du VERTEXPROCESSING,
'serait en ce qui la concerne, une sorte de pourcentage d'utilisation de notre matériel.
'Je m'explique, un device déclaré en HAL, et couplé avec la constante D3DCREATE_PUREDEVICE voudrait dire qu'on
'veut que nos graphismes 3D soit uniquement traités de façon materielle (On n'accepte aucune émulation)
'Si on accepte une émulation logicielle légère on utilisera et c'est conseillé D3DCREATE_HARDWARE_VERTEXPROCESSING.
'Si on veut plus d'émulation D3DCREATE_MIXED_VERTEXPROCESSING, et si on veut une émulation totale bien qu'on
'soit en HAL on indiquera D3DCREATE_SOFTWARE_VERTEXPROCESSING.
'Cependant, sur mon ordinateur perso, muni d'une G-FORCE 2 MX j'ai réalisé des essais avec une forme 3D qui tourne. je sais, je n'ai
'pas encore écrit de tutorial la dessus, ça va venir. En déclarant mon device en HAL, c'est indéniable, c'est 100 fois plus rapide
'qu'en REF. Cependant, le fait de coupler le HAL avec D3DCREATE_SOFTWARE_VERTEXPROCESSING donne un résultat au moins trois fois plus
'rapide qu'en utilisant D3DCREATE_HARDWARE_VERTEXPROCESSING. Aussi, lorsque vous effectuerez les essais des prochains tutoriaux relatif
'aux dessins 3D, merci de tester cela, et de me faire part de vos résultat selon votre matériel.

'Aussi, pour ce qui est d'une autre info, il m'est apparu que certaines carte graphiques acceptent le type HAL
'bien qu'elles ne soient pas des cartes acceleratrices 3D à la base. En revanche, les quelques fonctions dont elle
'disposeraient, ne semblent pas être à la hauteur des cartes graphiques 3D (Cela se voit aux possibilités qu'elles
'affichent dans le listing 1. J'ai testé ce programme sur un Celeron sans carte 3D, et les éclairages Maxactivelight étaient à 0... par exemple)

'Enfin, pour une autre remarque, j'ai testé un Device créé en REF avec les constantes D3DCREATE_HARDWARE_VERTEXPROCESSING et D3DCREATE_MIXED_VERTEXPROCESSING,
'et cela ne m'a pas engendré d'erreur que ce soit sur un machine équipée d'une carte accélératrice 3D ou non ce qui me semblait paradoxal.

End Sub

Conclusion :


Comme pour le tutorial 1, merci de déposer vos commentaires sur ce Code. J'essairai d'y répondre du mieux que je peux. Merci également pour vos remerciements pour le Tutorial 1 et pour les aides que certains d'entre vous ont fournies aux autres.
Le Prochain tutorial expliquera comment dessiner en 2D et en 3D avec DirectX8
Salut à tous.

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.