AMD Radeon HD 5870 et 5850

Publié le 23/09/2009 par
Imprimer
Direct3D 11
Notez tout d’abord que les évolutions présentées ici concernent Direct3D 11, même si par abus de langage il y est souvent faire référence en tant que DirectX 11. Nous utiliserons ici le terme Direct3D, mais l’usage courant fait que vous rencontrerez souvent DirectX 11 pour représenter la même chose.

Si Direct3D 10 permettait avant tout de jeter de nouvelles bases, Direct3D 11 permet enfin de les rendre intéressantes. Au menu, de grosses nouveautés et un retour au support de toutes les générations de cartes graphiques. C’était là LE point noir de l’API actuelle et Microsoft l’a bien compris.

Ainsi, Direct3D 11 sera disponible pour Windows Vista. En fait il l’est déjà à condition d’activer cette mise à jour via un script  pour qu’elle apparaisse dans Windows Update. Il sera également compatible avec les cartes Direct3D 10... et DirectX 9. Microsoft anticipant et encourageant ici une évolution massive de Windows XP vers Windows 7 pour les joueurs qui avaient boudé Vista. Pour cela, Microsoft a dû redévelopper une nouvelle API compatible Direct3D 9, ce qui s’est fait à partir de Direct3D 10. Microsoft s’est arrangé pour que les fonctions soient équivalentes aux anciennes de manière à ne pas entrainer trop de charge du côté des fabricants de cartes graphiques qui n’auraient pas été d’avis de soutenir un développement coûteux pour des anciens produits. Avec Direct3D 11 il sera donc possible d’exploiter les cartes DirectX 9 aussi bien à travers Direct3D 10 qu’à travers Direct3D 11. Voici les 6 niveaux de fonctionnalités supportés par Direct3D 11 :

D3D_FEATURE_LEVEL_9_1 : niveau Direct3D 9 et shader 2.0 basique, destiné aux chipsets intégrés Intel et aux GeForce FX.
D3D_FEATURE_LEVEL_9_2 : niveau Direct3D 9 et shader 2.0 plus évolué, destiné aux Radeon 9700 et supérieures.
D3D_FEATURE_LEVEL_9_3 : niveau Direct3D 9 et shader 3.0, pour les Radeon X1000 et les GeForce 6/7.
D3D_FEATURE_LEVEL_10_0 et 10_1 : correspondent aux versions classiques de Direct3D 10 et peuvent supporter optionnellement via un nouveau pilote les formats étendus pour les buffers ainsi que Compute-on-10, les compute shaders en version 4.0 et 4.1.
D3D_FEATURE_LEVEL_11 : représente le support complet de toutes les fonctions de Direct3D 11

Avant de décrire en détails les trois plus grosses nouveautés de la nouvelle API, mentionnons les deux plus petites qui ne sont pas moins importantes. La première est la possibilité d’assembler des petits bouts de code pour composer les shaders. Une technique qui permet de simplifier leur création et d’éviter aux développeurs de créer un gros shader peu efficace ou des milliers de shaders spécifiques à chaque cas particulier.

Ensuite l’API introduit de nouvelles techniques de compression des textures, BC6 et BC7, respectivement optimisées pour compresser les images HDR et les normal maps qui ne peuvent pas être compressées efficacement avec les techniques classiques.


Multithreading
La première grosse nouveauté de Direct3D 11 se situe au niveau du mutlithreading pour la première fois supporté au niveau de l’API. Actuellement le gros morceau du moteur 3D n’est composé que d’un seul thread pour le rendu, avec des petits threads pour la physique, le son, l’IA etc. Le pilote graphique peut arriver à trouver des opportunités de multithreading, mais cela reste limité. Avec la nouvelle API il sera possible de multithreader efficacement le cœur du moteur de rendu. Pour cela Microsoft introduit le mode de rendu différé en plus du mode immédiat.

Attention à ne pas le confondre avec les moteurs de rendu différé utilisés dans certains jeux comme S.T.A.L.K.E.R. puisqu’il s’agit là d’une technique de rendu. Dans le cas de Direct3D 11 il s’agit de remplir un buffer de commandes dans un premier temps et de le traiter dans un second temps, les 2 étapes pouvant être parallélisées. Ironiquement nous pouvons voir cela comme un retour aux premières versions de Direct3D qui étaient plutôt décriées. Mais en pratique c’est cette fois l’API elle-même qui se charge de tout d’une manière transparente bien qu’une amélioration du GPU permette de rendre la méthode plus efficace encore.


Plus en détail il est possible d’utiliser de nombreux petits threads indépendants pour remplir le buffer de commandes. Microsoft a fait le nécessaire pour que les développeurs n’aient pas à se soucier de la plupart des problèmes de synchronisations entre threads ce qui est la partie la plus complexe et un frein au multithreading. Passer à ce mode de rendu différé a cependant un coût qui ne sera justifié que par la nécessité d’utiliser plusieurs threads.

