Direct3D 11 のデバイスの概要
Direct3D 11 のオブジェクト モデルでは、リソースの作成機能とレンダリング機能をデバイスと 1 つ以上のコンテキストに分離しています。この分離はマルチスレッドの容易化を目的としています。
- デバイス
- デバイス コンテキスト
- スレッドの考慮事項
デバイス
デバイスは、リソースの作成およびディスプレイ アダプターの機能の列挙に使用します。Direct3D 11 では、デバイスは ID3D11Device インターフェイスで表現します。
各アプリケーションには 1 つ以上のデバイスが必要ですが、ほとんどのアプリケーションでは、作成するデバイスは 1 つのみです。D3D11CreateDevice または D3D11CreateDeviceAndSwapChain を呼び出して、コンピューターにインストールされているいずれかのハードウェア ドライバーのデバイスを作成し、D3D_DRIVER_TYPE フラグでそのドライバーの種類を指定します。各デバイスでは、必要な機能に応じて 1 つ以上のデバイス コンテキストを使用できます。
デバイス コンテキスト
デバイス コンテキストには、デバイス使用時の環境や設定を格納します。具体的には、パイプライン ステートを設定し、デバイスが所有するリソースを使用してレンダリング コマンドを生成するためにデバイス コンテキストを使用します。Direct3D 11 では、イミディエイト レンダリング用とディファード レンダリング用の 2 種類のデバイス コンテキストが実装されます。どちらのコンテキストも ID3D11DeviceContext インターフェイスで表現します。
イミディエイト コンテキスト
イミディエイト コンテキストでは、ドライバーに直接レンダリングします。各デバイスは、GPU からデータを取得できるイミディエイト コンテキストを 1 つだけ持ちます。イミディエイト コンテキストを使用すると、コマンド リストを直ちにレンダリング (または再生) できます。
イミディエイト コンテキストの取得方法には、次の 2 つがあります。
- D3D11CreateDevice または D3D11CreateDeviceAndSwapChain を呼び出す。
- ID3D11Device::GetImmediateContext を呼び出す。
ディファード コンテキスト
ディファード コンテキストでは、GPU コマンドをコマンド リストに記録します。ディファード コンテキストは主にマルチスレッドで使用するので、シングル スレッド アプリケーションでは不要です。ディファード コンテキストは、通常、メインのレンダリング スレッドではなく、ワーカー スレッドで使用します。ディファード コンテキストは、その作成時にイミディエイト コンテキストのどのステートも継承しません。
ディファード コンテキストを取得するには、ID3D11Device::CreateDeferredContext を呼び出します。
イミディエイト コンテキストもディファード コンテキストも、あらゆるスレッドで使用できますが、これらのコンテキストを使用できるスレッドは一度に 1 つのみです。
スレッドの考慮事項
次の表は、Direct3D 11 と以前のバージョンの Direct3D でのスレッド モデルの相違を示しています。
Direct3D 11 と以前のバージョンの Direct3D との相違 ID3D11Device インターフェイスのメソッドはすべてフリー スレッド化されているので、一度に複数のスレッドから関数を呼び出しても安全です。
ID3D10Device インターフェイスの各メソッドは、フリー スレッド化するように設計されていません。ID3D10Device では、作成とレンダリングのすべての機能が実装されます (Direct3D 9 の ID3D9Device と同様)。Map と Unmap は ID3D10Resource の派生インターフェイス上で実装され、Begin、End、および GetData は ID3D10Asynchronous の派生インターフェイス上で実装されます。 |