次の方法で共有


DMA バッファーの分割

分割ポイントは、表示ミニポート ドライバーによって送信された大きな作業項目を、実行に必要な GPU リソースが少ない小さな作業項目に分割するために、ビデオ メモリ マネージャーによって使用されます。 たとえば、大きな DMA バッファーは、ローカル ビデオ メモリまたは非ローカル メモリに収まらない可能性がある割り当てのセットを参照する場合があります。 このような作業項目を処理する唯一の方法は、GPU リソースの少ない複数の小さな作業項目に分割することです。

DMA バッファーの分割と DMA バッファーのプリエンプションは、異なる独立した概念であることに注意 してください。 ディスプレイ ミニポート ドライバーは、常に DMA バッファープリエンプションが不可能な GPU を持つシステムでも DMA バッファーの分割をサポートする必要があります。 コンテキストの保存と復元が不可能な GPU を使用するシステムでは、GPU スケジューラは DMA バッファーの分割部分をバック にスケジュールし、分割部分が別の GPU コンテキストから別の DMA バッファーとインターリーブされないようにします。 ただし、DMA バッファーの分割部分間でページング操作が必要であるため、分割 DMA バッファーの一部間でページング バッファーを送信する必要があります。 ドライバーがアプリケーション DMA ストリームの構築に使用する各分割ポイントは、ビデオ メモリ マネージャーによって使用されます。 送信された DMA バッファーは、各分割ポイントの後に十分な GPU 状態を再プログラミングして、その場所に挿入される可能性のあるページング バッファーを考慮する必要があります。

分割ポイントを指定するには、ディスプレイ ミニポート ドライバーは、D3DDDI_PATCHLOCATIONLIST の AllocationIndex メンバーで参照される各割り当てのD3DDDI_PATCHLOCATIONLIST構造体の SplitOffset および SlotId メンバーの値を指定します。 特定の DMA バッファー内での割り当て使用量を追跡するために、ビデオ メモリ マネージャーは、ドライバーが DxgkDdiQueryAdapterInfo 関数の呼び出しを通じて提供したDXGK_DRIVERCAPS 構造体の MaxAllocationListSlotId メンバーを使用して、配列の必要なディメンションを作成します。 この配列はゼロで初期化され、パッチ位置リストの分割部分エントリが処理されると入力されます。 パッチの場所の D3DDDI_PATCHLOCATIONLISTSlotId メンバーは、リソース テーブルのどの行を更新する必要がありますが、SplitOffset メンバーは割り当てが必要な DMA バッファー内のオフセットを示します。 DMA バッファーは、リソースが GPU からアクセスできない状態で SplitOffset によって指定されたポイントまで実行できます。 同様に、新しいパッチロケーション分割部分エントリが同じ SlotId を参照している場合、以前の割り当ては新しい割り当てに置き換えられ、以前の割り当ては不要になります (つまり、前の割り当てをページングアウトできます)。

DMA バッファーで必要なリソースをページングする場合、ビデオ メモリ マネージャーは、最初の要素から始めて最後の要素に向かって下に移動することで、パッチの場所の一覧を処理します。 ドライバーによって入力されるD3DDDI_PATCHLOCATIONLIST 要素には、SplitOffset メンバーの値が含まれている必要があります。要素は厳密に増加しています (つまり、割り当てはストリームで使用される順序で表示される必要があります)。 ビデオ メモリ マネージャーは、指定された順序でパッチの場所の一覧で参照される割り当てのページです。 メモリが不足しているためにビデオ メモリ マネージャーが割り当てをページインできなくなったポイントに達すると、ビデオ メモリ マネージャーは、準備されている DMA バッファーの現在の部分を GPU スケジューラに送信して実行します。 DMA バッファーは、前の分割ポイントの先頭から、取り込めなかった割り当てに指定された SplitOffset 値まで実行されます。 送信されると、ビデオ メモリ マネージャーは、リソース テーブルを使用して、DMA ストリーム内の現在の分割オフセットで必要な割り当ての一覧を決定します。 テーブルのすべての割り当ては現在の物理的な場所に保持されますが、使用されなくなった他の割り当ては削除される可能性があります。 その後、ビデオ メモリ マネージャーは引き続きパッチの場所の一覧を処理し、再び複数回分割する可能性があります。

ドライバーは、割り当てがバインドまたはバインド解除されるたびに分割ポイントを指定する必要があります。 割り当てがバインド解除されることを指定するために、ドライバーは、関連付けられたD3DDDI_PATCHLOCATIONLISTSlotId メンバーに適切な値を持つDXGK_ALLOCATIONLIST 構造体の hDeviceSpecificAllocation メンバーに NULL 割り当てハンドルを指定できます。 ドライバーは、ビデオ メモリ マネージャーが複雑なメモリ配置の問題を解決できる可能性を高めるために、大きなリソースのバインドを解除する必要があります。

同様に、ドライバーは分割ポイントごとに大きなリソースを再プログラミングする必要があります。 分割ポイントを取得すると、ビデオ メモリ マネージャーは、以前にバインドされた割り当てを前の割り当てに残すように強制されます。 これにより、メモリの断片化が発生し、以前にバインドされた割り当て制限がない場合に解決された可能性がある複雑なメモリ配置の問題を解決できない可能性があります。 分割ポイントで状態を計算する場合、ビデオ メモリ マネージャーは、その分割ポイントで再プログラミングされているスロット識別子 (SlotId) (つまり、同じ SplitOffset 値を他の要素と共有する各パッチ位置リスト要素) を決定し、この分割ポイントの配置制限を無視します。 たとえば、ドライバーが 64 MB (メガバイト)テクスチャを使用する場合、すべての分割ポイントでそのテクスチャを再プログラミングすると、ビデオ メモリ マネージャーは、必要に応じて、分割ポイント間でメモリ内でそのテクスチャを移動する柔軟性を提供します。