次の方法で共有


メモリ セグメントを使用して GPU アドレス スペースを表す

ビデオ メモリ マネージャーが GPU のアドレス空間を管理する前に、ディスプレイ ミニポート ドライバーは、メモリ セグメントを使用してビデオ メモリ マネージャーに GPU のアドレス空間を記述する必要があります。 ディスプレイ ミニポート ドライバーは、ビデオ メモリ リソースを一般化および仮想化するメモリ セグメントを作成します。 ドライバーは、ハードウェアがサポートするメモリの種類 (フレーム バッファー メモリやシステム メモリのアパーチャなど) に従ってメモリ セグメントを構成します。

ドライバーの初期化中に、ドライバーは、ビデオ メモリ マネージャーによってメモリ リソースを管理する方法を説明するセグメントの種類の一覧を返す必要があります。 ドライバーは、サポートするセグメントの種類の数を指定し、DxgkDdiQueryAdapterInfo 関数の呼び出しに応答して各セグメントの種類を記述します。 ドライバーは、DXGK_SEGMENTDESCRIPTOR 構造体を使用して各セグメントを記述します。 詳細については、「メモリ セグメントの使用の初期化」を参照してください。

その後、セグメントの数と種類メイン変更されません。 ビデオ メモリ マネージャーは、各プロセスが特定のセグメント内のリソースの公平な共有を受け取れるようにします。 ビデオ メモリ マネージャーは、すべてのセグメントを個別に管理し、セグメントは重複しません。 そのため、ビデオ メモリ マネージャーは、アプリケーションが別のセグメントから現在保持しているリソースの量に関係なく、あるセグメントからアプリケーションにかなりの量のビデオ メモリ リソースを割り当てます。

ドライバーは、各メモリ セグメントにセグメント識別子を割り当てます。 後で、ビデオ メモリ マネージャーがビデオ リソースの割り当てを作成し、それらのリソースをレンダリングするように要求すると、ドライバーは要求をサポートするセグメントを識別し、ドライバーがビデオ メモリ マネージャーで使用するセグメントを順番に指定します。 詳細については、「割り当ての作成時にセグメントを指定する」を参照してください。

ドライバーは、そのメモリ セグメント内の GPU で使用できるすべてのビデオ メモリ リソースを指定する必要はありません。ただし、ドライバーは、システム上で実行されているすべてのプロセス間でビデオ メモリ マネージャーが管理するすべてのメモリ リソースを指定する必要があります。 たとえば、固定関数パイプラインを実装する頂点シェーダー マイクロコードは GPU アドレス空間内に存在できますが、ビデオ メモリ マネージャーによって管理されるメモリの外部 (つまり、セグメントの一部ではありません) は、マイクロコードが常にすべてのプロセスで使用でき、プロセス間の競合の原因になることがないためです。 ただし、すべてのプロセスでリソースの種類をかなり使用できる必要があるため、ビデオ メモリ マネージャーは、ドライバーのメモリ セグメントの 1 つから、頂点バッファー、テクスチャ、レンダー ターゲット、アプリケーション固有のシェーダー コードなどのビデオ メモリ リソースを割り当てる必要があります。

次の図は、ドライバーが GPU アドレス空間からメモリ セグメントを構成する方法を示しています。

Diagram illustrating the division of GPU address space into memory segments.

ビデオ メモリ マネージャーから非表示になっているビデオ メモリは、ユーザー空間にマップしたり、特定のプロセスで排他的に使用したりすることはできません。 これを行うには、システム上で実行されているすべてのプロセスがすべてのメモリにアクセスできる必要がある仮想メモリの基本的な規則を破ります。