マルチヘッド (Direct3D 9)
マルチヘッド カードとは、共通のフレーム バッファーとアクセラレーター、独立した DAC コンバーター、およびモニター出力を持つカードです。そのようなデバイスは、異種ディスプレイ アダプターの数よりもはるかに多くの有用な複数モニター サポートを提供できます。
マルチヘッド カードは、複数の全画面スワップ チェーンを駆動できる単一の API レベルデバイスとして、API に公開されます。そのため、すべてのリソースがすべてのヘッドで共有され、各ヘッドの能力はまったく同じです。各ヘッドは、独立したディスプレイ モードに設定でき、さまざまな時間でリフレッシュできます (IDirect3DSwapChain9::Present を使って)。同時設定には、IDirect3DDevice9::Present を使用します。
マルチヘッド ドライブの各スワップ チェーンは全画面でなければなりません。デバイスがマルチヘッド モードに入っても、全画面のままでなければなりません。情報がウィンドウ表示モードに戻るには、デバイスの破棄が必要です (操作を最小化する通常の ALT+TAB を除く)。
ヘッド間でのビデオ メモリーの分割、および各ヘッドを完全独立アクセラレーターとして処理する古い方法は、今後も一般的な利用方法となります。ただし、アプリケーションが具体的に Direct3D 9 マルチヘッド モードの関数にコード化されていない限り、メカニズムに優先されることはありません。
ドライバーには、2 つの操作モードを切り替える適切な情報が与えられます。
あるヘッドはマスター ヘッドと呼ばれ、同じカード上にある残りのヘッドはすべて従属ヘッドと呼ばれます。1 つのシステム内にマルチヘッド アダプターが複数存在する場合、1 つのマルチヘッド アダプターのマスターおよびその従属は 1 つのグループと見なされます。グループは、それらのマスター ヘッドのアダプター序数で示されます。
次の新しいハードウェアの能力公開するために、D3DCAPS9 構造体が更新されています。
UINT NumberOfAdaptersInGroup;
UINT MasterAdapterOrdinal;
UINT AdapterOrdinalInGroup;
- NumberOfAdaptersInGroup は従来のアダプターに対して 1 であり、マルチヘッド カードのマスター アダプターに対しては 1 より大きな数です。マルチヘッド カードの従属アダプターの場合は、0 になります。どのカードの場合でも、マスターは最大で 1 つですが、従属は多数持つことができます。
- MasterAdapterOrdinal は、この従属デバイスのマスター デバイスを示します。
- AdapterOrdinalInGroup は、API によってヘッドが参照される順序を示します。マスター アダプターは常に AdapterOrdinalInGroup 0 を持ちます。これらの値は、IDirect3D9 メソッドに渡されるアダプター序数に対応していませんが、グループ内のヘッドのみに適用されます。
この定義により、マルチヘッド カードは、複数のアダプターが独立したカードであるかのように (DirectX 8 でそうであったように) 表示し続けることができます。
マルチヘッドデバイスを作成するには、IDirect3D9::CreateDevice に動作フラグ DAC を指定します。プレゼンテーション パラメーター (D3DPRESENT_PARAMETERS の配列) は、NumberOfAdaptersInGroup 要素を含む必要があります。ランタイムは各要素を AdapterOrdinalInGroup の番号順に各ヘッドに割り当てます。DAC が設定されている場合、各プレゼンテーション パラメーターは次を必要とします。
- FALSE (つまり全画面) に設定されている Windowed メンバー。
- 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::CreateDevice」および「IDirect3DDevice9::GetNumberOfSwapChains」を参照してください。