スウィズル割り当てのロック
ビデオ メモリ マネージャーは、スウィズルされた割り当て領域 (ディスプレイ ミニポート ドライバーの DxgkDdiCreateAllocation 関数が DXGK_ALLOCATIONINFO 構造体の Flags メンバーに Swizzled フラグを設定する割り当て領域) への直接 CPU アクセスを特別にサポートします。
ビデオ メモリ マネージャーが、ドライバーによってスウィズルとしてマークされていない、CPU アクセス可能な割り当て領域をメモリ セグメントから追い出すとき、ディスプレイ ミニポート ドライバーは常にリニアな形式でそれらを格納する必要があります。 したがって、このような割り当て領域は、アパーチャ セグメント内に配置されている間はスウィズルすることはできません。また、スウィズルとスウィズル解除は、常にドライバーの DxgkDdiBuildPagingBuffer 関数で行う必要があります。
一方、スウィズルとしてマークされている割り当て領域は、メモリ セグメントから追い出すときに、必ずしもリニアな形式で格納されている必要はありません。 そのような割り当て領域については、スウィズル状態をビデオ メモリ マネージャーが追跡します。特定の転送操作中に割り当て領域のスウィズルを解除するために必要なのは、ドライバーの DxgkDdiBuildPagingBuffer 関数のみです。
ユーザーモード ディスプレイ ドライバーが Microsoft Direct3D ランタイムの pfnLockCb 関数を呼び出した後、ビデオ メモリ マネージャーとディスプレイ ミニポート ドライバーは、割り当て領域の状態に応じて、次のように動作します。
割り当て領域がメモリ セグメント内に配置されている場合
ビデオ メモリ マネージャーは、CPU アパーチャを取得して、割り当て領域へのリニア アクセスを提供しようと試みます。 ビデオ メモリ マネージャーは、アパーチャを取得できなかった場合、割り当て領域を再びシステム メモリに追い出します (ドライバーによって D3DDDICB_LOCKFLAGS 構造体の DonotEvict メンバーが設定されている場合を除く)。 ビデオ メモリ マネージャーがディスプレイ ミニポート ドライバーの DxgkDdiBuildPagingBuffer 関数を呼び出して割り当てデータを転送する際、ディスプレイ ミニポート ドライバーは割り当て領域のスウィズルを解除する必要があります。
割り当て領域がメモリから追い出されているか (スウィズルされた状態)、またはアパーチャ セグメント内にある場合
割り当て領域に CPU がアクセスするには、あらかじめスウィズルが解除されている必要があります。 そのため、ビデオ メモリ マネージャーは最初にメモリ セグメントに割り当て領域をページ インしようとします。 割り当て領域がメモリ セグメントに配置された後のビデオ メモリ マネージャーとディスプレイ ミニポート ドライバーの動作は、1 番目のケースと同じです。
割り当て領域がメモリから追い出されている場合 (スウィズルされていない状態)
割り当て領域が既にスウィズル解除されてシステム メモリに配置されている場合、ビデオ メモリ マネージャーは、それ以上の処理を行わずに既存の割り当てポインターを返します。
以前にスウィズル解除された割り当て領域を GPU で使用するには、その割り当て領域を GPU が使用する前に再度スウィズルする必要があります。 したがって、サーフェス エラーが発生すると、ビデオ メモリ マネージャーとディスプレイ ミニポート ドライバーは、次の方法で動作します。
メモリ セグメント内の割り当て領域 (CPU アパーチャによって動的にスウィズル解除)
割り当て領域は既に、GPU が処理できるスウィズル形式になっています。 そのため、ビデオ メモリ マネージャーによるそれ以上の処理は必要ありません。
システム メモリに追い出された割り当て領域 (スウィズル解除)
割り当て領域のページは、スウィズル解除されたデータを含んでおり、アパーチャ セグメントにマップすることはできません。 そのため、割り当て領域はメモリ セグメントにページ インする必要があります。 ビデオ メモリ マネージャーが割り当て領域をページ インするためにディスプレイ ミニポート ドライバーの DxgkDdiBuildPagingBuffer 関数を呼び出すと、ビデオ メモリ マネージャーは、割り当て領域をスウィズルするようディスプレイ ミニポート ドライバーに要求します。
注: スウィズルされた割り当て領域は、CPU アパーチャを介して CPU からアクセス可能になった場合でも、ユーザーモード ディスプレイ ドライバーが CPU アクセスを終了する前に追い出される可能性があります。 これは、2 番目のケースのように処理されます。 追い出しは、アプリケーションやユーザーモード ディスプレイ ドライバーから見えないように実行されます。 また、上書き禁止ロック (D3DDDICB_LOCKFLAGS の IgnoreSync メンバーを設定して取得したロック) は、スウィズルされた割り当て領域では許可されません。 このような割り当て領域に常時アクセスでるのは、CPU または GPU のみです。