ユーザー モード ディスプレイ ドライバーは複数のプロセスに同時に読み込まれません。ユーザー モード ディスプレイ ドライバー DLL は、各プロセスのアドレス空間に個別に読み込まれます。 それでも、複数のスレッドを同時にユーザー モード ディスプレイ ドライバーで実行できます。 ただし、ユーザー モード ディスプレイ ドライバーで実行されている各スレッドは、ユーザー モード ディスプレイ ドライバーの CreateDevice 関数の呼び出しによって作成される別のディスプレイ デバイスにアクセスする必要があります。 次に例を示します。
2 つの Microsoft Direct3D デバイスを作成するアプリケーションには、これらのデバイスに個別にアクセスする 2 つのスレッドを含めることができます。
アプリケーションは、2 つの異なるスレッドで、Microsoft DirectX 9.0 Direct3D ランタイムが作成した Direct3D デバイスと、DirectX 5.0 ランタイムが作成した Microsoft DirectDraw デバイスを使用できます。
注: 同じディスプレイ デバイスを使用している 2 つ以上のスレッドは、ユーザー モードのディスプレイ ドライバーで同時に実行することはできません。
ディスプレイ ミニポート ドライバーと同様に、Direct3D デバイスは独立しており、各デバイスの状態とリソースが他のデバイスに影響しないため、ユーザー モードのディスプレイ ドライバーはグローバル データ構造を使用する必要はありません。 ユーザー モード ディスプレイ ドライバーは、グローバルなクロスデバイス データ構造 (カスタム システム メモリ ヒープ マネージャーなど) をメインする必要がある場合は、独自のメカニズムを使用してアクセスを調整する必要があります。 ドライバーが管理するこのようなグローバル データ構造はお勧めしません。 Direct3D ランタイムは、リソースにアクセスする必要がある各ユーザー モードのディスプレイ デバイスで共有リソースの独立した "ビュー" を開くので、クロスプロセス リソースまたはクロスデバイス リソースを 1 つのプロセスまたはデバイスで使用するリソースと異なる方法で処理しないでください。 有効期間およびその他の管理は、DirectX グラフィックス カーネル サブシステム (Dxgkrnl.sys) によって処理されます。
複数プロセッサ コンピューターでは、Direct3D ランタイムは、メイン アプリケーション スレッドからではなく、ワーカー スレッドからユーザー モードディスプレイ ドライバーを呼び出す場合があります。 このマルチプロセッサ最適化は、ユーザー モードのディスプレイ ドライバーに対して透過的です。 ランタイムが複数プロセッサの最適化を使用する場合でも、特定のデバイスを参照するスレッドが常に 1 つだけドライバーで実行されます。