Initialisation de la communication avec direct3D version 11 DDI
Cette section s’applique uniquement à Windows 7 et versions ultérieures, ainsi qu’à Windows Server 2008 R2 et versions ultérieures du système d’exploitation Windows.
Initialisation de la communication
Pour initialiser la communication avec la DLL de pilote d’affichage en mode utilisateur version 11 DDI, le runtime Direct3D version 11 charge d’abord la DLL si la DLL n’est pas encore chargée. Le runtime Direct3D appelle ensuite la fonction OpenAdapter10_2 du pilote d’affichage en mode utilisateur via la table d’exportation de la DLL pour ouvrir une instance de la carte graphique. La fonction OpenAdapter10_2 est la seule fonction exportée de la DLL.
Notes
La fonction OpenAdapter10_2 est identique à la fonction OpenAdapter10 , à l’exception de la façon dont la table des fonctions spécifiques à l’adaptateur du pilote est retournée :
- OpenAdapter10_2 retourne la table dans le membre pAdapterFuncs_2 de la structure D3D10DDIARG_OPENADAPTER , où pAdapterFuncs_2 pointe vers une structure D3D10_2DDI_ADAPTERFUNCS .
- OpenAdapter10 retourne la table dans le membre pAdapterFuncs de D3D10DDIARG_OPENADAPTER, où pAdapterFuncs pointe vers une structure D3D10DDI_ADAPTERFUNCS .
OpenAdapter10_2 a été conçu pour rendre l’initialisation des pilotes plus efficace. Vous devez implémenter OpenAdapter10_2 dans vos pilotes Direct3D version 11. Vous pouvez également implémenter OpenAdapter10_2 (plutôt que ou en plus d’OpenAdapter10) dans vos pilotes Direct3D version 10.1 pour augmenter l’efficacité de l’initialisation de ces pilotes. Pour plus d’informations sur l’implémentation de OpenAdapter10_2 dans les pilotes Direct3D version 10.1, consultez Prise en charge de la découverte de versions. OpenAdapter10_2 gère l’échange de contrôle de version et d’autres informations entre le runtime et le pilote.
Contrôle de version
OpenAdapter10_2 et les fonctions spécifiques à l’adaptateur du pilote modifient la façon dont le contrôle de version entre l’API Direct3D et Direct3D DDI est géré de la façon dont Direct3D 10 gère le contrôle de version (pour plus d’informations sur la façon dont Direct3D 10 gère le contrôle de version, voir Initialisation de la communication avec direct3D version 10 DDI). Au lieu que l’API Direct3D s’appuie sur l’échec de la fonction de OpenAdapter10_2 du pilote pour indiquer l’absence de prise en charge d’une version particulière (comme avec OpenAdapter10_2), le pilote doit répertorier explicitement les versions DDI qu’il prend en charge. Le runtime Direct3D appelle la fonction GetSupportedVersions du pilote d’affichage en mode utilisateur (l’une des fonctions spécifiques à l’adaptateur du pilote) pour rechercher les versions DDI prises en charge par le pilote.
Il existe au moins deux nouvelles versions de DDI pour les fonctions DDI Direct3D 11. Chaque version de DDI distingue si la DDI s’exécute sur Windows Vista ou Windows 7. Toutefois, la prise en charge de Direct3D 11 DDI n’indique pas nécessairement la prise en charge complète des fonctionnalités matérielles associées à D3D_FEATURE_LEVEL_11. Les pilotes peuvent prendre en charge les nouvelles fonctionnalités de thread de Direct3D 11 DDI avec du matériel qui ne prend pas en charge les autres fonctionnalités exposées par direct3D 11 DDI, comme le pavage, etc. Le code suivant montre comment chaque version de DDI est distinguée :
// D3D11.0 on Vista
#define D3D11_DDI_MAJOR_VERSION 11
#define D3D11_0_DDI_MINOR_VERSION ...
#define D3D11_0_DDI_INTERFACE_VERSION \
((D3D11_DDI_MAJOR_VERSION << 16) | D3D11_0_DDI_MINOR_VERSION)
#define D3D11_0_DDI_BUILD_VERSION ...
#define D3D11_0_DDI_SUPPORTED \
((((UINT64)D3D11_0_DDI_INTERFACE_VERSION) << 32) | \
(((UINT64)D3D11_0_DDI_BUILD_VERSION) << 16))
// D3D11.0 on Windows 7
#define D3D11_0_7_DDI_MINOR_VERSION ...
#define D3D11_0_7_DDI_INTERFACE_VERSION \
((D3D11_DDI_MAJOR_VERSION << 16) | D3D11_0_7_DDI_MINOR_VERSION)
#define D3D11_0_7_DDI_BUILD_VERSION ...
#define D3D11_0_7_DDI_SUPPORTED \
((((UINT64)D3D11_0_7_DDI_INTERFACE_VERSION) << 32) | \
(((UINT64)D3D11_0_7_DDI_BUILD_VERSION) << 16))
#ifndef IS_D3D11_WIN7_INTERFACE_VERSION
#define IS_D3D11_WIN7_INTERFACE_VERSION( i ) (D3D11_0_7_DDI_INTERFACE_VERSION == i)
#endif
Échange d’informations
En plus de spécifier des informations de version, la fonction OpenAdapter10_2 du pilote échange également d’autres informations entre le runtime et le pilote.
Dans l’appel à la fonction OpenAdapter10_2 du pilote, le runtime fournit la fonction de rappel de l’adaptateur pfnQueryAdapterInfoCb dans le membre pAdapterCallbacks de la structure D3D10DDIARG_OPENADAPTER . Le pilote d’affichage en mode utilisateur doit appeler la fonction de rappel de l’adaptateur pfnQueryAdapterInfoCb pour rechercher les fonctionnalités matérielles graphiques du pilote miniport d’affichage.
Le runtime appelle la fonction CreateDevice(D3D10) du pilote d’affichage en mode utilisateur (une des fonctions spécifiques à l’adaptateur du pilote) pour créer un périphérique d’affichage pour gérer une collection d’état de rendu et terminer l’initialisation. Une fois l’initialisation terminée, le runtime Direct3D version 11 peut appeler les fonctions Direct3D version 11 fournies par le pilote d’affichage, et le pilote d’affichage en mode utilisateur peut appeler les fonctions fournies par le runtime.
La fonction CreateDevice(D3D10) du pilote d’affichage en mode utilisateur est appelée avec une structure D3D10DDIARG_CREATEDEVICE dont les membres sont configurés de la manière suivante pour initialiser la version 11 DDI du pilote d’affichage en mode utilisateur :
Le runtime définit Interface sur la version de l’interface requise par le runtime à partir du pilote d’affichage en mode utilisateur.
Le runtime définit Version sur un nombre que le pilote peut utiliser pour identifier le moment où le runtime est généré. Par exemple, le pilote peut utiliser le numéro de version pour faire la différence entre un runtime publié avec Windows Vista et un runtime publié avec un Service Pack ultérieur, qui peut contenir un correctif dont le pilote a besoin.
Le runtime définit hRTDevice pour spécifier le handle que le pilote doit utiliser lorsque le pilote rappelle le runtime.
Le runtime définit hDrvDevice pour spécifier le handle utilisé par le runtime dans les appels de pilotes suivants.
Le runtime fournit une table de ses fonctions de rappel spécifiques à l’appareil dans la structure D3DDDI_DEVICECALLBACKS vers laquelle pKTCallbacks pointe. Le pilote d’affichage en mode utilisateur appelle les fonctions de rappel fournies par le runtime pour accéder aux services en mode noyau dans le pilote miniport d’affichage.
Le pilote d’affichage en mode utilisateur retourne un tableau de ses fonctions spécifiques au périphérique dans la structure D3D11DDI_DEVICEFUNCS vers laquelle p11DeviceFuncs pointe.
Le runtime fournit une structure DXGI_DDI_BASE_ARGS vers laquelle DXGIBaseDDI pointe. Le runtime et le pilote d’affichage en mode utilisateur fournissent leur DDI d’infrastructure graphique DirectX à cette structure.
Le runtime définit hRTCoreLayer pour spécifier le handle que le pilote doit utiliser lorsque le pilote rappelle le runtime pour accéder à la fonctionnalité direct3D 10 principale (autrement dit, dans les appels aux fonctions spécifiées par le membre p11UMCallbacks ).
Le runtime fournit une table de ses fonctions de rappel principales dans la structure D3D11DDI_CORELAYER_DEVICECALLBACKS vers laquelle p11UMCallbacks pointe. Le pilote d’affichage en mode utilisateur appelle les fonctions de rappel principales fournies par le runtime à l’état d’actualisation.