Partager via


Multihead (Direct3D 9)

Les cartes à plusieurs têtes sont celles qui ont une mémoire tampon et un accélérateur d’image courants, des convertisseurs numériques à analogiques indépendants (DACs) et surveillent les sorties. Ces appareils peuvent offrir une prise en charge beaucoup plus utilisable de plusieurs moniteurs qu’un nombre similaire d’adaptateurs d’affichage hétérogènes.

Les cartes à plusieurs têtes sont exposées dans l’API en tant qu’appareil au niveau de l’API unique qui peut conduire 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 pour IDirect3DSwapChain9 ::P resent pour actualiser chaque tête. Vous pouvez également utiliser un appel pour IDirect3DDevice9 ::P resent pour actualiser chaque tête de manière séquentielle.

Note

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 à proximité l’une de l’autre pour limiter les effets de larme sur plusieurs têtes d’adaptateurs. Pour plus d’informations sur la synchronisation des images des applications de modèle flip Direct3D 9Ex, consultez Améliorations de Direct3D 9Ex.

 

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

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 multihead Direct3D 9.

Les pilotes reçoivent des connaissances adéquates pour basculer entre les deux modes d’exploitation.

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

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

UINT NumberOfAdaptersInGroup; 
UINT MasterAdapterOrdinal; 
UINT AdapterOrdinalInGroup;
  • NumberOfAdaptersInGroup est 1 pour les adaptateurs conventionnels et supérieur à 1 pour l’adaptateur maître d’une carte multihead. La valeur est 0 pour un adaptateur subordonné d’une carte multihead. Chaque carte peut avoir au plus un maître, mais peut avoir de nombreux subordonnés.
  • MasterAdapterOrdinal indique quel appareil est le maître de ce subordonné.
  • AdapterOrdinalInGroup indique l’ordre dans lequel les têtes sont référencées par l’API. L’adaptateur maître 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 d’un groupe.

Cette définition permet aux cartes à plusieurs têtes de continuer à présenter plusieurs adaptateurs comme s’ils étaient des cartes indépendantes, tout comme dans DirectX 8.

Pour créer un appareil multihead, 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 FAUX (en d’autres termes, être plein écran).
  • La même valeur pour le membre EnableAutoDepthStencil de D3DPRESENT_PARAMETERS.

En outre, si EnableAutoDepthStencil est 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, des appels supplémentaires à IDirect3DDevice9 ::CreateAdditionalSwapChain sont illégal.

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 multihead 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