次の方法で共有


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

ビデオ メモリ マネージャー (VidMm) は、GPU のアドレス空間を管理します。 これを行う前に、カーネルモード ディスプレイ ミニポート ドライバー (KMD) は、メモリ セグメントを使用して、GPU のアドレス空間を VidMm を記述する必要があります。

KMD は、メモリ セグメントを作成して、ビデオ メモリ リソースを一般化および仮想化します。 これは、ハードウェアがサポートするメモリ タイプに基づき、メモリ セグメントを構成します (例: フレーム バッファ メモリまたはシステム メモリ アパーチャ)。

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

その後、セグメントの数と種類メイン変更されません。 VidMm:

  • 各プロセスが特定のセグメント内のリソースの公平な共有を受け取れるようにします。

  • すべてのセグメントを個別に管理します。

セグメントは重複しません。 したがって、VidMmは、アプリケーションが別のセグメントから保持するリソースの量に関係なく、1 つのセグメントからかなりのビデオ メモリ リソースの量を割り当てることができます。

KMD は、各メモリ セグメントにセグメント識別子を割り当てます。 その後、VidMm がビデオ リソースの割り当てを作成し、それらリソースをレンダーするように要求すると、KMD は次を実行します。

  • 要求をサポートするセグメントを識別します。

  • ドライバが VidMm を使用するセグメントを順番に指定します。

詳細については、「割り当ての作成時にセグメントを指定する」を参照してください。

KMD は、そのメモリ セグメント内の GPU で使用できるすべてのビデオ メモリ リソースを指定する必要はありません。 ただし、KMD では、システムで実行されているすべてのプロセスで VidMm が管理するすべてのメモリ リソースを指定する必要があります。 次に例を示します。

  • 固定関数パイプラインを実装する頂点シェーダー マイクロコードは、GPU アドレス空間内に存在できますが、VidMm が管理するメモリの外部 (つまり、セグメントの一部ではありません) です。 マイクロコードはすべてのプロセスで常に使用でき、プロセス間の競合の原因になることがないため、この構成が可能です。

  • 頂点バッファー、テクスチャ、レンダー ターゲット、アプリケーション固有のシェーダー コードなどのリソースの場合、VidMm は、ドライバのメモリ セグメントの 1 つからのビデオ メモリ リソースを割り当てる必要があります。 この要件は、リソースの種類がすべてのプロセスで公平に使用できる必要があるためです。

次の図は、KDM による GPU アドレス空間からのメモリ セグメントの構成方法例を示しています。

GPU アドレス空間をメモリ セグメントに分割する図。

図の数値は、次のメモリ セグメントに対応しています。

  1. CPU がアクセス可能な線形セグメント: このセグメントは CPU によってアクセス可能であり、線形アドレス空間として編成されます。

  2. CPU がアクセス不可な線形セグメント: このセグメントは、線形アドレス空間として編成されますが、CPU はアクセスできません。 これは、CPU のアクセスを必要としないリソースに使用されます。

  3. 読み取り専用 AGP アパーチャ セグメント: このセグメントは、AGP (高速グラフィックス ポート) メモリへの読み取り専用アクセスに使用されます。

  4. アパーチャ セグメント: このセグメントは、AGP アパーチャ経由でアクセスされるリソースに使用されます。

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