Multihead (Direct3D 9)

Cartões multihead são aqueles que têm um buffer de quadro comum e acelerador, DACs (conversores digitais para analógicos) independentes e monitoram saídas. Esses dispositivos podem oferecer suporte a vários monitores muito mais utilizáveis do que um número semelhante de adaptadores de exibição heterogêneos.

Cartões multihead são expostos na API como um único dispositivo de nível de API que pode conduzir várias cadeias de troca de tela inteira. Consequentemente, todos os recursos são compartilhados com todas as cabeças e cada cabeçalho tem exatamente as mesmas funcionalidades. Cada cabeçalho pode ser definido como modos de exibição independentes. Você pode usar chamadas separadas para IDirect3DSwapChain9::P resent para atualizar cada cabeçalho. Você também pode usar uma chamada para IDirect3DDevice9::P resent para atualizar cada cabeçalho sequencialmente.

Observação

A atualização de cada cabeçalho não ocorre simultaneamente com uma única chamada para IDirect3DDevice9::P resent. As estatísticas presentes no Direct3D 9Ex podem usar a estrutura D3DPRESENTSTATS para manter as atualizações em cada cabeça próximas umas das outras para limitar os efeitos de ruptura em várias cabeças de adaptadores. Para obter informações sobre como sincronizar quadros de aplicativos de modelo de inversão Direct3D 9Ex, consulte Melhorias do Direct3D 9Ex.

 

Cada cadeia de troca de um dispositivo multihead deve ser de tela inteira. Quando um dispositivo tiver entrado no modo multihead, ele deverá permanecer em tela inteira. A transição de volta para o modo de janela requer a destruição do dispositivo (exceto para a operação alt+TAB normal para minimizar).

O método antigo de dividir a memória de vídeo entre as cabeças e tratar cada cabeça como um acelerador totalmente independente ainda será um cenário de uso comum. Essa proposta não substitui esse mecanismo, a menos que o aplicativo tenha sido especificamente codificado para funcionar no modo multihead Direct3D 9.

Os drivers recebem conhecimento adequado para alternar entre os dois modos de operação.

Uma cabeça será chamada de cabeça master, e todas as outras cabeças na mesma cartão serão chamadas de cabeças subordinadas. Se mais de um adaptador multihead estiver presente em um sistema, o master e seus subordinados de um adaptador multihead serão chamados de grupo. Os grupos são indicados pelo ordinal do adaptador de sua master cabeçalho.

A estrutura D3DCAPS9 foi atualizada para expor as novas tampas de hardware a seguir.

UINT NumberOfAdaptersInGroup; 
UINT MasterAdapterOrdinal; 
UINT AdapterOrdinalInGroup;
  • NumberOfAdaptersInGroup é 1 para adaptadores convencionais e maior que 1 para o adaptador master de um cartão multihead. O valor será 0 para um adaptador subordinado de um cartão multihead. Cada cartão pode ter no máximo um master, mas pode ter muitos subordinados.
  • MasterAdapterOrdinal indica qual dispositivo é o master para esse subordinado.
  • AdapterOrdinalInGroup indica a ordem na qual os cabeçalhos são referenciados pela API. O adaptador master sempre tem AdapterOrdinalInGroup 0. Esses valores não correspondem aos ordinais do adaptador passados para os métodos IDirect3D9, mas se aplicam apenas a cabeçalhos dentro de um grupo.

Essa definição permite que os cartões multihead continuem a apresentar vários adaptadores como se fossem cartões independentes, assim como fizeram no DirectX 8.

Para criar um dispositivo multihead, especifique o sinalizador de comportamento D3DCREATE_ADAPTERGROUP_DEVICE em IDirect3D9::CreateDevice. Os parâmetros de apresentação (uma matriz de D3DPRESENT_PARAMETERS) devem conter elementos NumberOfAdaptersInGroup. O runtime atribuirá cada elemento a cada cabeçalho na ordem numérica AdapterOrdinalInGroup. Quando D3DCREATE_ADAPTERGROUP_DEVICE é definido, cada parâmetro de apresentação deve ter:

  • O membro em janela definido como FALSE (em outras palavras, seja tela inteira).
  • O mesmo valor para o membro EnableAutoDepthStencil de D3DPRESENT_PARAMETERS.

Além disso, se EnableAutoDepthStencil for TRUE, cada um dos seguintes campos deverá ter o mesmo valor para cada D3DPRESENT_PARAMETERS:

  • AutoDepthStencilFormat
  • BackBufferWidth
  • BackBufferHeight
  • BackBufferFormat

Se o DAC estiver definido, chamadas adicionais para IDirect3DDevice9::CreateAdditionalSwapChain serão ilegais.

Se o dispositivo tiver sido criado com o DAC, IDirect3DDevice9::Reset esperará uma matriz de D3DPRESENT_PARAMETERS.

Cada estrutura D3DPRESENT_PARAMETERS passada para IDirect3DDevice9::Reset deve estar em tela inteira. Para voltar ao modo de janela, o aplicativo deve destruir o dispositivo e recriar um dispositivo não multihead no modo de janela.

Aqui está um cenário de uso básico:

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

Para obter mais informações, consulte IDirect3D9::CreateDevice e IDirect3DDevice9::GetNumberOfSwapChains.

Dicas de programação