マルチヘッド (Direct3D 9)

マルチヘッドカードは、共通のフレームバッファとアクセラレータ、独立したデジタル/アナログコンバータ(DAC)、およびモニタ出力を備えたカードです。 このようなデバイスは、同様の数の異種ディスプレイ アダプターよりもはるかに使用可能な複数のモニターのサポートを提供できます。

マルチヘッド カードは、複数の全画面表示スワップ チェーンを駆動できる 1 つの API レベルのデバイスとして API で公開されます。 したがって、すべてのリソースはすべてのヘッドと共有され、各ヘッドはまったく同じ機能を備えます。 各ヘッドは独立した表示モードに設定することができます。 IDirect3DSwapChain9::P resent への個別の呼び出しを使用して、各ヘッドを更新できます。 IDirect3DDevice9::P resent への 1 回の呼び出しを使用して、各ヘッドを順番に更新することもできます。

注意

各ヘッドの更新は、 IDirect3DDevice9::P resent の 1 回の呼び出しでは同時に行われません。 Direct3D 9Ex の現在の統計では、 D3DPRESENTSTATS 構造体を使用して、各ヘッドの更新を互いに近づけて、アダプターの複数のヘッドに対する引き裂き効果を制限できます。 Direct3D 9Ex フリップ モデル アプリケーションのフレームの同期については、「 Direct3D 9Ex の機能強化」を参照してください。

 

マルチヘッド デバイスの各スワップ チェーンは、全画面表示である必要があります。 デバイスがマルチヘッド モードになった場合は、全画面表示のままにする必要があります。 ウィンドウ モードに戻すには、デバイスの破棄が必要です (通常の 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 で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」を参照してください。

プログラミングのヒント