Systèmes à plusieurs adaptateurs
Décrit la prise en charge dans Direct3D 12 pour les systèmes équipés de plusieurs adaptateurs, couvrant les scénarios où votre application cible explicitement plusieurs adaptateurs GPU, et les scénarios où les pilotes utilisent implicitement plusieurs adaptateurs GPU au nom de votre application.
Aperçu du multi-adaptateur
Un adaptateur GPU peut être n’importe quel adaptateur (graphique ou de calcul, discret ou intégré), de n’importe quel fabricant, qui prend en charge Direct3D 12.
Plusieurs adaptateurs sont référencés comme nœuds. Un certain nombre d’éléments, tels que les files d’attente, s’appliquent à chaque nœud, donc s’il y a deux nœuds, il y aura deux files d’attente 3D par défaut. D’autres éléments, tels que l’état du pipeline et les signatures racines et de commande, peuvent se référer à un ou plusieurs ou à tous les nœuds, comme indiqué dans le diagramme.
Partage de segments entre adaptateurs
Veuillez consulter la section Segments partagés.
API multi-adaptateurs et masques de nœuds
Similaires aux API Direct3D précédentes, chaque ensemble d’adaptateurs liés est énuméré comme un seul objet IDXGIAdapter3. Toutes les sorties attachées à un adaptateur du lien sont énumérées comme attachées à l’objet unique IDXGIAdapter3.
Votre application peut déterminer le nombre d’adaptateurs physiques associés à un périphérique donné en appelant ID3D12Device::GetNodeCount.
De nombreuses API dans Direct3D 12 acceptent un masque de nœud (un masque de bits), qui indique l’ensemble des nœuds auxquels l’appel API se réfère. Chaque nœud a un index basé sur zéro. Mais dans le masque de nœud, zéro se traduit par le bit 1; 1 se traduit par le bit 2; et ainsi de suite.
Nœuds uniques
Lors de l’appel des API suivantes (nœud unique), votre application spécifie un nœud unique avec lequel l’appel API sera associé. La plupart du temps, cela est spécifié par un masque de nœud. Chaque bit du masque correspond à un nœud unique. Pour toutes les API décrites dans cette section, vous devez définir exactement un bit dans le masque de nœud.
- D3D12_COMMAND_QUEUE_DESC : possède un membre NodeMask.
- CreateCommandQueue : crée une file d’attente à partir d’une structure D3D12_COMMAND_QUEUE_DESC .
- CreateCommandList : prend un paramètre nodeMask .
- D3D12_DESCRIPTOR_HEAP_DESC : a un membre NodeMask.
- CreateDescriptorHeap : crée un tas de descripteur à partir d’une structure D3D12_DESCRIPTOR_HEAP_DESC.
- D3D12_QUERY_HEAP_DESC : a un membre NodeMask.
- CreateQueryHeap : crée un tas de requêtes à partir d’une structure D3D12_QUERY_HEAP_DESC.
Plusieurs nœuds
Lors de l’appel des API suivantes (nœud multiple), votre application spécifie un ensemble de nœuds avec lequel l’appel API sera associé. Vous spécifiez l’affinité de nœud sous forme de masque de nœud, potentiellement avec plusieurs bits définis. Si votre application passe 0 pour ce masque de bits, alors le pilote Direct3D 12 le convertit en masque de bits 1 (indiquant que l’objet est associé au nœud 0).
- D3D12_CROSS_NODE_SHARING_TIER : détermine la prise en charge du partage entre nœuds.
- D3D12_FEATURE_DATA_D3D12_OPTIONS : référence de structure D3D12_CROSS_NODE_SHARING_TIER.
- D3D12_FEATURE_DATA_ARCHITECTURE : contient un membre NodeIndex.
- D3D12_GRAPHICS_PIPELINE_STATE_DESC : a un membre NodeMask.
- CreateGraphicsPipelineState : crée un objet d’état de pipeline graphique à partir d’une structure D3D12_GRAPHICS_PIPELINE_STATE_DESC.
- D3D12_COMPUTE_PIPELINE_STATE_DESC : a un membre NodeMask.
- CreateComputePipelineState : crée un objet d’état de pipeline de calcul à partir d’une structure D3D12_COMPUTE_PIPELINE_STATE_DESC.
- CreateRootSignature : prend un paramètre nodeMask.
- D3D12_COMMAND_SIGNATURE_DESC: a un membre NodeMask.
- CreateCommandSignature : crée un objet de signature de commande à partir d’une structure D3D12_COMMAND_SIGNATURE_DESC.
API de création de ressources
Les API suivantes font référence aux masques de nœuds.
- D3D12_HEAP_PROPERTIES : possède à la fois les membres CreationNodeMask et VisibleNodeMask.
- GetResourceAllocationInfo : a un paramètre visibleMask.
- GetCustomHeapProperties : a un paramètre nodeMask.
Lors de la création d’une ressource réservée, aucun index ou masque de nœud n’est spécifié. La ressource réservée peut être mappée sur un tas sur n’importe quel nœud (suivant les règles de partage inter-nœuds).
La méthode MakeResident fonctionne en interne avec des files d’attente d’adaptateurs, il n’est pas nécessaire que votre application spécifie quoi que ce soit pour cela.
Lors de l’appel des API suivantes ID3D12Device, votre application n’a pas besoin de spécifier un ensemble de nœuds avec lequel l’appel API sera associé car l’appel API s’applique à tous les nœuds.
- CreateFence
- GetDescriptorHandleIncrementSize
- SetStablePowerState
- CheckFeatureSupport
- CreateSampler
- CopyDescriptors
- CopyDescriptorsSimple
- CreateSharedHandle
- OpenSharedHandleByName
- OpenSharedHandle : avec une fence en tant que paramètre. Avec une resource ou un heap en tant que paramètres, cette méthode n’accepte pas les nœuds comme paramètres parce que les masques de nœuds sont hérités des objets précédemment créés.
- CreateCommandAllocator
- CreateConstantBufferView
- CreateRenderTargetView
- CreateUnorderedAccessView
- CreateDepthStencilView
- CreateShaderResourceView