スレッド、コマンド リスト、および 3-D パイプラインのサポート
このセクションは、Windows 7 以降、および Windows Server 2008 R2 以降のバージョンの Windows オペレーティング システムのみを対象としています。
ユーザー モード ディスプレイ ドライバーは、Direct3D バージョン 11 ランタイムがドライバーの GetCaps(D3D10_2) 関数を呼び出すときに、サポート対象の新しい Direct3D バージョン 11 機能 (スレッド処理、コマンド リスト、3D パイプラインなど) を示します。 GetCaps(D3D10_2) は、ドライバーが D3D10_2DDI_ADAPTERFUNCS 構造体内で提供するライバーのアダプター固有の関数の 1 つであり、 pAdapterFuncs_2 メンバー (D3D10DDIARG_OPENADAPTER 構造体の メンバー) がポインターで指すものです。 ドライバーの初期化中にアダプター固有の関数を提供する方法の詳細については、「Direct3D バージョン 11 DDI との通信の初期化」を参照してください。 GetCaps(D3D10_2) 関数が呼び出されると、ユーザー モード ディスプレイ ドライバーは、要求の種類に基づいて新しい Direct3D バージョン 11 機能を提供します。要求の種類は Type メンバー (D3D10_2DDIARG_GETCAPS 構造体のメンバー) で指定され、GetCaps(D3D10_2) 関数の pData パラメーターがこれを指しています。
スレッド処理とコマンド リスト
Direct3D バージョン 11 API には、アプリケーション スレッドを同期して、一度に 1 つのスレッドのみが DDI で実行されるようにする操作モードが必要です。 Direct3D バージョン 11 API には、コマンド リストのソフトウェア エミュレーションを使用した操作モードも必要です。 これらの動作モードは、以前のバージョンの DDI (Direct3D バージョン 10 DDI など) で必要であり、利用されています。 したがって、ドライバー ライターの開発支援として、これらの同じ操作モードが Direct3D バージョン 11 DDI に存在するように拡張されます。 ドライバーライターは、ドライバーが Direct3D バージョン 11 DDI をサポートする操作のモードを決定できます。
すべてのドライバーは、最終的にすべての種類のスレッド操作を完全にサポートする必要があります (つまり、すべてのドライバーが最終的に D3D11DDI_THREADING_CAPS 構造体のすべてのスレッド機能をサポートする必要があります)。 ただし、ドライバーは API がコマンド リストをエミュレートするか、ドライバーのシングル スレッド モードの操作を適用する必要があります。 API は、API デバイスの作成時に (ただし、DDI デバイスを作成する前に) ドライバーのスレッド機能を認識する必要があります。 したがって、ランタイムはドライバーのアダプター固有の関数である GetCaps(D3D10_2) を Type メンバー (D3D11DDICAPS_THREADING に設定された D3D10_2DDIARG_GETCAPS のメンバー) で.呼び出すときにドライバーのスレッド機能を判断します。 ドライバーは D3D11DDI_THREADING_CAPS 構造体を指すポインターを (ドライバーのスレッド機能を識別する D3D10_2DDIARG_GETCAPS の pData メンバー内で) 返します。 コマンド リストはフリースレッド モードで構築されるので、ドライバーがコマンドリスト (D3D11DDICAPS_COMMANDLISTS_BUILD_2) もサポートしている場合にはフリースレッド モード(D3D11DDICAPS_FREETHREADED) をサポートする必要があります。 ドライバーは、フリー スレッド モードとコマンド リストをサポートするためにオプトインする必要があります。 アプリケーションは、アプリケーション レベル の CheckFeatureSupport 関数と D3D11_FEATURE_THREADING 定数を使用してドライバーが示したサポートを特定できます。ただし、アプリケーションによっては、API でサポートが提供されるので気にする必要はありません。
3D パイプライン レベル
Direct3D バージョン 11 DDI をサポートするドライバーは、Direct3D バージョン 11 DDI のすべてのハードウェア機能をサポートする必要はありません。 ドライバーは、Direct3D バージョン 10 DDI のみをサポートするハードウェア上の Direct3D バージョン 11 DDI の新しいスレッド モデルをサポートできます。 Direct3D バージョン 11 ランタイムは、ランタイムがドライバーの GetCaps(D3D10_2) 関数を Type メンバー (D3D11DDICAPS_3DPIPELINESUPPORT に設定された D3D10_2DDIARG_GETCAPS のメンバー) で呼び出したときにドライバーのサポートする最大ハードウェア レベルを判断します。 ドライバーは、D3D11DDI_3DPIPELINESUPPORT_CAPS構造体へのポインターを pData メンバー (サポートする最大ハードウェア レベルを識別する D3D10_2DDIARG_GETCAPS のメンバー) 内で返します。
API は、API 機能レベルのサポートの主要なインジケーターとして DDI バージョンのみを使用するわけではありません。API を使用すると、ドライバーはこのプロセスにフィードバックできます。 ランタイムは D3D11DDI_3DPIPELINELEVEL 値を選択し、デバイスの作成時にドライバーに値をフィードバックします。デバイスの作成は、ドライバーの CreateDevice(D3D10) 関数を Flags メンバー (D3D10DDIARG_CREATEDEVICE 構造体のメンバー) の一部として呼び出すと開始されます。
ドライバーが Direct3D バージョン 11 DDI で Direct3D バージョン 11 未満のハードウェア レベルをサポートしている場合、ドライバーの操作に軽微な影響があります。 1 つ目は、Direct3D バージョン 11 ランタイムが、多くの新しい Direct3D バージョン 11 DDI 関数をまったく呼び出さない可能性があるということです。 たとえば、Direct3D バージョン 11 ランタイムでは、ドライバーが Direct3D バージョン 11 未満のハードウェア機能レベルをサポートしている場合、新しいシェーダー ステージ DDI 関数 ( DsSetShaderのような関数) は呼び出されません。 他の DDI 関数は、機能レベルの規則に従い、Direct3D バージョン 11 DDI が上位の機能に関連付けられている可能性があるという事実を無視します。 たとえば、Direct3D バージョン 11 API の IAVertexInputSlots は 32 ですが、Direct3D バージョン 10 の機能レベルでは 16 のみが許可され、ドライバーが期待する機能です。
非推奨または変換された機能は、もう 1 つの興味深い側面を示します。 非推奨は以前のバージョンの DDI 関数を表現する機能をサポートする必要があるため、Direct3D バージョン 11 DDI レベルでは非推奨化できません。 たとえば、DIRECT3D 11 API バージョンの PIPELINESTATS は常に一定です。ただし、Direct3D 10 の機能レベルでは異なる D3D10_DDI_QUERY_DATA_PIPELINE_STATISTICS を要求し、Direct3D 11 の機能レベルでは D3D11_DDI_QUERY_DATA_PIPELINE_STATISTICS を要求することになります。 API がテキスト フィルター のサイズを非推奨にしようとしたとしても、ドライバーは、他の何かに対して関数テーブル エントリを再利用するよりも、DDI 関数テーブルエントリ全体を非推奨にする方が簡単です。
Direct3D バージョン 11 DDI をサポートするドライバーが Direct3D バージョン 11 の完全な機能レベルをサポートしていない場合でも、「拡張形式認識のサポート」で説明しているように、ドライバーは「拡張形式認識」をオプトアウトできません。 ドライバーは Direct3D バージョン 11 DDI をサポートしているため、ドライバーは次のタスクを処理する必要があります。
BGR 形式のサポート
CheckFormatSupport 関数の呼び出しに正しく応答して、XR_BIASサポートの対象かどうかを調べます。 ドライバーは、サポートを要求するか、サポートを拒否する必要があります。
完全に型指定されたバック バッファーのキャストを許可する
Direct3D バージョン 11 API は、アプリケーションが D3D11DDI_CREATEDEVICE_FLAG_SINGLETHREADED フラグを介して複数のスレッドを使用するかどうかをドライバーに通知します。 このフラグが Flags メンバー (D3D10DDIARG_CREATEDEVICE 構造体のメンバー) 内に (ドライバーの CreateDevice(D3D10) 関数の呼び出しによってディスプレイ デバイスが作成される時点で) 存在する場合、ドライバーは遅延コンテキストが作成されないと判断し、同時作成が発生しないことからドライバーの同期は必要がないと判断します。