リソース作成時に DXGI 情報を渡す
Direct3D バージョン 10 ランタイムは、ユーザー モード ディスプレイ ドライバーの CreateResource(D3D10)関数を呼び出してリソースを作成するときに、DXGI 固有の情報を渡すことができます。 ランタイムは、D3D10DDIARG_CREATERESOURCE構造体の pPrimaryDesc メンバー内のDXGI_DDI_PRIMARY_DESC構造体へのポインターを渡して、リソースをプライマリとして使用できることを指定できます (つまり、リソースをディスプレイにスキャンアウトできます)。 ランタイムは、ランタイムがD3D10DDIARG_CREATERESOURCEの BindFlags メンバーのD3D10_DDI_BIND_PRESENT Standard Edition ビットも設定する場合にのみ、pPrimaryDesc を NULL 以外の値に設定します。
ランタイムは、DXGI_DDI_PRIMARY_DESCの Flags メンバーでDXGI_DDI_PRIMARY_OPTIONAL フラグを指定して、ドライバーがフリップ スタイルのプレゼンテーションでリソースの使用をオプトアウトできることをユーザー モードのディスプレイ ドライバーに通知できます。 フリップ スタイルのプレゼンテーションでリソースを使用しないことをランタイムに通知するために、ドライバーは、DXGI_DDI_PRIMARY_DESCの DriverFlagsメンバーに、DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT フラグを設定します。
リソースを作成するためのCreateResource(D3D10)呼び出しでドライバーからDXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUTが返された場合、リソースがプレゼンテーションのソースであれば、ランタイムは常にビット ブロック転送 (bitblt) スタイルのプレゼンテーション (フリップ スタイルのプレゼンテーションではなく) を実行します。 この機能は、グラフィックス ハードウェアが特定のリソースの種類の特定のサブセットをスキャンできない場合に便利です。 たとえば、グラフィックス ハードウェアでは、マルチサンプリングされたバック バッファー タイプのリソースをスキャンアウトできない場合があります。 さらに、マルチサンプリングされたバック バッファーをスキャンする機能は、サーフェスの形式によってさらに異なる場合があります。 グラフィックス ハードウェアが特定のマルチサンプリング形式をスキャンできなかった場合、ユーザー モードディスプレイ ドライバーは、この形式のリソースのDXGI_DDI_PRIMARY_DESCのDriverFlagsメンバーにDXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUTフラグを設定します。
ランタイムがDXGI_DDI_PRIMARY_DESCの FlagsメンバーでDXGI_DDI_PRIMARY_OPTIONAL フラグを設定して、フリップ スタイルのプレゼンテーションでリソースの使用をオプトアウトする可能性についてドライバーに通知しない場合でも、ドライバーはCreateResource(D3D10)の呼び出しからDXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT フラグと共にDXGI_DDI_ERR_UNSUPPORTEDエラー コードを返すことができます。 ドライバーがこのようなプライマリをスキャンできない場合、ドライバーの CreateResource(D3D10) は pfnSetErrorCb 関数の呼び出しでDXGI_DDI_ERR_UNSUPPORTEDを渡します。 DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUTと共にDXGI_DDI_ERR_UNSUPPORTEDを返すと、DXGI は、バック バッファーとプライマリ サーフェスの間で、プレゼンテーション パス内のプロキシ サーフェスを介在させます。 プロキシ サーフェスは、サイズ、マルチサンプル、回転の点で、常にプライマリ (スキャンアウト) サーフェスと一致します。 このプロセスの最初の手順は、DXGI がマルチサンプルまたは回転の設定のうち、ドライバーがそれらの設定でサーフェスをスキャンすることを拒否する原因を特定することです。 DXGI はスケール バックして、回転なし、マルチサンプリングなし、またはその両方なしでプライマリを作成しようとすることで、この決定を行います。 DXGI がスキャンアウト機能に対するドライバーのサポートを決定した後、DXGI はプライマリ サーフェスとプロキシ サーフェスを作成し、ドライバーはこれら 2 つのサーフェス間をフリップできる必要があります。 DXGI は、ドライバーの BltDXGI関数を呼び出してバック バッファーからプロキシ サーフェイスにビットブレットを実行することで、自動回転またはマルチサンプリングバック バッファーに対するアプリケーションの要求を引き続き満たします。 これらのビットブレットは、マルチサンプルの解決または回転を実行するようにドライバーに要求します。 BltDXGI の詳細については、BltDXGIリファレンス ページを参照してください。