Sistemas de varios adaptadores
Describe la compatibilidad con Direct3D 12 para sistemas que tienen varios adaptadores instalados, que abarcan escenarios en los que la aplicación tiene como destino explícitamente varios adaptadores de GPU y escenarios en los que los controladores usan implícitamente varios adaptadores de GPU en nombre de la aplicación.
Introducción a varios adaptadores
Un adaptador de GPU puede ser cualquier adaptador (gráficos o proceso, discreto o integrado) de cualquier fabricante que admita Direct3D 12.
Se hace referencia a varios adaptadores como nodos. Varios elementos, como las colas, se aplican a cada nodo, por lo que si hay dos nodos, habrá dos colas 3D predeterminadas. Otros elementos, como el estado de canalización y las firmas de raíz y comando, pueden hacer referencia a uno o varios nodos, como se muestra en el diagrama.
Uso compartido de montones entre adaptadores
Consulte el tema Montones compartidos.
API de varios adaptadores y máscaras de nodo
De forma similar a las API anteriores de Direct3D, cada conjunto de adaptadores vinculados se enumera como un único objeto IDXGIAdapter3. Todas las salidas asociadas a cualquier adaptador del vínculo se enumeran como adjuntas al único objeto IDXGIAdapter .
La aplicación puede determinar el número de adaptadores físicos asociados a un dispositivo determinado llamando a ID3D12Device::GetNodeCount.
Muchas API de Direct3D 12 aceptan una máscara de nodo (máscara de bits), que indica el conjunto de nodos al que hace referencia la llamada API. Cada nodo tiene un índice de base cero. Pero en la máscara de nodo, cero se traduce en bit 1; 1 se traduce en bit 2; y así sucesivamente.
Nodos únicos
Al llamar a las siguientes API (nodo único), la aplicación especifica un único nodo con el que se asociará la llamada API. La mayoría de las veces, se especifica mediante una máscara de nodo. Cada bit de la máscara corresponde a un único nodo. Para todas las API descritas en esta sección, debe establecer exactamente un bit en la máscara de nodo.
- D3D12_COMMAND_QUEUE_DESC: tiene un miembro NodeMask.
- CreateCommandQueue: crea una cola a partir de una estructura D3D12_COMMAND_QUEUE_DESC.
- CreateCommandList: toma un parámetro nodeMask.
- D3D12_DESCRIPTOR_HEAP_DESC: tiene un miembro NodeMask.
- CreateDescriptorHeap: crea un montón de descriptores a partir de una estructura D3D12_DESCRIPTOR_HEAP_DESC.
- D3D12_QUERY_HEAP_DESC: tiene un miembro NodeMask.
- CreateQueryHeap: crea un montón de consultas a partir de una estructura D3D12_QUERY_HEAP_DESC.
Nodos múltiples
Al llamar a las siguientes API (varios nodos), la aplicación especifica un conjunto de nodos con los que se asociará la llamada API. La afinidad de nodo se especifica como máscara de nodo, potencialmente con varios bits establecidos. Si la aplicación pasa 0 para esta máscara de bits, el controlador Direct3D 12 lo convierte en la máscara de bits 1 (lo que indica que el objeto está asociado con el nodo 0).
- D3D12_CROSS_NODE_SHARING_TIER: determina la compatibilidad con el uso compartido entre nodos.
- D3D12_FEATURE_DATA_D3D12_OPTIONS: estructura que hace referencia a D3D12_CROSS_NODE_SHARING_TIER.
- D3D12_FEATURE_DATA_ARCHITECTURE: contiene un miembro NodeIndex.
- D3D12_GRAPHICS_PIPELINE_STATE_DESC: tiene un miembro NodeMask.
- CreateGraphicsPipelineState: crea un objeto de estado de canalización de gráficos a partir de una estructura D3D12_GRAPHICS_PIPELINE_STATE_DESC.
- D3D12_COMPUTE_PIPELINE_STATE_DESC: tiene un miembro NodeMask.
- CreateComputePipelineState: crea un objeto de estado de canalización de proceso a partir de una estructura D3D12_COMPUTE_PIPELINE_STATE_DESC.
- CreateRootSignature: toma un parámetro nodeMask.
- D3D12_COMMAND_SIGNATURE_DESC: tiene un miembro NodeMask.
- CreateCommandSignature: crea un objeto de firma de comando a partir de una estructura D3D12_COMMAND_SIGNATURE_DESC.
API de creación de recursos
Las siguientes API hacen referencia a máscaras de nodo.
- D3D12_HEAP_PROPERTIES: tiene miembros CreationNodeMask y VisibleNodeMask.
- GetResourceAllocationInfo: tiene un parámetro visibleMask.
- GetCustomHeapProperties: tiene un parámetro nodeMask.
Al crear un recurso reservado, no se especifica ningún índice o máscara de nodo. El recurso reservado se puede asignar a un montón en cualquier nodo (siguiendo las reglas de uso compartido entre nodos).
El método MakeResident funciona internamente con colas de adaptadores, no es necesario que la aplicación especifique nada para esto.
Al llamar a las siguientes API ID3D12Device, la aplicación no necesita especificar un conjunto de nodos con los que se asociará la llamada API porque la llamada API se aplica a todos los nodos.
- CreateFence
- GetDescriptorHandleIncrementSize
- SetStablePowerState
- CheckFeatureSupport
- CreateSampler
- CopyDescriptors
- CopyDescriptorsSimple
- CreateSharedHandle
- OpenSharedHandleByName
- OpenSharedHandle: con una valla como parámetro. Con un recurso o un montón como parámetros, este método no acepta nodos como parámetros porque las máscaras de nodo se heredan de objetos creados anteriormente.
- CreateCommandAllocator
- CreateConstantBufferView
- CreateRenderTargetView
- CreateUnorderedAccessView
- CreateDepthStencilView
- CreateShaderResourceView