DirectX 11.1: ni pour GeForce 600, ni pour Windows 7 ?
Depuis un peu plus d'une semaine, l'absence de support de DirectX 11.1 sous Windows 7 est passée sous le feu des projecteurs. Surprise, nous apprenons aujourd'hui que les GeForce GTX 600 ne supportent tout bonnement pas cette API ! Notre analyse complète…
Pour Windows 8, l'API graphique phare du monde PC, DirectX, a été mise à jour en version 11.1. Par abus de langage, il est souvent fait référence à DirectX alors qu'il est question de sa composante 3D, Direct3D. DirectX est en réalité un ensemble d'API donc voici les composantes graphiques :
- Direct3D pour le rendu 3D
- Direct2D pour le dessin 2D des interfaces
- DirectWrite pour le dessin des polices de caractères
- DirectCompute pour le calcul massivement parallèle par GPU
- DXGI pour les tâches de bas niveau et s'interfacer avec les pilotes WDDM
DirectX 11.1 : quoi de neuf ?
Avec Windows 8, DXGI ainsi que les pilotes WDDM passent en version 1.2 et Direct3D passe en version 11.1. Cette version 11.1 de Direct3D reprend la rétrocompatibilité introduite avec Direct3D 11 : différents niveaux de fonctionnalités permettent à cette API de supporter tous les GPU à partir de la génération DirectX 9 introduite en 2002. Cette rétrocompatibilité est souvent source de confusion (même dans les documents de Microsoft!) puisqu'il faut différencier 11.1, la version de l'API, et 11.1, son niveau de fonctionnalité matériel maximal. Tout comme dans les fonctions de l'API et pour éviter cette confusion, nous utiliserons la notation 11_1 lorsqu'il est question du niveau de fonctionnalité.
Avant de rentrer dans le détail de la problématique des plateformes qui supportent DirectX 11.1, ou plutôt qui ne le supportent pas, il est important de revenir sur les évolutions qu'il représente. Celles-ci peuvent être groupées en 3 catégories :
- Réduire la lourdeur des API et faciliter le support des périphériques mobiles
- Simplifier le travail des développeurs
- Poursuivre l'évolution des fonctionnalités graphiques
Efficacité, mobilité, Windows RT et SoC ARM
La première est de loin la plus importante pour Microsoft puisqu'elle permet de mieux positionner Windows dans le monde mobile et surtout à Windows RT d'exister. En pratique cela revient à garantir la fluidité et la réactivité de l'interface, à économiser de l'énergie en déchargeant le CPU et à supporter les GPU présents dans les SoC ARM.
Microsoft s'est fixé comme objectifs de maintenir un affichage de l'interface à 60 fps, de réduire les saccades occasionnelles, d'accélérer l'affichage de la première image, de réduire la consommation mémoire et de réduire le coût CPU. DirectX 11.1 apporte ainsi son lot d'améliorations structurelles des API qui la composent dans le but d'en réduire la lourdeur, notamment avec une réduction du coût de certaines fonctions. De quoi gagner quelques milliwatts par-ci par-là et réduire la charge des cores CPU ARM, aux performances relativement modestes par rapport aux cores x86 traditionnellement exploités dans l'environnement Windows.
Microsoft cite quelques exemples avec des gains de performances obtenus à travers l'amélioration des API Direct3D, Direct2D et DirectWrite : +130 à +300% pour le dessin des textes et +180 à +400% pour le dessin des formes géométriques standard. De quoi permettre au système d'être plus souvent à l'état repos. Ces améliorations sont indépendantes du niveau de fonctionnalité matériel.
Une optimisation supplémentaire est par contre liée au niveau 11_1 des dernières cartes graphiques. Elle se nomme Target Independant Rasterization et consiste à déplacer le traitement des formes géométriques irrégulières du CPU vers le GPU. Pour cela, elle a besoin d'un rasterizer (unité du GPU qui découpe les formes géométriques en pixels) plus flexible, ce qui explique la limitation au matériel le plus évolué du moment. Microsoft parle de gain allant de +150% à +500% sur diverses formes vectorielles.
Avec Direct3D 11.1, Microsoft réintroduit la possibilité du calcul en basse précision pour les GPU. Rappelez-vous, cela avait déjà été le cas avec Direct3D 9 qui autorisait l'utilisation du FP16 (half) pour le calcul des shaders. Ce format a été abandonné avec Direct3D 10 et s'il peut toujours être présent dans le code pour des raisons de compatibilité, le compilateur le remplace systématiquement par le FP32 (double). Etant donné l'importance de réduire la consommation des périphériques, mais également avec l'arrivée de GPU plus rapides en basse précision dans certains SoC, Microsoft a réintroduit une possibilité similaire et les développeurs peuvent utiliser plusieurs nouveaux types de données :
- min16float : 16-bit flottant minimum
- min10float : 10-bit flottant minimum
- min16int : 16-bit entier minimum
- min12int : 12-bit entier minimum
- min16uint : 16-bit entier sans signe minimum
Si un GPU et son pilote graphique supportent ces formats, ils peuvent en profiter, sinon ils peuvent exploiter le premier format supérieur qu'ils supportent. Lors de l'utilisation de ces types de données, le format de calcul n'est ainsi pas garanti et les développeurs doivent éviter de se baser sur le comportement d'un format particulier (par exemple la valeur maximale). Ainsi, si min16float est utilisé, une Radeon HD 7000 traitera l'opération en FP32 alors qu'un Tegra 3 la traitera en FP20. Direct3D 11.1 permet aux pilotes graphiques de reporter le support d'un ou de plusieurs de ces formats, et dans le cas des niveaux de fonctionnalités 9_x de différencier ce support pour les vertex et pour les pixel shaders.
Direct3D 11.1 introduit trois nouveaux formats de 16 bits par pixel soit 4 ou 5 bits par couleur : B5G6R5, B5G5R5A1, B4G4R4A4. Leur support est optionnel à l'exception du B5G6R5 qui est obligatoire dans le niveau de fonctionnalité 11_1. Ils permettent d'économiser de l'énergie et de réduire l'espace mémoire utilisé.
Avec Direct3D 11, les clip planes n'étaient pas utilisables pour le matériel de la génération DirectX 9. Les clip planes permettent de définir les zones en dehors desquelles le rendu des objets peut être évité, soit parce qu'ils sont hors du champ de vision, soit parce qu'ils sont trop loin. La flexibilité supplémentaire introduite à partir de Direct3D 10 dans la définition des clips planes, et reprise dans Direct3D 11, avait rendu sa gestion incompatible avec le matériel plus ancien. Direct3D 11.1 avec les niveaux 9_x est capable de réinterpréter certains clip planes dans un format supporté par le matériel DirectX 9.
Enfin, Direct3D 11.1 permet d'exposer le type d'architecture du GPU de manière à indiquer au programme s'il s'agit d'un modèle à rendu différé basé sur des tuiles (TBDR, Tile Based Deferred Renderer) au lieu d'un GPU classique qui travaille avec un rendu immédiat. Diverses techniques de rendu ou optimisations peuvent ne pas être compatibles avec ces deux types d'architectures, il est donc important que les développeurs puissent prévoir les deux possibilités sous Windows RT puisque certains SoC vont embarquer des GPU de type TBDR, comme c'est le cas avec les modèles PowerVR d'ImgTech.
Simplifier l'exploitation des API
Microsoft a également voulu faciliter le travail des développeurs. Pour cela Direct3D 11.1 gère maintenant toutes les ressources GPU ce qui permet une exploitation simultanée plus aisée des différentes API de DirectX 11.1 : Direct3D, Direct2D, DirectWrite, DirectCompute. L'interopérabilité entre ces API est également facilitée via un partage de ressources généralisé. Ce partage de ressources profite également aux vidéos auxquelles les pixel shaders pourront avoir un accès simplifié.
Différente petites améliorations ont été apportées au compilateur ce qui permet à Direct3D 11.1 de rendre possible le traçage du code pour faciliter le débogage des shaders.
Direct3D 11.1 supporte la création de buffers de constantes étendus qui peuvent être plus grands que le maximum auquel un shader peut accéder (4096 valeurs de 4x32-bit soit 64 Ko). Au lieu de jongler avec plusieurs de ces buffers ou d'essayer de tenir dans le maximum autorisé, il est possible d'utiliser un très gros buffer et de n'en attribuer qu'un segment à un shader donné.
Direct3D 11.1 apporte enfin le support des opérateurs logiques sur les buffers de rendu (RT, render targets), une fonctionnalité présente du côté d'OpenGL depuis des années et qui apporte plus de flexibilité aux développeurs. Son support est obligatoire dans le niveau de fonctionnalité 11_1 et optionnel à partir du 10_0.
De nouvelles fonctionnalités
Direct3D 11.1 apporte bien entendu également de nouvelles fonctionnalités destinées à accompagner l'évolution des GPU. Sur ce point il s'agit cependant d'évolutions relativement mineures par rapport à l'arrivée de la tessellation ou des compute shaders dans Direct3D 11, qui a représenté une évolution majeure.
Avec le niveau de fonctionnalité 11_1 DirectCompute et les compute shaders, peuvent accéder à 64 UAV (Unordered Acess View), les buffers avec lecture/écriture flexibles sur lesquels ils travaillent, contre 8 maximum auparavant. Par ailleurs, tous les types de shaders peuvent accéder à ces UAV et non plus les pixel shaders uniquement. De quoi ouvrir la voie à de nouvelles techniques de rendu qui pourront faire appel aux compute shaders pour assister ou remplacer n'importe quelle étape du pipeline 3D de DirectX.
Petit point de détail : l'instruction SAD4 (somme des différences absolues), apparue avec les Radeon HD 5000 et principalement utile au traitement vidéo, est dorénavant utilisable directement dans les shaders 5.0 alors que précédemment c'est le compilateur des pilotes qui devait se charger de la substituer à la suite d'opérations qu'elle représente (12 additions). Sur les GPU qui la supportent, elle pourra ainsi être exploitée plus simplement.
Tout comme avec Direct3D 11, le support de la double précision pour les shaders 5.0 est optionnel dans Direct3D 11.1. Cette évolution de l'API ajoute par contre une option supplémentaire : le support des instructions RCP, DIV et FMA en double précision, absentes auparavant.
Enfin, la stéréo 3D est supportée nativement par DirectX 11.1 à partir du niveau 10_0, ce qui permet aux développeurs d'en proposer plus simplement une version standardisée.
Les 7 niveaux de fonctionnalités
Synthétiser les différents niveaux de fonctionnalités matériels proposés par Direct3D 11.1, tout comme l'ensemble des nouveautés que l'API apporte, relève du parcours du combattant tant les informations sont disséminées aux quatre coins de la documentation de Microsoft, qui présente par ailleurs quelques petites erreurs. Voici ce que nous avons pu retenir (english version here) :
Plusieurs remarques sont importantes concernant le fonctionnement de ces niveaux :
- En gras, les nouveautés introduites par Direct3D 11.1.
- Un GPU qui supporte un certain niveau, ne supporte pas automatiquement les niveaux inférieurs. Par exemple les GPU Intel de niveaux 10_x et 11_x ne supportent pas les niveaux 9_2 et 9_3.
- Une fois un niveau supporté par un GPU, tous les plus récents du même fabricant le supportent également.
- Il n'est pas possible d'aller au-delà des options proposées par chaque niveau, même si le GPU en est capable. Par exemple, un GPU qui supporte le niveau 10_0 ne pourra pas filtrer de texture FP16 dans le niveau 9_1. Une exception : la taille maximale des textures peut être supérieure.
- Nous avons regroupé le support obligatoire du MSAA 16x pour le niveau 11_1 avec la Target Independant Rasterization puisqu'il ne concerne que le rendu 2D et non le rendu 3D.
- Le niveau 9_3 utilise des vertex shaders 2.a et des pixels shaders 2.x et non pas les shaders 3.0. En cause, une ancienne règle qui interdit de mélanger des shaders 2.x avec les 3.0 alors que Direct3D 11.1 autorise le mélange entre tous les types de shaders, mais également de petites différences au niveau du support des shaders 3.0 entre les Radeon X1000 et les GeForce 6 alors que lors de l'introduction des niveaux 9_x, Microsoft voulait éviter les options. La conséquence est qu'il n'y a pas de correspondance directe entre un des niveaux de Direct3D 11.1 et Direct3D 9.0c, une référence (d'autant plus que très proche du profil de rendu HiDef de la Xbox 360).
- Les niveaux 9_x passent en réalité par une sous-couche des niveaux 10_x, ce qui les rend un petit peu moins efficaces que Direct3D 9 natif. Par conséquent, à moins de viser le support du matériel ancien, même si le rendu visé pourrait se contenter du niveau 9_3, les développeurs seront incités à utiliser au moins le niveau 10_0.
- Les options "formats 16bpp" et "opérateurs logiques sur RT" peuvent assez facilement être supportées par tous les GPU avec des pilotes mis à jour.
- Les buffers de constantes étendus peuvent être supportés sur tous les niveaux à partir du 10_0 avec de nouveaux pilotes. Ils sont par contre automatiquement supportés sur les niveaux 9_x car ils y sont alors en réalité émulés.
- Tous les niveaux peuvent optionnellement supporter le calcul en précision réduite.
- Le niveau 9_1 correspond aux spécifications matérielles minimales pour Windows RT.
- Le niveau 9_3 correspond aux spécifications matérielles minimales pour un nouveau PC Windows 8 et pour Windows Phone 8.
Avec DirectX 11.1, WARP (Windows Advanced Rasterization Platform) évolue. Pour rappel, WARP représente le moteur logiciel de rendu de Microsoft optimisé pour le temps réel et qui peut se substituer au GPU de manière à permettre aux développeurs de tester leur moteur de rendu ou de mettre au point des systèmes sans cartes graphiques (par exemple un serveur avec accès à distance). Le nouveau WARP supporte les niveaux 11_0 et 11_1 ainsi que DirectCompute, mais pas les calculs en double précision ni les vidéos.
Après cette longue explication de ce qu'est réellement DirectX 11.1, il est temps d'arriver au point qui pose question : son support.
DirectX 11.1, pour quel OS ?
Windows 8 et Windows RT supportent DirectX 11.1 mais qu'en est-il de Windows 7 ? La question est importante et Microsoft n'y a jamais répondu très clairement officiellement. "Actuellement, il n'est pas prévu de porter DirectX 11.1 sous Windows 7" est probablement l'élément qui se rapproche le plus d'une réponse. Le problème est qu'un développeur qui prévoit son moteur autour de sa composante Direct3D 11.1 et de son SDK risque de se retrouver avec un logiciel incompatible avec Windows 7.
A l'inverse, si Windows 7 et Windows 8 supportent Direct3D 11, 10 et 9, Windows RT ne supporte que Direct3D 11.1. En d'autres termes, sans support de Direct3D 11.1 sous Windows 7, il serait impossible de supporter les 3 OS.
Discrètement, avec la Release Preview d'Internet Explorer 10 pour Windows 7 et ensuite en tant que mise à jour indépendante , Microsoft vient cependant de commencer à distribuer une Platform Update pour Windows 7 SP1. Une plateforme qui apporte à Windows 7 des morceaux de DirectX 11.1, sans les documenter pour l'instant (si ce n'est en indiquant vaguement que Direct3D, Direct2D et DirectWrite sont touchés).
Contrairement à la Platform Update destinée à Windows Vista, il ne s'agit pas ici d'une mise à jour majeure puisque WDDM et DXGI n'évoluent pas et restent en versions 1.1 alors que les versions 1.2 de Windows 8 sont liées à plusieurs nouveautés de Direct3D 11.1 (3D stéréo, formats 16bpp…). Microsoft précise cependant que le SDK de DirectX 11 n'est plus compatible une fois la Platform Update installée sur Windows 7 et que le SDK de Windows 8 doit être utilisé à la place.
Il semble donc évident que Microsoft porte sous Windows 7 la base de DirectX 11.1 pour assurer la compatibilité entre cet OS et un moteur qui exploite la dernière version de ses API graphiques, mais en prenant soin de réserver les nouvelles fonctionnalités à Windows 8. Il faut dire que toute la partie optimisée pour les périphériques mobiles sous Modern UI n'a pas réellement d'intérêt sous Windows 7. Par contre le niveau 11_1 ne sera pas de la partie et il est peu probable, bien que possible, que les nouvelles options pour les niveaux inférieurs (buffers de constantes, instruction SAD4, opérateurs logiques sur les RT) débarquent sur Windows 7. Si ces options sont activées sous Windows 7, cela signifierait pour les joueurs que le plus important sur le plan fonctionnel est disponible sous cet OS. Si ce n'est pas le cas, Microsoft aurait malgré tout limité les dégâts en assurant la compatibilité.
DirectX 11.1, pour quel GPU ?
En travaillant sur ce dossier, nous avons pu observer que le niveau de fonctionnalités matériel 11_1 était bien fonctionnel sous Windows 8 avec une Radeon HD 7000, mais absent avec une GeForce 600. De quoi soupçonner l'absence de son support par les GPU Kepler même s'il restait possible que le problème soit lié à un support encore absent dans les pilotes Nvidia. C'est l'option que nous privilégions tout en commençant à la mettre en doute. Nos confrères de heise.de ont de leur côté pu confirmer que le niveau 11_1, soit ce que la plupart des gens imaginent en entendant parler de DirectX 11.1 dans les spécifications, n'est pas supporté sur les GeForce 600.
Cela fait pourtant 6 mois que nous vous indiquons que ces cartes graphiques supportent DirectX 11.1, en signifiant bien entendu le niveau maximal de DirectX 11.1. Nvidia nous aurait-il trompés ? Lors de la présentation, le fabricant a joué sur les mots entre DirectX 11.1, l'API, et 11_1, le niveau de fonctionnalités. A l'occasion d'un entretien qui a suivi, nous avons cependant interrogé le fabricant plus spécifiquement pour nous assurer qu'il s'agissait bien du niveau 11_1 et la réponse avait été positive.
Contacté à ce sujet, Nvidia nous affirme ne pas avoir eu ni l'envie d'insister sur l'absence de ce support, ni l'intention de la cacher et que notre interlocuteur n'était probablement pas encore sûr de la consigne officielle lorsqu'il nous a répondu. En d'autres termes cela arrangeait bien Nvidia que la plupart des journalistes soient induits en erreur mais il suffisait de poser la question un peu plus tard ou à la bonne personne pour avoir une vraie réponse… Pour ajouter à la confusion Nvidia n'a pas hésité cependant à ajouter dans ses derniers pilotes, et ce même sous Windows 7!, la mention suivante : "Prise en charge de DirectX : 11.1".
A l'opposé, nous pourrions dire qu'une GeForce GTX 680 ne supporte pas plus DirectX 11.1 qu'une GeForce FX 5800 ! Plus sérieusement, tout comme l'ensemble des GPU DirectX 9, DirectX 10 et DirectX 11, les GeForce 600 supportent l'API DirectX 11.1, mais avec un niveau de fonctionnalités réduit. Les GeForce 600 supportent par contre la plupart des nouvelles fonctionnalités optionnelles des niveaux 11_0 et inférieurs : les opérations logiques sur les RT, les nouveaux buffers de constantes et les formats 16bpp. Elles représentent avant tout une mise à jour logicielle et ne demandent pas une évolution des GPU.
Les fonctionnalités matérielles non supportées du niveau 11_1 sont d'une part liées à l'optimisation du rendu 2D et d'autre part à ouvrir les possibilités futures pour les développeurs au niveau d'un pipeline graphique personnalisé avec DirectCompute. Leur support est préférable, mais pas actuellement indispensable pour les joueurs.
Seules les Radeon HD 7700, 7800 et 7900 basées sur l'architecture GCN supportent actuellement complètement DirectX 11.1. Le core graphique des CPU Haswell en fera de même, si les pilotes suivent les objectifs d'Intel, et nous pouvons supposer que ce support sera cette fois complet sur les GeForce 700.
Windows RT, Surface et Tegra 3, un problème potentiel ?
Pour terminer cette analyse, un petit mot sur Windows RT. Microsoft impose plusieurs règles aux développeurs, tout d'abord avec l'utilisation de Direct3D 11.1 pour le rendu 3D, OpenGL ES, présent sur iOS et Android, étant exclu.
Ensuite, Microsoft, en faisant le choix du Tegra 3 pour la plateforme Windows RT de référence ainsi que pour sa propre tablette Surface, a fait le choix d'un GPU certes efficace, mais très peu évolué : le GPU du Tegra 3 est limité au niveau 9_1. Microsoft n'ayant pas l'intention de laisser une application ne pas supporter sa propre tablette, même quand d'autres SoC ARM avec un GPU plus évolué seront exploités sous Windows RT, il restera interdit aux développeurs de proposer une application qui ne supporte pas le niveau 9_1. Les autres niveaux ne pourront être qu'optionnels. Par ailleurs, si une application existe en version ARM et x86, cette dernière version devra également obligatoirement supporter le niveau 9_1 sous Windows 8. Rappelons que Windows Phone 8 ne souffre pas de cette limitation puisqu'il est basé sur une plateforme Qualcomm qui supporte le niveau 9_3.
Il est raisonnable d'imaginer que dans quelques mois, des SoC ARM Qualcomm ou Nvidia Tegra 4 avec support du niveau 9_3 ou supérieur soient intégrés dans des périphériques Windows RT. Si un jeu utilise un moteur graphique qui ne peut pas descendre en-dessous du niveau 9_3, comme c'est le cas pour beaucoup de titres PC, il ne pourra tout simplement pas être proposé en version ARM.
Un choix intriguant de la part de Microsoft qui soit fait tout pour favoriser sa tablette Surface, soit ne croit pas dans le potentiel vidéo ludique de la plateforme Windows RT et des SoC ARM…
Contenus relatifs
- [+] 27/03: Pilotes Radeon et GeForce pour Far ...
- [+] 20/03: Radeon Software 18.3.3 beta avec Vu...
- [+] 15/03: Microcode final pour Spectre chez I...
- [+] 14/03: Des failles de sécurité spécifiques...
- [+] 07/02: Windows 10, Meltdown et Spectre : q...
- [+] 30/01: Microsoft désactive la protection S...
- [+] 09/01: CES: Les PC Qualcomm Snapdragon 835...
- [+] 11/09: Microsoft confirme des problèmes de...
- [+] 07/08: Quels chipsets pour Cannon Lake ?
- [+] 24/07: Pas de Windows 10 CU pour Clover Tr...