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 multithread.
Périphérique
Un appareil est utilisé pour créer des ressources et énumérer les fonctionnalités d’un adaptateur d’affichage. Dans Direct3D 11, un appareil est représenté par une interface ID3D11Device .
Chaque application doit avoir au moins un périphérique, 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 de _ _ type de pilote D3D . Chaque périphérique peut utiliser un ou plusieurs contextes de périphérique, en fonction de la fonctionnalité souhaitée.
Contexte de périphérique
Un contexte de périphérique contient la circonstance ou le paramètre dans lequel un appareil est utilisé. Plus précisément, un contexte de périphérique est utilisé pour définir l’état du pipeline et générer des commandes de rendu à l’aide des ressources détenues par un appareil. Direct3D 11 implémente deux types de contextes de périphérique, un pour le rendu immédiat et l’autre pour le rendu différé ; les deux contextes sont représentés par une interface ID3D11DeviceContext .
Contexte immédiat
Un contexte immédiat est restitué directement au pilote. Chaque appareil a un seul et unique contexte immédiat qui peut récupérer des données du GPU. Un contexte immédiat peut être utilisé pour restituer (ou lire) immédiatement une liste de commandes.
Il existe deux façons d’accéder à 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 plutôt que par le thread de rendu principal. 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 à condition que le contexte soit utilisé uniquement dans un thread à la fois.
Considérations relatives aux threads
Ce tableau met en évidence les différences entre le modèle de thread dans Direct3D 11 et les versions antérieures de Direct3D.
| | | Différences entre Direct3D 11 et les versions antérieures de Direct3D :
Toutes les méthodes de l’interface ID3D11Device sont libres de thread, ce qui signifie qu’il est possible d’avoir plusieurs threads qui appellent les fonctions en même temps.
- Toutes les interfaces dérivées de ID3D11DeviceChild(ID3D11Buffer, ID3D11Query, etc.) sont libres de threads.
- Direct3D 11 fractionne la création et le rendu des ressources en deux interfaces. Map, DEMAPPAGE, 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 à thread libre.
- Les méthodes ID3D11DeviceContext (à l’exception de celles qui existent sur ID3D11DeviceChild) ne sont pas de thread libre, autrement dit, elles nécessitent un thread unique. Un seul thread peut appeler en toute sécurité l’une de ses méthodes (dessin, copie, mappage, etc.) à la fois.
- En général, les threads libres réduisent le nombre de primitives de synchronisation utilisées, ainsi que leur durée. Toutefois, une application qui utilise la synchronisation maintenue pendant une longue période peut avoir un impact direct sur la quantité de simultanéité qu’une application peut espérer atteindre.
|