Multihead (Direct3D 9)

Les cartes multi-têtes sont celles qui ont une mémoire tampon de trame et un accélérateur communs, des convertisseurs numériques vers analogiques (DAC) indépendants et des sorties de surveillance. Ces appareils peuvent offrir une prise en charge de plusieurs moniteurs beaucoup plus utilisable qu’un nombre similaire de cartes graphiques hétérogènes.

Les cartes multi-têtes sont exposées dans l’API en tant qu’appareil unique au niveau de l’API qui peut piloter plusieurs chaînes d’échange plein écran. Par conséquent, toutes les ressources sont partagées avec toutes les têtes, et chaque tête a exactement les mêmes fonctionnalités. Chaque tête peut être définie sur des modes d’affichage indépendants. Vous pouvez utiliser des appels distincts à IDirect3DSwapChain9::P resent pour actualiser chaque tête. Vous pouvez également utiliser un appel à IDirect3DDevice9::P resent pour actualiser chaque tête de manière séquentielle.

Notes

L’actualisation de chaque tête ne se produit pas simultanément avec un seul appel à IDirect3DDevice9::P resent. Les statistiques présentes dans Direct3D 9Ex peuvent utiliser la structure D3DPRESENTSTATS pour maintenir les actualisations de chaque tête proche les unes des autres afin de limiter les effets de déchirure sur plusieurs têtes d’adaptateurs. Pour plus d’informations sur la synchronisation des trames des applications de modèle inversé Direct3D 9Ex, consultez Améliorations de Direct3D 9Ex.

 

Chaque chaîne d’échange pour un appareil multi-tête doit être en plein écran. Lorsqu’un appareil est entré en mode multi-tête, il doit rester en mode plein écran. La transition vers le mode fenêtré nécessite la destruction de l’appareil (à l’exception de l’opération normale ALT+TAB-to-minimize).

L’ancienne méthode de division de la mémoire vidéo entre les têtes et le traitement de chaque tête comme un accélérateur entièrement indépendant sera toujours un scénario d’utilisation courant. Cette proposition ne remplace pas ce mécanisme, sauf si l’application a été spécifiquement codée pour fonctionner en mode multi-tête Direct3D 9.

Les pilotes disposent des connaissances adéquates pour basculer entre les deux modes de fonctionnement.

Une tête sera appelée master tête, et toutes les autres têtes sur la même carte être appelées têtes subordonnées. Si plusieurs adaptateurs multipoints sont présents dans un système, le master et ses subordonnés d’un adaptateur multipoint sont appelés un groupe. Les groupes sont indiqués par l’ordinal de l’adaptateur de leur tête master.

La structure D3DCAPS9 a été mise à jour pour exposer les nouvelles majuscules matérielles suivantes.

UINT NumberOfAdaptersInGroup; 
UINT MasterAdapterOrdinal; 
UINT AdapterOrdinalInGroup;
  • NumberOfAdaptersInGroup est égal à 1 pour les adaptateurs classiques et supérieur à 1 pour l’adaptateur master d’un carte multipoint. La valeur est 0 pour un adaptateur subordonné d’un carte multi-tête. Chaque carte peut avoir au plus un master, mais peut avoir de nombreux subordonnés.
  • MasterAdapterOrdinal indique quel appareil est le master pour ce subordonné.
  • AdapterOrdinalInGroup indique l’ordre dans lequel les têtes sont référencées par l’API. L’adaptateur master a toujours AdapterOrdinalInGroup 0. Ces valeurs ne correspondent pas aux ordinals de l’adaptateur passés aux méthodes IDirect3D9, mais s’appliquent uniquement aux têtes au sein d’un groupe.

Cette définition permet aux cartes multi-têtes de continuer à présenter plusieurs adaptateurs comme s’il s’agissait de cartes indépendantes, comme dans DirectX 8.

Pour créer un appareil multi-tête, spécifiez l’indicateur de comportement D3DCREATE_ADAPTERGROUP_DEVICE dans IDirect3D9::CreateDevice. Les paramètres de présentation (tableau de D3DPRESENT_PARAMETERS) doivent contenir des éléments NumberOfAdaptersInGroup. Le runtime affecte chaque élément à chaque tête dans l’ordre numérique AdapterOrdinalInGroup. Lorsque D3DCREATE_ADAPTERGROUP_DEVICE est défini, chaque paramètre de présentation doit avoir :

  • Le membre fenêtré défini sur FALSE (en d’autres termes, être en plein écran).
  • Même valeur pour le membre EnableAutoDepthStencil de D3DPRESENT_PARAMETERS.

En outre, si EnableAutoDepthStencil a la valeur TRUE, chacun des champs suivants doit avoir la même valeur pour chaque D3DPRESENT_PARAMETERS :

  • AutoDepthStencilFormat
  • BackBufferWidth
  • BackBufferHeight
  • BackBufferFormat

Si la DAC est définie, les appels supplémentaires à IDirect3DDevice9::CreateAdditionalSwapChain ne sont pas autorisés.

Si l’appareil a été créé avec la DAC, IDirect3DDevice9::Reset attend un tableau de D3DPRESENT_PARAMETERS.

Chaque structure D3DPRESENT_PARAMETERS passée à IDirect3DDevice9::Reset doit être en plein écran. Pour revenir au mode fenêtré, l’application doit détruire l’appareil et recréer un appareil non multi-tête en mode fenêtré.

Voici un scénario d’utilisation de base :

1. Create multihead device 
2. For each swap chain of device:
   3. Call GetBackBuffer for the i-th swapchain
   4. Call SetRenderTarget 
   5. Call DrawPrimitive 
   6. Optionally call swapchain::Present (or wait until 
all swap chains are drawn and present outside of loop)
7. End the for loop
8. Optionally present all swap chains with device::Present

Pour plus d’informations, consultez IDirect3D9::CreateDevice et IDirect3DDevice9::GetNumberOfSwapChains.

Conseils de programmation