Nous avons pu tester cela sur une Radeon HD 4890 avec une démo fournie par Microsoft dans son SDK et qui tourne sur toutes les cartes Direct3D 10. Celle-ci représente une scène limitée par le CPU,

- Rendu en mode immédiat : 55 fps
- Rendu en mode différé non-multithreadé : 48 fps
- Rendu en mode différé multi-threadé : 78 fps


Tessellation
Enfin ! Après de nombreuses hésitations et rétractions à chaque développement de nouvelle API, Microsoft a intégré la tessellation. Pour rappel, il s’agit d’une technique qui permet de subdiviser les polygones, en général des triangles, de manière à ajouter des détails géométriques. Si elle semble simple, la réalité est plus complexe compte tenu des nombreuses méthodes pour la division, de la nécessité de bien positionner les nouveaux petits triangles et d’utiliser un niveau de détail variable.

Depuis les Radeon HD 2000 tous les GPUs d’ATI intègrent une unité de tessellation fixe. Le problème est que pour être utilisée d’une manière flexible il faut recourir à plusieurs astuces et plusieurs passes, ce qui n’est pas toujours très pratique. Elle n’a d’ailleurs jamais été utilisée. Avec Direct3D 11, en plus de l’unité de tessellation fixe, Microsoft a ajouté 2 nouveaux types de shaders destinés à la contrôler. Le premier, le hull shader va se charger de préparer les données, de calculer le facteur de tessellation (pour subdiviser plus ou moins) et les point de contrôles qui seront nécessaires pour mettre en place par la suite le maillage plus fin puisque l’unité de tessellation se contente simplement de diviser les triangles en plus petits triangles. Ils restent donc « plats » ce qui n’apporte aucun intérêt en tant que tel. Le facteur de tessellation, qui doit être spécifié pour chaque côté de chaque triangle est important pour le niveau de détail. S’il est fixe, il risque de générer des trop petits triangles qui vont massacrer les performances puisque les pixel shaders travaillent au minimum sur des blocs de 2x2 pixels, en plus d’ajouter de la charge par rapport à leur nombre. D’où l’importance d’utiliser des algorithmes de tessellation adaptatifs.


Le second shader, le domain shader, va se charger de déformer le maillage pour profiter d’une géométrie plus détaillée. Plusieurs techniques sont possibles suivant ce que le développeur veut, d’où l’obligation de passer par des shaders programmables. Par exemple le domain shader peut être utilisé pour arrondir, lisser les surfaces. Dans ce cas il va utiliser les points de contrôle en provenance du hull shader comme repère pour arrondir le maillage. Il est également possible d’utiliser une texture pour faire du displacement mapping et cette fois ajouter de vrais détails géométriques au lieu de les simuler avec du bump mapping. Une technique dont nous parlons depuis de nombreuses années et qui devient enfin réalité.



Compute shaders
La dernière grosse nouveauté introduite par Direct3D 11 se nomme compute shader ou DirectCompute. C’est un nouveau type de shader qui permet d’utiliser la puissance de calcul des GPUs d’une façon généraliste, en dehors du pipeline de rendu 3D classique. Grossièrement il s’agit de la version de Microsoft de l’OpenCL. Les compute shaders présentent l’intérêt d’être standardisés et donc d’être supportés directement sur toutes les cartes graphiques compatibles, contrairement à OpenCL qui a laissé toutes les portes ouvertes. L’autre intérêt, principalement en version 5.0, est qu’ils sont prévus pour interagir efficacement avec un rendu 3D dans DirectX, ce qui simplifie leur utilisation pour le calcul de la physique ou d’une géométrie non polygonale ou encore pour les effets de post processing. Ceux-ci sont actuellement traités via un pixel shader mais ce n’est pas toujours très efficace. Les compute shaders vont permettre assez simplement d’améliorer les performances pour ce type d’effets.

Pour faciliter leur introduction, Microsoft n’a pas ajouté uniquement des compute shader au niveau 5.0, mais également au niveau 4.0 et 4.1, de quoi permettre aux cartes graphiques de la génération DirectX 10 et 10.1 de les supporter, avec quelques limitations bien entendu. Du côté de Nvidia, tous les GPUs depuis les GeForce 8 sont compatibles avec les compute shaders 4.0 depuis les pilotes 190.62 alors que du côté d’AMD, seules les Radeon HD 4600 et 4800 pourront obtenir la compatibilité au niveau 4.1, si AMD développe de tels pilotes. Les Radeon HD 2000, 3000 et 4300/4500 ne pourront pas y prétendre puisqu’elles ne disposent pas de mémoires partagées entre les threads exécutés au sein d’un même groupe.
Vos réactions

Top articles