Multihead (Direct3D 9)

Las tarjetas de varios cabezales son aquellas que tienen un búfer de fotogramas común y un acelerador, convertidores digitales a analógicos independientes (DAC) y salidas de supervisión. Estos dispositivos pueden ofrecer compatibilidad con varios monitores mucho más utilizables que un número similar de adaptadores de pantalla heterogéneos.

Las tarjetas multihead se exponen en la API como un único dispositivo de nivel de API que puede conducir varias cadenas de intercambio de pantalla completa. Por lo tanto, todos los recursos se comparten con todos los encabezados y cada cabeza tiene exactamente las mismas funcionalidades. Cada cabeza se puede establecer en modos de visualización independientes. Puede usar llamadas independientes a IDirect3DSwapChain9::P resent para actualizar cada encabezado. También puede usar una llamada a IDirect3DDevice9::P resent para actualizar cada encabezado secuencialmente.

Nota

La actualización de cada encabezado no se produce simultáneamente con una sola llamada a IDirect3DDevice9::P resent. Las estadísticas presentes en Direct3D 9Ex pueden usar la estructura D3DPRESENTSTATS para mantener las actualizaciones en cada cabeza cercana entre sí para limitar los efectos de desgarro en varios cabezales de adaptadores. Para obtener información sobre cómo sincronizar fotogramas de aplicaciones de modelo de volteo de Direct3D 9Ex, vea Mejoras de Direct3D 9Ex.

 

Cada cadena de intercambio para un dispositivo de varios encabezados debe ser de pantalla completa. Cuando un dispositivo ha entrado en modo de varias puntas, debe permanecer en pantalla completa. La transición al modo con ventana requiere la destrucción del dispositivo (excepto la operación NORMAL ALT+TAB-to-minimice).

El método antiguo de dividir la memoria de vídeo entre los cabezales y tratar cada cabeza como un acelerador totalmente independiente seguirá siendo un escenario de uso común. Esta propuesta no reemplaza ese mecanismo a menos que la aplicación se haya codificado específicamente para funcionar en el modo multihead de Direct3D 9.

A los controladores se les da un conocimiento adecuado para cambiar entre los dos modos de funcionamiento.

Una cabeza se llamará cabeza maestra, y todas las demás cabezas de la misma tarjeta se denominan cabezas subordinadas. Si hay más de un adaptador de varios cabezales en un sistema, el maestro y sus subordinados de un adaptador de varios cabezales se denominan grupo. Los grupos se indican mediante el ordinal del adaptador de su cabeza maestra.

La estructura D3DCAPS9 se ha actualizado para exponer los siguientes límites de hardware nuevos.

UINT NumberOfAdaptersInGroup; 
UINT MasterAdapterOrdinal; 
UINT AdapterOrdinalInGroup;
  • NumberOfAdaptersInGroup es 1 para adaptadores convencionales y mayor que 1 para el adaptador maestro de una tarjeta de varios cabezales. El valor será 0 para un adaptador subordinado de una tarjeta de varios cabezales. Cada tarjeta puede tener como máximo un maestro, pero puede tener muchos subordinados.
  • MasterAdapterOrdinal indica qué dispositivo es el maestro de este subordinado.
  • AdapterOrdinalInGroup indica el orden en que la API hace referencia a los encabezados. El adaptador maestro siempre tiene AdapterOrdinalInGroup 0. Estos valores no corresponden a los ordinales del adaptador pasados a los métodos IDirect3D9, sino que solo se aplican a los encabezados de un grupo.

Esta definición permite que las tarjetas multihead sigan presentando varios adaptadores como si fueran tarjetas independientes, igual que en DirectX 8.

Para crear un dispositivo de varios encabezados, especifique la marca de comportamiento D3DCREATE_ADAPTERGROUP_DEVICE en IDirect3D9::CreateDevice. Los parámetros de presentación (una matriz de D3DPRESENT_PARAMETERS) deben contener elementos NumberOfAdaptersInGroup. El runtime asignará cada elemento a cada encabezado en el orden numérico AdapterOrdinalInGroup. Cuando se establece D3DCREATE_ADAPTERGROUP_DEVICE, cada parámetro de presentación debe tener:

  • El miembro Windowed establecido en FALSE (es decir, ser pantalla completa).
  • El mismo valor para el miembro EnableAutoDepthStencil de D3DPRESENT_PARAMETERS.

Además, si EnableAutoDepthStencil es TRUE, cada uno de los campos siguientes debe tener el mismo valor para cada D3DPRESENT_PARAMETERS:

  • AutoDepthStencilFormat
  • BackBufferWidth
  • BackBufferHeight
  • BackBufferFormat

Si se establece DAC, las llamadas adicionales a IDirect3DDevice9::CreateAdditionalSwapChain no son válidas.

Si el dispositivo se creó con la DAC, IDirect3DDevice9::Reset esperará una matriz de D3DPRESENT_PARAMETERS.

Cada estructura de D3DPRESENT_PARAMETERS pasada a IDirect3DDevice9::Reset debe ser de pantalla completa. Para volver al modo con ventanas, la aplicación debe destruir el dispositivo y volver a crear un dispositivo que no sea multihead en modo con ventanas.

Este es un escenario 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 obtener más información, vea IDirect3D9::CreateDevice e IDirect3DDevice9::GetNumberOfSwapChains.

Sugerencias de programación