DXGKDDI_ACQUIRESWIZZLINGRANGE コールバック関数 (d3dkmddi.h)
DxgkDdiAcquireSwizzlingRange 関数を使用すると、特定のセグメントの中央処理装置 (CPU) アパーチャを介して割り当てにアクセスできます。
構文
DXGKDDI_ACQUIRESWIZZLINGRANGE DxgkddiAcquireswizzlingrange;
NTSTATUS DxgkddiAcquireswizzlingrange(
[in] IN_CONST_HANDLE hAdapter,
[in/out] INOUT_PDXGKARG_ACQUIRESWIZZLINGRANGE pAcquireSwizzlingRange
)
{...}
パラメーター
[in] hAdapter
ディスプレイ アダプターに関連付けられているコンテキスト ブロックへのハンドル。 ディスプレイ ミニポート ドライバーは、DxgkDdiAddDevice 関数の MiniportDeviceContext 出力パラメーターの Microsoft DirectX グラフィックス カーネル サブシステムにこのハンドルを以前に提供しました。
[in/out] pAcquireSwizzlingRange
CPU アパー チャを介 してアロケーションにアクセスできるようにするための情報を含むDXGKARG_ACQUIRESWIZZLINGRANGE構造体へのポインター。
戻り値
DxgkDdiAcquireSwizzlingRange は、次のいずれかの値を返します。
リターン コード | 説明 |
---|---|
STATUS_SUCCESS | DxgkDdiAcquireSwizzlingRange により、割り当てが正常にアクセス可能になりました。 |
STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNSUPPORTED | DxgkDdiAcquireSwizzlingRange は、割り当てのスウィズリング範囲をプログラムできませんでした。 ビデオ メモリ マネージャーは、それ以上の試行を行わずにスウィズリング範囲を取得できません。 |
STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLE | DxgkDdiAcquireSwizzlingRange は、別のスウィズリング範囲が現在必要なグラフィックス処理装置 (GPU) リソースを使用しているため、割り当てにスウィズリング範囲をプログラムできませんでした。 ビデオ メモリ マネージャーは、現在使用されている範囲の解放を試み、スウィズリング範囲の設定を再度試みます。 |
注釈
DxgkDdiAcquireSwizzlingRange 関数は、ユーザー モード ディスプレイ ドライバーが割り当てのビットを参照する仮想アドレスを要求した後 (つまり、ユーザー モードディスプレイ ドライバーが、D3DDDICB_LOCK構造体の Flags メンバーに設定された AcquireAperture ビット フィールド フラグを使用して pfnLockCb 関数を呼び出した後、割り当てが現在 CPU アクセス可能なメモリ セグメントに配置されている間) に呼び出されます。 pfnLockCb の呼び出しで AcquireAperture ビット フィールド フラグが設定されていない場合、DxgkDdiAcquireSwizzlingRange は呼び出されず、割り当てはユーザー モードディスプレイ ドライバーまたはアプリケーションが処理できる形式である必要があります。
DxgkDdiAcquireSwizzlingRange が呼び出されると、ディスプレイ ミニポート ドライバーは、指定されたセグメント (つまり、DXGKARG_ACQUIRESWIZZLINGRANGE の SegmentId メンバー) の CPU アパーチャを介してアクセス可能な、指定された割り当て (つまり、pAcquireSwizzlingRange パラメーターが指すDXGKARG_ACQUIRESWIZZLINGRANGE構造体の hAllocation メンバー) を作成する必要があります。 割り当ては、非表示の削除の後にコンピューター メモリに表示されるとおりに表示される必要があります。
ユーザー モードディスプレイ ドライバーによるすべての要求に、ディスプレイ ミニポート ドライバーからアクセスできるわけではありません。 ビデオ メモリ マネージャーが取得したスウィズリング範囲は、関連付けられている割り当てと指定されたプライベート データに基づいてキャッシュされます。 割り当てにアクセスするユーザー モードディスプレイ ドライバーによる最初の要求では、ディスプレイ ミニポート ドライバーの DxgkDdiAcquireSwizzlingRange 関数が呼び出され、割り当てがアクセス可能になります。 プライベート データが一致する後続の要求では、以前にセットアップされたマッピングが割り当てにアクセスするために使用されます。
ビデオ メモリ マネージャーは、ディスプレイ ミニポート ドライバーの DxgkDdiReleaseSwizzlingRange 関数を呼び出して、割り当てが削除または破棄されたとき、または別の割り当てで開口部が必要になったときに、スウィズリング範囲を解放します。 割り当ては、任意の数のスウィズル範囲 (たとえば、MIP レベルごとに 1 つの開口) に関連付けることができます。
アダプターがサポートするスウィズリング範囲の数は、ドライバーの DxgkDdiQueryAdapterInfo 関数が呼び出されたときに、DXGK_DRIVERCAPS構造体の NumberOfSwizzlingRanges メンバー内のドライバーによって公開されます。 すべての範囲が等しい (つまり、任意の範囲で、あらゆる種類のスウィズルやタイリングを解除したり、終了したりする可能性があります)。 ビデオメモリマネージャは、それらを必要とするすべてのアプリケーションの中で利用可能なスウィズリング範囲を仲裁します。
ドライバーはメモリ マップ I/O (MMIO) を使用してスウィズリング範囲を設定する必要があります。 これらの swizzling 範囲のアクセスは、GPU の実行に干渉してはなりません (つまり、 DxgkDdiAcquireSwizzlingRange が呼び出されたときに GPU をアイドル状態にすることはできません)。
DxgkDdiAcquireSwizzlingRange へのすべての呼び出しは、それ自体でシリアル化されますが、他の DDI 関数ではシリアル化されません。
CPU アクセスできないメモリ セグメントまたはシステム メモリに CPU アクセスをリダイレクトするスウィズリング範囲が GPU でサポートされている場合、ユーザー モードディスプレイ ドライバーは、pfnLockCb 関数の呼び出しで、D3DDDICB_LOCK構造体の Flags メンバーに AcquireAperture と UseAlternateVA ビット フィールド フラグの組み合わせを設定して割り当てをロックできます。 この状況では、ビデオ メモリ マネージャーは、ディスプレイ ミニポート ドライバーの DxgkDdiAcquireSwizzlingRange 関数を呼び出して、割り当てが CPU にアクセスできないメモリ セグメントまたは開口セグメントにある場合でも、割り当てのスウィズリング範囲を取得します。 スウィズル範囲は、ドライバーが管理する一部の GPU リソース (PCI アパーチャ範囲など) に関連付けられます。また、ビデオ メモリ マネージャーからはアクセスできないか、または考慮されていません。
DxgkDdiAcquireSwizzlingRange を呼び出してスウィズリング範囲を取得すると、ドライバーで管理されたリソースが不足したために失敗する可能性があります。スウィズリング範囲自体は無料ですが、リソースがないため使用できない可能性があります。 ドライバーは、 DxgkDdiAcquireSwizzlingRange からSTATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLEを返すことによって、ビデオ メモリ マネージャーがスウィズリング範囲を使用できないことを示すことができます。 ビデオ メモリ マネージャーは次に、現在使用されているスウィズリング範囲を解放し、ドライバーの DxgkDdiAcquireSwizzlingRange 関数をもう一度呼び出して、新しいスウィズリング範囲を設定しようとします。 すべてのスウィズリング範囲が解放され、ドライバーが引き続きSTATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLEで失敗した場合、ビデオ メモリ マネージャーは割り当てのスウィズリング範囲を取得できません。
DxgkDdiAcquireSwizzlingRange をページング可能にする必要があります。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows Vista |
対象プラットフォーム | デスクトップ |
Header | d3dkmddi.h |
IRQL | PASSIVE_LEVEL |