멀티헤드(Direct3D 9)

멀티헤드 카드는 공통 프레임 버퍼 및 액셀러레이터, 독립적인 DAC(디지털-아날로그 변환기) 및 모니터 출력이 있는 카드입니다. 이러한 디바이스는 비슷한 수의 다른 유형의 디스플레이 어댑터보다 훨씬 더 많은 사용 가능한 여러 모니터 지원을 제공할 수 있습니다.

다중 헤드 카드는 여러 전체 화면 스왑 체인을 구동할 수 있는 단일 API 수준 디바이스로 API에 노출됩니다. 따라서 모든 리소스는 모든 헤드와 공유되고 각 헤드는 정확히 동일한 기능을 갖습니다. 각 헤드는 독립적인 디스플레이 모드로 설정할 수 있습니다. IDirect3DSwapChain9::P resent에 대한 별도의 호출을 사용하여 각 헤드를 새로 고칠 수 있습니다. IDirect3DDevice9::P resent에 대한 하나의 호출을 사용하여 각 헤드를 순차적으로 새로 고칠 수도 있습니다.

참고

각 헤드의 새로 고침은 IDirect3DDevice9::P resent에 대한 단일 호출과 동시에 발생하지 않습니다. Direct3D 9Ex의 현재 통계는 D3DPRESENTSTATS 구조를 사용하여 각 헤드에 대한 새로 고침을 서로 가깝게 유지하여 여러 어댑터 헤드의 파기 효과를 제한할 수 있습니다. Direct3D 9Ex 대칭 이동 모델 애플리케이션의 프레임을 동기화하는 방법에 대한 자세한 내용은 Direct3D 9Ex 개선 사항을 참조하세요.

 

멀티헤드 디바이스의 각 스왑 체인은 전체 화면이어야 합니다. 디바이스가 멀티헤드 모드로 전환되면 전체 화면으로 유지되어야 합니다. 창 모드로 다시 전환하려면 디바이스를 삭제해야 합니다(일반적인 ALT+TAB을 최소화하기 위한 작업 제외).

비디오 메모리를 머리 간에 나누고 각 헤드를 완전히 독립적인 액셀러레이터로 처리하는 이전 방법은 여전히 일반적인 사용 시나리오입니다. 이 제안은 애플리케이션이 Direct3D 9 멀티헤드 모드에서 작동하도록 특별히 코딩되지 않는 한 해당 메커니즘을 대체하지 않습니다.

드라이버에는 두 가지 작업 모드 간에 전환할 수 있는 충분한 지식이 제공됩니다.

한 헤드를 master 머리라고 하고, 같은 카드 다른 모든 헤드를 종속 헤드라고 부릅니다. 시스템에 다중 헤드 어댑터가 두 개 이상 있는 경우 하나의 멀티헤드 어댑터에서 master 하위 어댑터를 그룹이라고 합니다. 그룹은 master 헤드의 어댑터 서수로 표시됩니다.

D3DCAPS9 구조체는 다음과 같은 새로운 하드웨어 캡을 노출하도록 업데이트되었습니다.

UINT NumberOfAdaptersInGroup; 
UINT MasterAdapterOrdinal; 
UINT AdapterOrdinalInGroup;
  • NumberOfAdaptersInGroup은 기존 어댑터의 경우 1이고 다중 헤드 카드 master 어댑터의 경우 1보다 큽니다. 다중 헤드 카드 하위 어댑터의 경우 값은 0입니다. 각 카드 최대 하나의 master 가질 수 있지만 많은 부하가 있을 수 있습니다.
  • MasterAdapterOrdinal은 이 하위 master 디바이스를 나타냅니다.
  • AdapterOrdinalInGroup은 API에서 헤드를 참조하는 순서를 나타냅니다. master 어댑터에는 항상 AdapterOrdinalInGroup 0이 있습니다. 이러한 값은 IDirect3D9 메서드에 전달된 어댑터 서수에 해당하지 않지만 그룹 내의 헤드에만 적용됩니다.

이 정의를 사용하면 멀티헤드 카드가 DirectX 8에서와 마찬가지로 독립 카드인 것처럼 여러 어댑터를 계속 표시할 수 있습니다.

멀티헤드 디바이스를 만들려면 IDirect3D9::CreateDevice에서 D3DCREATE_ADAPTERGROUP_DEVICE 동작 플래그를 지정합니다. 프레젠테이션 매개 변수( D3DPRESENT_PARAMETERS 배열)에는 NumberOfAdaptersInGroup 요소가 포함되어야 합니다. 런타임은 AdapterOrdinalInGroup 숫자 순서로 각 헤드에 각 요소를 할당합니다. D3DCREATE_ADAPTERGROUP_DEVICE 설정되면 각 프레젠테이션 매개 변수에는 다음이 있어야 합니다.

  • Windowed 멤버가 FALSE 로 설정됩니다(즉, 전체 화면).
  • D3DPRESENT_PARAMETERS EnableAutoDepthStencil 멤버에 대해 동일한 값입니다.

또한 EnableAutoDepthStencil이 TRUE이면 다음 필드 각각에 대해 각 D3DPRESENT_PARAMETERS 동일한 값이 있어야 합니다.

  • AutoDepthStencilFormat
  • BackBufferWidth
  • BackBufferHeight
  • BackBufferFormat

DAC가 설정되면 IDirect3DDevice9::CreateAdditionalSwapChain 에 대한 추가 호출이 잘못되었습니다.

DAC를 사용하여 디바이스를 만든 경우 IDirect3DDevice9::Reset 에는 D3DPRESENT_PARAMETERS 배열이 예상됩니다.

IDirect3DDevice9::Reset에 전달된 각 D3DPRESENT_PARAMETERS 구조체는 전체 화면이어야 합니다. 창 모드로 다시 전환하려면 애플리케이션이 디바이스를 삭제하고 창 모드에서 다중 헤드가 아닌 디바이스를 다시 만들어야 합니다.

기본 사용 시나리오는 다음과 같습니다.

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

자세한 내용은 IDirect3D9::CreateDeviceIDirect3DDevice9::GetNumberOfSwapChains를 참조하세요.

프로그래밍 팁