次の方法で共有


PFND3DDDI_MAKERESIDENTCB コールバック関数 (d3dumddi.h)

pfnMakeResidentCb は、デバイス常駐リストにリソースを追加し、この割り当ての常駐参照カウントをインクリメントするように OS に指示するために使用されます。

構文

PFND3DDDI_MAKERESIDENTCB Pfnd3dddiMakeresidentcb;

HRESULT Pfnd3dddiMakeresidentcb(
  HANDLE hDevice,
  D3DDDI_MAKERESIDENT *unnamedParam2
)
{...}

パラメーター

hDevice

ディスプレイ デバイスへのハンドル。

unnamedParam2

pData [in, out]

常駐させるメモリ ページを記述する D3DDDI_MAKERESIDENT 構造体へのポインター。

戻り値

pfnMakeResidentCb は、次のいずれかの値を返します。

リターン コード 説明
S_OK すべての割り当ては、この関数の終了時に GPU に常駐し、すぐにアクセスできる状態になっています。
E_PENDING 割り当てはデバイス常駐要件リストに追加されましたが、正常にアクセスできるようになる前に完了するまでのページング操作が保留中です。 この場合、ユーザー モード ドライバーは、割り当てを参照するコマンド バッファーまたは GPU ページ エラーが発生する可能性があるコマンド バッファーを送信する前に、hPagingQueue に関連付けられている監視対象フェンス同期オブジェクトの PagingFenceValue が通知されるまで待機する必要があります。
E_OUTOFMEMORY ビデオ メモリ マネージャーは、要求されたすべての割り当てを常駐させるわけではありません。 この場合、指定されたリスト内の割り当てで、所在地数が変更されることはありません。 つまり、これはアトミック操作であり、すべての割り当てで常駐数が増加するか、いずれも増加しません。 さらに、NumBytesToTrim は、失敗した割り当てを再度常駐させる前に pfnEvictCb 呼び出すことによって、デバイス常駐要件リストからトリミングする必要があるバイト数をドライバーに示します。
アプリケーションに関連付けられているメモリ予算は、実行中のアプリケーションと非同期的に変更できます。 その結果、要求されたバイト数をトリミングしても、アプリケーションのメモリ予算が減った可能性があるため、次に割り当てのセットを常駐させる試みが成功するとは限りません。 このため、ドライバーは、要求が成功するか、ドライバーが 1 回の操作で前方進行を行い、その最後の試行で必要なリソースを使用できるすべてをトリミングするまで、各イテレーション間のトリミングをループで試行することを確認する必要があります。 最終的な試行が失敗した場合、基になるデバイスはエラーになり、ユーザー モード ドライバーは要求を中止し、アプリケーションに戻る必要があります。 エラーが発生しているデバイスに属するコンテキストへのそれ以上の送信はカーネルによって許可されません。
DirectX 12.0 ユーザー モード ドライバーの場合、pfnMakeResidentCb の動作は、割り当てのトリミングやページングの責任がなくなったため、若干異なります。 これは、呼び出しから戻った後のすべての割り当ての状態が、呼び出しの前と同じであることを確認するために行われます。 つまり、関数からE_OUTOFMEMORYが返された場合:
- すべての割り当ては元の状態のままです。
- 割り当ては常駐にされませんでした。
- PagingFenceValue は無視する必要があります。
リソースから割り当てへの変換に対応するために、ドライバーが複数のバッチで pfnMakeResidentCb 呼び出しを実行する必要がある場合、ドライバーは pfnEvictCb 同等の呼び出しで pfnMakeResidentCb への以前の呼び出しを元に戻し、エラー コードをランタイムに伝達する必要があります。

必要条件

要件 価値
サポートされる最小クライアント Windows 10
サポートされる最小サーバー Windows Server 2016
ターゲット プラットフォーム デスクトップ
ヘッダー d3dumddi.h (D3dumddi.h を含む)

関連項目

D3DDDI_MAKERESIDENT

pfnEvictCb