Présentation d’un appareil dans Direct3D 11
Le modèle objet Direct3D 11 sépare les fonctionnalités de création et de rendu des ressources dans un appareil et un ou plusieurs contextes ; cette séparation est conçue pour faciliter le multithreading.
Appareil
Un appareil est utilisé pour créer des ressources et énumérer les fonctionnalités d’une carte d’affichage. Dans Direct3D 11, un appareil est représenté avec une interface ID3D11Device .
Chaque application doit avoir au moins un appareil. La plupart des applications ne créent qu’un seul appareil. Créez un appareil pour l’un des pilotes matériels installés sur votre ordinateur en appelant D3D11CreateDevice ou D3D11CreateDeviceAndSwapChain et spécifiez le type de pilote avec l’indicateur D3D_DRIVER_TYPE . Chaque appareil peut utiliser un ou plusieurs contextes d’appareil, en fonction de la fonctionnalité souhaitée.
Contexte de l’appareil
Un contexte d’appareil contient la circonstance ou le paramètre dans lequel un appareil est utilisé. Plus précisément, un contexte d’appareil est utilisé pour définir l’état du pipeline et générer des commandes de rendu à l’aide des ressources appartenant à un appareil. Direct3D 11 implémente deux types de contextes d’appareil, l’un pour le rendu immédiat et l’autre pour le rendu différé ; les deux contextes sont représentés avec une interface ID3D11DeviceContext .
Contexte immédiat
Un contexte immédiat s’affiche directement sur le pilote. Chaque appareil a un seul et un seul contexte immédiat qui peut récupérer des données à partir du GPU. Un contexte immédiat peut être utilisé pour afficher (ou lire) immédiatement une liste de commandes.
Il existe deux façons d’obtenir un contexte immédiat :
- En appelant D3D11CreateDevice ou D3D11CreateDeviceAndSwapChain.
- En appelant ID3D11Device::GetImmediateContext.
Contexte différé
Un contexte différé enregistre les commandes GPU dans une liste de commandes. Un contexte différé est principalement utilisé pour le multithreading et n’est pas nécessaire pour une application à thread unique. Un contexte différé est généralement utilisé par un thread de travail au lieu du thread de rendu main. Lorsque vous créez un contexte différé, il n’hérite d’aucun état du contexte immédiat.
Pour obtenir un contexte différé, appelez ID3D11Device::CreateDeferredContext.
Tout contexte immédiat ou différé peut être utilisé sur n’importe quel thread tant que le contexte n’est utilisé que dans un seul thread à la fois.
Considérations relatives aux threads
Ce tableau met en évidence les différences entre le modèle de threading dans Direct3D 11 et les versions antérieures de Direct3D.
Différences entre Direct3D 11 et les versions précédentes de Direct3D :
Toutes les méthodes d’interface ID3D11Device sont à thread libre, ce qui signifie qu’il est sûr que plusieurs threads appellent les fonctions en même temps.
- Toutes les interfaces dérivées d’ID3D11DeviceChild (ID3D11Buffer, ID3D11Query, etc.) sont à thread libre.
- Direct3D 11 divise la création et le rendu des ressources en deux interfaces. Map, Unmap, Begin, End et GetData sont implémentés sur ID3D11DeviceContext , car ID3D11Device définit fortement l’ordre des opérations. Les interfaces ID3D11Resource et ID3D11Asynchronous implémentent également des méthodes pour les opérations avec thread libre.
- Les méthodes ID3D11DeviceContext (à l’exception de celles qui existent sur ID3D11DeviceChild) ne sont pas à thread libre, c’est-à-dire qu’elles nécessitent un thread unique. Un seul thread peut appeler en toute sécurité l’une de ses méthodes (Draw, Copy, Map, etc.) à la fois.
- En général, le thread libre réduit le nombre de primitives de synchronisation utilisées ainsi que leur durée. Toutefois, une application qui utilise la synchronisation conservée pendant une longue période peut avoir un impact direct sur la quantité d’accès concurrentiel qu’une application peut s’attendre à atteindre.