マルチヘッド

マルチヘッド

マルチヘッド カードは、共通のフレーム バッファとアクセラレータを持ち、独立したデジタル アナログ コンバータ (DAC) とモニタ出力を持つカードである。このデバイスが提供するマルチ モニタ サポートを使うと、別々のディスプレイ アダプタを同じ数使った場合よりも便利である。

マルチヘッド カードは、複数のフルスクリーン スワップ チェーンを駆動する単一のアプリケーション プログラミング インターフェイス (API) レベルのデバイスとして API が公開する。これによって、すべてのリソースがすべてのヘッドによって共有され、すべてのヘッドがまったく同じ能力を持つことになる。各ヘッドを独立したディスプレイ モードに設定し、別々にリフレッシュ (IDirect3DSwapChain9::Present を使用) できる。同時にプレゼンテーションするには、IDirect3DDevice9::Present を使う。

マルチヘッド デバイスのスワップ チェーンはすべてフルスクリーンでなければならない。マルチヘッド モードに切り替わったとき、デバイスはフルスクリーンのままでなければならない。ウィンドウ モードに戻るときは、デバイスを破棄する必要がある (Alt+Tab キーによる最小化処理は例外)。

ビデオ メモリを複数のヘッドに分割して各ヘッドを完全に独立したアクセラレータとして扱う従来の方法は、今も一般的に使われている。そのメカニズムに代えてこの提案が有効となるのは、アプリケーションが Microsoft® DirectX® 9.0 マルチヘッド モードで機能するように特にコーディングされている場合だけである。

ドライバには、2 つの処理モード間の切り替えに必要な情報が提供される。

1 つのヘッドは "マスタ" ヘッドと呼ばれ、同じカードのその他のヘッドは "従属" ヘッドと呼ばれる。システム内に複数のマルチヘッド アダプタが存在する場合、1 つのマルチヘッド アダプタのマスタ ヘッドとその従属ヘッドは "グループ" と呼ばれる。各グループはそのグループのマスタ ヘッドのアダプタ番号で示される。

D3DCAPS9 構造体が更新されて、次のハードウェアの新しい能力が公開される。

UINT NumberOfAdaptersInGroup; 
UINT MasterAdapterOrdinal; 
UINT AdapterOrdinalInGroup;
  • NumberOfAdaptersInGroup は、従来のアダプタの場合は 1、マルチヘッド カードのマスタ アダプタの場合は 1 よりも大きくなる。 マルチヘッド カードの従属アダプタの場合は 0 になる。 各カードが持てるマスタは 1 つだけだが、従属アダプタは複数持つことができる。
  • MasterAdapterOrdinal は、その従属アダプタのマスタ デバイスを示す。
  • AdapterOrdinalInGroup は、API によるヘッドの参照順を示す。マスタ アダプタの AdapterOrdinalInGroup は常に 0 である。これらの値は IDirect3D9 メソッドに渡されるアダプタ番号には対応していない。これらはグループ内のヘッドだけに適用される。

この定義を使うと、DirectX 8.x でのようにアダプタがそれぞれ独立したカードであるかのように、マルチヘッド カードで複数のアダプタを表現できる。

マルチヘッド デバイスを作成するには、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

D3DCREATE_ADAPTERGROUP_DEVICE が設定されている場合、IDirect3DDevice9::CreateAdditionalSwapChain の追加呼び出しは無効である。

デバイスが D3DCREATE_ADAPTERGROUP_DEVICE を使って作成されている場合、IDirect3DDevice9::ResetD3DPRESENT_PARAMETERS の配列を期待する。

IDirect3DDevice9::Reset に渡される各 D3DPRESENT_PARAMETERS はフル スクリーンでなければならない。ウィンドウ モードに戻るには、マルチヘッドのデバイスを破棄して、マルチヘッドでないデバイスをウィンドウ モードで作成し直す必要がある。

次に、基本的な使い方のシナリオを示す。

1. マルチヘッド デバイスを作成する。
2. デバイスの各スワップ チェーンで繰り返し:
   3. i 番目のスワップ チェーンに対して GetBackBuffer を呼び出す
   4. SetRenderTarget を呼び出す。 
   5. DrawPrimitive を呼び出す。 
   6. オプションとして swapchain::Present を呼び出す (または、
      すべてのスワップ チェーンが描画され、ループ外でプレゼンテーションされるまで待つ)。
7. 繰り返しの終了。
8. オプションとして、device::Present を使ってすべてのスワップ チェーンをプレゼンテーションする。

詳細については、「IDirect3D9::CreateDevice」および「IDirect3DDevice9::GetNumberOfSwapChains」を参照すること。