Compartilhar via


Selecionando um dispositivo (Direct3D 9)

Os aplicativos podem consultar hardware para detectar os tipos de dispositivo Direct3D com suporte. Esta seção contém informações sobre as principais tarefas envolvidas na enumeração de adaptadores de exibição e na seleção de dispositivos Direct3D.

Um aplicativo deve executar uma série de tarefas para selecionar um dispositivo Direct3D apropriado. Observe que as etapas a seguir destinam-se a um aplicativo de tela inteira e que, na maioria dos casos, um aplicativo em janelas pode ignorar a maioria dessas etapas.

  1. Inicialmente, o aplicativo deve enumerar os adaptadores de exibição no sistema. Um adaptador é uma parte física do hardware. Observe que os elementos gráficos cartão podem conter mais de um único adaptador, como é o caso de uma exibição de cabeça dupla. Aplicativos que não estão preocupados com o suporte a vários monitores podem ignorar essa etapa e passar D3DADAPTER_DEFAULT para o método IDirect3D9::EnumAdapterModes na etapa 2.

  2. Para cada adaptador, o aplicativo enumera os modos de exibição com suporte chamando IDirect3D9::EnumAdapterModes.

  3. Se necessário, o aplicativo verifica a presença de aceleração de hardware em cada modo de exibição enumerado chamando IDirect3D9::CheckDeviceType, conforme mostrado no exemplo de código a seguir. Observe que esse é apenas um dos possíveis usos para IDirect3D9::CheckDeviceType; para obter detalhes, consulte Determinando o suporte a hardware (Direct3D 9).

    D3DPRESENT_PARAMETERS Params;
    // Initialize values for D3DPRESENT_PARAMETERS members. 
    
    Params.BackBufferFormat = D3DFMT_X1R5G5B5; 
    
    if(FAILED(m_pD3D->CheckDeviceType(Device.m_uAdapter, 
                      Device.m_DevType, 
                      Params.BackBufferFormat, Params.BackBufferFormat, 
                      FALSE))) 
        return E_FAIL;
    
  4. O aplicativo verifica o nível desejado de funcionalidade para o dispositivo nesse adaptador chamando o método IDirect3D9::GetDeviceCaps . A funcionalidade retornada por esse método é garantida como constante para um dispositivo em todos os modos de exibição, verificado por IDirect3D9::CheckDeviceType.

  5. Os dispositivos sempre podem renderizar em superfícies do formato de um modo de exibição enumerado com suporte do dispositivo. Se o aplicativo for necessário para renderizar em uma superfície de um formato diferente, ele poderá chamar IDirect3D9::CheckDeviceFormat. Se o dispositivo puder renderizar para o formato, será garantido que todos os recursos retornados por IDirect3D9::GetDeviceCaps sejam aplicáveis.

  6. Por fim, o aplicativo pode determinar se técnicas de multisampling, como a suavização de cena completa, têm suporte para um formato de renderização usando o método IDirect3D9::CheckDeviceMultiSampleType .

Depois de concluir as etapas anteriores, o aplicativo deve ter uma lista de modos de exibição nos quais ele pode operar. A etapa final é verificar se a memória acessível por dispositivo suficiente está disponível para acomodar o número necessário de buffers e suavização. Esse teste é necessário porque o consumo de memória para o modo e a combinação de várias amostras é impossível de prever sem verificá-lo. Além disso, algumas arquiteturas de adaptador de exibição podem não ter uma quantidade constante de memória acessível pelo dispositivo. Isso significa que um aplicativo deve ser capaz de relatar falhas de memória fora do vídeo ao entrar no modo de tela inteira. Normalmente, um aplicativo deve remover o modo de tela inteira da lista de modos que oferece a um usuário ou tentar consumir menos memória reduzindo o número de buffers traseiros ou usando uma técnica de multisampling menos complexa.

Um aplicativo em janelas executa um conjunto semelhante de tarefas.

  1. Ele determina o retângulo da área de trabalho coberto pela área de cliente da janela.
  2. Ele enumera adaptadores, procurando o adaptador cujo monitor abrange a área do cliente. Se a área do cliente pertencer a mais de um adaptador, o aplicativo poderá optar por conduzir cada adaptador de forma independente ou dirigir um único adaptador e ter pixels de transferência Direct3D de um dispositivo para outro na apresentação. O aplicativo também pode ignorar duas etapas anteriores e usar o adaptador D3DADAPTER_DEFAULT. Observe que isso pode resultar em uma operação mais lenta quando a janela é colocada em um monitor secundário.
  3. O aplicativo deve chamar IDirect3D9::CheckDeviceType para determinar se o dispositivo pode dar suporte à renderização para um buffer traseiro do formato especificado enquanto estiver no modo desktop. IDirect3D9::GetAdapterDisplayMode pode ser usado para determinar o formato de exibição da área de trabalho, conforme mostrado no exemplo de código a seguir.
    D3DPRESENT_PARAMETERS Params;
    // Initialize values for D3DPRESENT_PARAMETERS members. 
    
    // Use the current display mode.
    D3DDISPLAYMODE mode;
    
    if(FAILED(m_pD3D->GetAdapterDisplayMode(Device.m_uAdapter , &mode)))
        return E_FAIL;
    
    Params.BackBufferFormat = mode.Format;
    
    if(FAILED(m_pD3D->CheckDeviceType(Device.m_uAdapter, Device.m_DevType, 
    Params.BackBufferFormat, Params.BackBufferFormat, FALSE)))
        return E_FAIL;
    

Dispositivos Direct3D