Sistemas com vários adaptadores
Descreve o suporte no Direct3D 12 para sistemas que têm vários adaptadores instalados, abrangendo cenários em que seu aplicativo tem como alvo explícito diversos adaptadores de GPU e cenários em que os drivers usam implicitamente diversos adaptadores de GPU em nome do seu aplicativo.
Visão geral de vários adaptadores
Um adaptador de GPU pode ser qualquer adaptador (gráfico ou de computação, discreto ou integrado), de qualquer fabricante, que ofereça suporte ao Direct3D 12.
Vários adaptadores são referenciados como nós. Vários elementos, como as filas, se aplicam a cada nó. Portanto, se houver dois nós, haverá duas filas 3D padrão. Outros elementos, como o estado do pipeline e as assinaturas raiz e de comando, podem se referir a um ou mais nós, conforme mostrado no diagrama.
Compartilhar heaps entre adaptadores
Consulte o tópico Heaps compartilhados.
APIs de vários adaptadores e máscaras de nó
Semelhante às APIs Direct3D anteriores, cada conjunto de adaptadores vinculados é enumerado como um objeto único IDXGIAdapter3. Todas as saídas anexadas a qualquer adaptador no link são enumeradas como anexadas ao objeto único IDXGIAdapter3.
Seu aplicativo pode determinar o número de adaptadores físicos associados a um determinado dispositivo chamando ID3D12Device::GetNodeCount.
Muitas APIs no Direct3D 12 aceitam uma máscara de nó (uma máscara de bits), que indica o conjunto de nós aos quais a chamada de API se refere. Cada nó tem um índice de base zero. Mas na máscara de nó, zero se traduz em bit 1; 1 se traduz em bit 2; e assim por diante.
Nós únicos
Ao chamar as seguintes APIs (nó único), seu aplicativo especifica um nó único ao qual a chamada de API será associada. Na maioria das vezes, isso é especificado por uma máscara de nó. Cada bit na máscara corresponde a um nó único. Para todas as APIs descritas nesta seção, você deve definir exatamente um bit na máscara de nó.
- D3D12_COMMAND_QUEUE_DESC : tem um membro NodeMask.
- CreateCommandQueue : cria uma fila a partir de uma estrutura D3D12_COMMAND_QUEUE_DESC.
- CreateCommandList : usa um parâmetro nodeMask.
- D3D12_DESCRIPTOR_HEAP_DESC : tem um membro NodeMask.
- CreateDescriptorHeap : cria um heap de descritor a partir de uma estrutura D3D12_DESCRIPTOR_HEAP_DESC.
- D3D12_QUERY_HEAP_DESC : tem um membro NodeMask.
- CreateQueryHeap : cria um heap de consulta a partir de uma estrutura D3D12_QUERY_HEAP_DESC.
Vários nós
Ao chamar as seguintes APIs (vários nós), seu aplicativo especifica um conjunto de nós aos quais a chamada de API será associada. Você especifica a afinidade de nó como uma máscara de nó, potencialmente com vários bits definidos. Se o seu aplicativo passar 0 para essa máscara de bits, o driver Direct3D 12 converterá isso para a máscara de bits 1 (indicando que o objeto está associado ao nó 0).
- D3D12_CROSS_NODE_SHARING_TIER : determina o suporte para compartilhamento entre nós.
- D3D12_FEATURE_DATA_D3D12_OPTIONS : estrutura que faz referência a D3D12_CROSS_NODE_SHARING_TIER.
- D3D12_FEATURE_DATA_ARCHITECTURE : contém um membro NodeIndex.
- D3D12_GRAPHICS_PIPELINE_STATE_DESC : tem um membro NodeMask member.
- CreateGraphicsPipelineState : cria um objeto de estado de pipeline de gráficos a partir de uma estrutura D3D12_GRAPHICS_PIPELINE_STATE_DESC.
- D3D12_COMPUTE_PIPELINE_STATE_DESC : tem um membro NodeMask.
- CreateComputePipelineState : cria um objeto de estado de pipeline de computação a partir de uma estrutura D3D12_COMPUTE_PIPELINE_STATE_DESC.
- CreateRootSignature: usa um parâmetro nodeMask.
- D3D12_COMMAND_SIGNATURE_DESC: tem um membro NodeMask.
- CreateCommandSignature : cria um objeto de assinatura de comando a partir de uma estrutura D3D12_COMMAND_SIGNATURE_DESC.
APIs de criação de recursos
As APIs a seguir fazem referência a máscaras de nó.
- D3D12_HEAP_PROPERTIES : tem membros CreationNodeMask e VisibleNodeMask.
- GetResourceAllocationInfo : tem um parâmetro visibleMask.
- GetCustomHeapProperties : tem um parâmetro nodeMask.
Ao criar um recurso reservado, nenhum índice de nó ou máscara é especificado. O recurso reservado pode ser mapeado em um heap em qualquer nó (seguindo as regras de compartilhamento entre nós).
O método MakeResident funciona internamente com filas do adaptador, não há necessidade de seu aplicativo especificar nada para isso.
Ao chamar as seguintes APIs ID3D12Device, seu aplicativo não precisa especificar um conjunto de nós aos quais a chamada de API será associada, pois a chamada de API se aplica a todos os nós.
- CreateFence
- GetDescriptorHandleIncrementSize
- SetStablePowerState
- CheckFeatureSupport
- CreateSampler
- CopyDescriptors
- CopyDescriptorsSimple
- CreateSharedHandle
- OpenSharedHandleByName
- OpenSharedHandle : com um limite como parâmetro. Com um recurso ou um heap como parâmetros, esse método não aceita nós como parâmetros, pois as máscaras de nó são herdadas de objetos criados anteriormente.
- CreateCommandAllocator
- CreateConstantBufferView
- CreateRenderTargetView
- CreateUnorderedAccessView
- CreateDepthStencilView
- CreateShaderResourceView