複数プロセッサのサポート

複数プロセッサ コンピューター上のユーザー モード ディスプレイ ドライバーは、Microsoft Direct3D ランタイムで複数プロセッサ最適化を処理したり、ドライバー自身で複数プロセッサ最適化を実行したりできます。

ランタイムで処理される複数プロセッサ最適化

Direct3D ランタイムによって処理される複数プロセッサ最適化は、LockAsyncUnlockAsyncRename 関数をサポートするドライバーでのみ有効です。 これらの関数を使用すると、動的リソースを頻繁にロックするアプリケーションでも、複数プロセッサ最適化が適切に機能します。 LockAsyncUnlockAsync 関数は、GetQueryData 関数とともに、DDI バージョン 0x0000000B 以上を公開するドライバーに再入可能な必要があります。 ドライバーは、ドライバーの OpenAdapter 関数の呼び出しで、D3D10DDIARG_OPENADAPTER 構造体の DriverVersion メンバーの DDI バージョンの値を返します。 ランタイムが再入可能な方法でドライバー関数を呼び出すと、あるスレッドはその関数内で実行され、同じディスプレイ デバイスを参照する別のスレッドが別のドライバー関数内で実行されます。

Direct3D ランタイムは、作業を別のプロセッサにオフロードし、コンピューターのパフォーマンスを向上させるために、状況に応じて複数プロセッサ最適化を使用します。 複数プロセッサ最適化が有効な場合、Direct3D ランタイムとユーザー モード ディスプレイ ドライバーの間にソフトウェア レイヤーが追加されます。 このソフトウェア レイヤーは、Direct3D ランタイムがユーザー モード ディスプレイ ドライバーの関数に対して行うすべての呼び出しをインターセプトします。

ソフトウェア レイヤーは、ユーザー モード ディスプレイ ドライバーを直接呼び出す代わりに、ワーカー スレッドが非同期的に処理するバッチのキューにコマンドを入れます。 ただし、ソフトウェア レイヤーは、ユーザー モード ディスプレイ ドライバーの関数に対して行われるすべての呼び出しをバッチ処理することはできません。 特に、ソフトウェア レイヤーは、情報を返す関数 (CreateResource など) の呼び出しをバッチ処理できません。 ソフトウェア レイヤーがこれらの種類のドライバー関数を呼び出す必要がある場合、ソフトウェアレイヤーはワーカー スレッドを通してキューに入れられたすべてのコマンドをフラッシュし、メインアプリケーション スレッドでドライバー関数を呼び出します。

ドライバーで処理される複数プロセッサ最適化

ドライバー自身が複数プロセッサ最適化を実行する場合は、LockAsyncUnlockAsyncRename 関数を実装しないでください。 この場合、ドライバーは pfnSetAsyncCallbacksCb 関数を呼び出して、ランタイムがワーカー スレッドからランタイムのコールバック関数の呼び出しを開始または停止するかをランタイムに通知する必要があります。

ドライバー自身が複数プロセッサ最適化を実行する場合は、Direct3D ランタイムが複数プロセッサ最適化を有効にするかどうかを決定する際に使用するのと同じポリシーに従う必要があります。 このポリシーは、すべてのプロセスがシステム リソースを公平に共有することを可能にします。 特に、次の状況で、ドライバーは複数プロセッサ最適化を無効にする必要があります。

  • アプリケーションがウィンドウ モードで実行されている。

  • コンピューターに搭載されたプロセッサ (またはプロセッサ コア) が 1 つだけである。ドライバーは、ハイパースレッディングを使用する単一プロセッサ コンピューターの最適化を無効にする必要があります。

  • アプリケーションが、複数プロセッサ最適化を有効にしないように要求したか、アプリケーションがソフトウェア頂点処理を使用している。この情報は、ドライバーの CreateDevice 関数に渡されます。

ベンダーがこのような状況で複数プロセッサ最適化を有効にしたい場合は、まず Microsoft に問い合わせる必要があります。