マルチヘッド (Direct3D 9)
マルチヘッド カードは、共通のフレーム バッファーとアクセラレータ、独立したデジタルからアナログへのコンバーター (DAC)、およびモニター出力を備えているカードです。 このようなデバイスは、類似した数の異種ディスプレイ アダプターよりもはるかに使いやすい複数のモニター サポートを提供できます。
マルチヘッド カードは、複数の全画面表示スワップ チェーンを駆動できる単一の API レベルのデバイスとして API で公開されます。 その結果、すべてのリソースはすべてのヘッドと共有され、各ヘッドはまったく同じ機能を持っています。 各ヘッドは独立した表示モードに設定できます。 個別の呼び出しを使用して IDirect3DSwapChain9::P resentをして、各ヘッドを更新できます。 また、1 回の呼び出しを使用して IDirect3DDevice9::P存在するをして、各ヘッドを順番に更新することもできます。
手記
各ヘッドの更新は、IDirect3DDevice9::P resentへの 1 回の呼び出しでは同時に行われません。 Direct3D 9Ex の現在の統計情報では、D3DPRESENTSTATS 構造を使用して、各ヘッドの更新を互いに近い状態に保ち、アダプターの複数のヘッド間の引き裂き効果を制限できます。 Direct3D 9Ex フリップ モデル アプリケーションのフレームの同期については、「Direct3D 9Ex Improvementsを参照してください。
マルチヘッド デバイスの各スワップ チェーンは、全画面表示である必要があります。 デバイスがマルチヘッド モードになった場合は、全画面表示のままである必要があります。 ウィンドウ モードに戻すには、デバイスを破棄する必要があります (通常の Alt + TAB キーを押して最小化する操作を除く)。
ヘッド間でビデオ メモリを分割し、各ヘッドを完全に独立したアクセラレータとして扱う古い方法は、引き続き一般的な使用シナリオです。 この提案は、アプリケーションが Direct3D 9 マルチヘッド モードで機能するように特別にコーディングされていない限り、そのメカニズムを置き換えません。
ドライバーには、2 つの動作モードを切り替えるのに十分な知識が与えられている。
1 つのヘッドはマスター ヘッドと呼ばれ、同じカード上の他のすべてのヘッドは下位ヘッドと呼ばれます。 システムに複数のマルチヘッド アダプターが存在する場合、1 つのマルチヘッド アダプターのマスターとその下位はグループと呼ばれます。 グループは、マスター ヘッドのアダプター序数で表されます。
D3DCAPS9 構造体が更新され、次の新しいハードウェア キャップが公開されました。
UINT NumberOfAdaptersInGroup;
UINT MasterAdapterOrdinal;
UINT AdapterOrdinalInGroup;
- NumberOfAdaptersInGroup は、従来のアダプターでは 1、マルチヘッド カードのマスター アダプターでは 1 より大きいです。 マルチヘッド カードの下位アダプターの値は 0 になります。 各カードには最大で 1 つのマスターを含めることができますが、下位が多数ある場合があります。
- MasterAdapterOrdinal は、どのデバイスがこの下位のマスターであるかを示します。
- AdapterOrdinalInGroup は、API によってヘッドが参照される順序を示します。 マスター アダプターには常に 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::CreateDevice と IDirect3DDevice9::GetNumberOfSwapChains 」を参照してください。
関連トピック