DXGI 1.4 の機能強化
Microsoft DirectX Graphics Infrastructure (DXGI) 1.4 では、主にDirect3D 12をサポートするために、次の機能が追加または変更されています。
安価なアダプター列挙
Direct3D 12の場合、デバイスから IDXGIAdapter にバックトラックすることはできなくなりました。 D3D12CreateDevice にD3D_DRIVER_TYPE_WARPを提供することもできなくなります。 開発を容易にするために、 IDXGIFactory4 を使用してこれらの両方を処理できます。 IDXGIFactory4::EnumAdapterByLuid (ID3D12Device::GetAdapterLuid と組み合わせて設計) を使用すると、アプリはDirect3D 12デバイスが作成されたアダプターに関する情報を取得できます。 IDXGIFactory4::EnumWarpAdapter には、WARP レンダラーを使用するために D3D12CreateDevice に提供できるアダプターが用意されています。
ビデオ メモリの予算の追跡
アプリケーション開発者は、ビデオ メモリ予約システムを使用して、アプリが使用できない物理ビデオ メモリの量を OS に通知することをお勧めします。
プロセスで使用できる物理メモリの量は、"ビデオ メモリの予算" と呼ばれます。 バジェットは、バックグラウンド プロセスのウェイクアップとスリープのときに著しく変動する可能性があり、ユーザーが別のアプリケーションに切り替えるときに大幅に変動する場合があります。 アプリケーションでは、バジェットが変化したときに通知を受け取ることや、現在のバジェットと現在使用中のメモリの量の両方を問い合わせることができます。 アプリケーションの使用量がバジェット内に収まらない場合は、プロセスが間欠的に停止します。その間に他のアプリケーションを実行できるようにする、あるいは作成 API からエラーを返せるようにするためです。 IDXGIAdapter3 インターフェイスに、この機能に関するメソッドがあります。具体的には、QueryVideoMemoryInfo と RegisterVideoMemoryBudgetChangeNotificationEvent です。
詳細については、所在地に関するDirect3D 12トピックを参照してください。
スワップチェーンの変更をDirect3D 12する
既存の Direct3D 11 スワップチェーン機能の一部は、Direct3D 12のオーバーヘッド削減を実現するために非推奨となりました。 その他の変更は、Direct3D 12の概念に合わせるか、Direct3D 12機能のサポートを向上させるために行われました。
インバリアント バックバッファー ID
Direct3D 11 では、アプリケーションは GetBuffer( 0, ... ) を 1 回だけ呼び出すことができました。 Present を呼び出すたびに、返されるインターフェイスのリソース ID が暗黙的に変更されました。 Direct3D 12は、必要な CPU オーバーヘッドと柔軟なリソース記述子設計により、暗黙的なリソース ID の変更をサポートしなくなりました。 その結果、アプリケーションは、スワップチェーンで作成されたすべてのバッファーに対して GetBuffer を 手動で呼び出す必要があります。 アプリケーションは 、Present を呼び出した後、シーケンス内の次のバッファーに手動でレンダリングする必要があります。 アプリケーションでは、 Present ごとに多数のオブジェクトを再作成するのではなく、バッファーごとに記述子のキャッシュを作成することをお勧めします。
マルチアダプターのサポート
マルチ GPU アダプターでスワップチェーンが作成されると、バックバッファーはすべてノード 1 に作成され、1 つのコマンド キューのみがサポートされます。 ResizeBuffers1 を使用すると、アプリケーションは異なるノードにバックバッファーを作成し、それぞれで異なるコマンド キューを使用できます。 これらの機能により、代替フレーム レンダリング (AFR) 手法をスワップチェーンで使用できます。 「マルチアダプター システム」を参照してください。
その他
- コマンド キュー オブジェクトは、Direct3D 12 デバイス オブジェクトではなく CreateSwapChain メソッドに渡す必要があります。
- 次の 2 つのフリップ モデル スワップ効果のみがサポートされています。
- DXGI_SWAP_EFFECT_FLIP_DISCARDは、アプリケーションがバックバッファーを表示する前に完全にレンダリングする場合や、マルチアダプター のシナリオを簡単にサポートすることに関心がある場合に推奨されます。
DXGI_SWAP_EFFECT_FLIP_SEQUENTIALは、部分的なプレゼンテーションの最適化に依存するアプリケーション、または以前に提示されたバックバッファーから定期的に読み取るアプリケーションで使用する必要があります。 - SetFullscreenState はディスプレイを排他的に所有しなくなったため、ユーザーが開始したオペレーティング システム要素をアプリケーション出力の前にシームレスに表示できます。 ボリューム設定は、この例です。