Seleccionar un dispositivo (Direct3D 9)

Las aplicaciones pueden consultar hardware para detectar los tipos de dispositivo Direct3D compatibles. Esta sección contiene información sobre las tareas principales implicadas en la enumeración de adaptadores de pantalla y la selección de dispositivos Direct3D.

Una aplicación debe realizar una serie de tareas para seleccionar un dispositivo Direct3D adecuado. Tenga en cuenta que los pasos siguientes están diseñados para una aplicación de pantalla completa y que, en la mayoría de los casos, una aplicación con ventanas puede omitir la mayoría de estos pasos.

  1. Inicialmente, la aplicación debe enumerar los adaptadores de pantalla en el sistema. Un adaptador es una pieza física de hardware. Tenga en cuenta que la tarjeta gráfica puede contener más de un único adaptador, como sucede con una pantalla de doble cabeza. Las aplicaciones que no están relacionadas con la compatibilidad con varios monitores pueden ignorar este paso y pasar D3DADAPTER_DEFAULT al método IDirect3D9::EnumAdapterModes en el paso 2.

  2. Para cada adaptador, la aplicación enumera los modos de visualización admitidos llamando a IDirect3D9::EnumAdapterModes.

  3. Si es necesario, la aplicación comprueba la presencia de la aceleración de hardware en cada modo de visualización enumerado mediante una llamada a IDirect3D9::CheckDeviceType, como se muestra en el ejemplo de código siguiente. Tenga en cuenta que esto es solo uno de los posibles usos para IDirect3D9::CheckDeviceType; para obtener más información, vea Determinar la compatibilidad con 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. La aplicación comprueba el nivel de funcionalidad deseado para el dispositivo en este adaptador llamando al método IDirect3D9::GetDeviceCaps . Se garantiza que la funcionalidad devuelta por este método es constante para un dispositivo en todos los modos de visualización, comprobado por IDirect3D9::CheckDeviceType.

  5. Los dispositivos siempre se pueden representar en superficies del formato de un modo de presentación enumerado compatible con el dispositivo. Si la aplicación es necesaria para representar en una superficie de un formato diferente, puede llamar a IDirect3D9::CheckDeviceFormat. Si el dispositivo puede representarse en el formato, se garantiza que todas las funcionalidades devueltas por IDirect3D9::GetDeviceCaps son aplicables .

  6. Por último, la aplicación puede determinar si se admiten técnicas de muestreo múltiple, como el suavizado de contorno de escena completa, para un formato de representación mediante el método IDirect3D9::CheckDeviceMultiSampleType .

Después de completar los pasos anteriores, la aplicación debe tener una lista de modos de visualización en los que puede funcionar. El último paso consiste en comprobar que hay suficiente memoria accesible para el dispositivo para dar cabida al número necesario de búferes y suavizado de contorno. Esta prueba es necesaria porque el consumo de memoria para el modo y la combinación multimuestra es imposible predecir sin comprobarlo. Además, es posible que algunas arquitecturas del adaptador de pantalla no tengan una cantidad constante de memoria accesible para el dispositivo. Esto significa que una aplicación debe poder notificar errores de memoria insuficiente al pasar al modo de pantalla completa. Normalmente, una aplicación debe quitar el modo de pantalla completa de la lista de modos que ofrece a un usuario, o bien debe intentar consumir menos memoria reduciendo el número de búferes de reserva o usando una técnica de muestreo múltiple menos compleja.

Una aplicación con ventanas realiza un conjunto de tareas similar.

  1. Determina el rectángulo de escritorio cubierto por el área cliente de la ventana.
  2. Enumera los adaptadores, buscando el adaptador cuyo monitor cubre el área de cliente. Si el área cliente es propiedad de más de un adaptador, la aplicación puede elegir controlar cada adaptador de forma independiente, o para controlar un único adaptador y tener píxeles de transferencia de Direct3D de un dispositivo a otro en la presentación. La aplicación también puede ignorar dos pasos anteriores y usar el adaptador de D3DADAPTER_DEFAULT. Tenga en cuenta que esto podría dar lugar a una operación más lenta cuando la ventana se coloca en un monitor secundario.
  3. La aplicación debe llamar a IDirect3D9::CheckDeviceType para determinar si el dispositivo puede admitir la representación en un búfer de reserva del formato especificado mientras está en modo de escritorio. IDirect3D9::GetAdapterDisplayMode se puede usar para determinar el formato de pantalla de escritorio, como se muestra en el ejemplo de código siguiente.
    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