次の方法で共有


マルチヘッド (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::ResetD3DPRESENT_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 」を参照してください。

プログラミングのヒント