IDXGIDevice4::OfferResources1 メソッド (dxgi1_5.h)
コンテンツの破棄とメモリのコミット解除の両方を含め、オペレーティング システムがリソースのビデオ メモリを解放できるようにします。
構文
HRESULT OfferResources1(
[in] UINT NumResources,
[in] IDXGIResource * const *ppResources,
[in] DXGI_OFFER_RESOURCE_PRIORITY Priority,
[in] UINT Flags
);
パラメーター
[in] NumResources
型: UINT
ppResources 引数配列内のリソースの数。
[in] ppResources
種類: IDXGIResource*
提供するリソースの IDXGIResource インターフェイスへのポインターの配列。
[in] Priority
種類: DXGI_OFFER_RESOURCE_PRIORITY
データの価値を示す DXGI_OFFER_RESOURCE_PRIORITY型指定された値。
[in] Flags
型: UINT
DXGI_OFFER_RESOURCE_FLAGSを指定します。
戻り値
型: HRESULT
このメソッドは、配列内のリソースまたは優先度が無効な場合にE_INVALIDARGを含めることができる HRESULT の成功またはエラー コードを返します。
解説
OfferResources1 (元の IDXGIDevice2::OfferResources API の拡張機能) を使用すると、D3D ベースのアプリケーションで割り当てのバッキング ストアのコミットを解除して、メモリ不足の条件下でのシステム コミットを減らすことができます。 コミット解除された割り当てを再利用できないため、新しいDXGI_OFFER_RESOURCE_FLAG_ALLOW_DECOMMIT フラグにオプトインすると、新しい再利用結果を適切に処理する必要があります。 DXGI_RECLAIM_RESOURCE_RESULTSのフラグの説明と以下の例を参照してください。
OfferResources1 と ReclaimResources1 は、OfferResources および ReclaimResources と同じ意味で使用することはできません。
Priority パラメーターが指定する優先度の値は、呼び出し元がコンテンツをどの程度重要と見なしているかを示します。 オペレーティング システムでは、優先度の値を使用して、優先順位の順にリソースを破棄します。 オペレーティング システムは、優先度の低いリソースを破棄してから、より高い優先度で提供されるリソースを破棄します。
OfferResources1 を呼び出してリソースがパイプラインにバインドされている間にリソースを提供すると、リソースはバインド解除されます。 マップされているリソースに対して OfferResources1 を呼び出すことはできません。 リソースを提供した後は、 ReclaimResources1 メソッドを呼び出してリソースを再利用するまで、リソースをマップしたり、パイプラインにバインドしたりすることはできません。 OfferResources1 を呼び出して変更できないリソースを提供することはできません。
共有リソースを提供するには、共有デバイスの 1 つだけで OfferResources1 を呼び出します。 リソースへの排他的アクセスを確保するには、 IDXGIKeyedMutex オブジェクトを使用し、ミューテックスを保持している間だけ OfferResources1 を呼び出す必要があります。 実際、 IDXGIKeyedMutex を使用せずに共有リソースを提供することはサポートされていないため、 IDXGIKeyedMutex を使用しない限り、共有リソースを提供することはできません。
ユーザー モード ディスプレイ ドライバーは、 OfferResources1 の呼び出しで指定したリソースをすぐに提供できない場合があります。 ドライバーは、 IDXGISwapChain::P resent、 IDXGISwapChain1::P resent1、または ID3D11DeviceContext::Flush の次回の呼び出しまで提供を延期できます。
例
UWP ベースのアプリケーションはバックグラウンドで中断されており、別のアプリケーションが必要とする場合に備えて、グラフィックス リソースをシステムに返したいと考えています。 アプリケーションは、再開時にこれらのリソースを再利用します。 また、アプリケーションは、使用可能なシステムコミットの合計がこのプラットフォーム上で小さく、そのリソースをシステムコミットから削除できるようにすることも認識しています。 システムがメモリ不足のため再利用プロセスが失敗した場合、アプリケーションはエラー状態を処理します。
struct Texture
{
UINT32 Width;
UINT32 Height;
UINT32 Mips;
ID3D11Texture2D* pResource;
};
void Application::OfferInterfaceResources(ID3D11Device* pD3D11Device)
{
CComPtr<IDXGIDevice4> pDXGIDevice;
ThrowIfFailed(pD3D11Device->QueryInterface(&pDXGIDevice));
for(Texture& t : m_Textures)
{
CComPtr<IDXGIResource> pDXGIResource;
ThrowIfFailed(t.pResource->QueryInterface(&pDXGIResource));
ThrowIfFailed(pDXGIDevice->OfferResources1(1, &pDXGIResource, DXGI_OFFER_RESOURCE_PRIORITY_NORMAL,
DXGI_OFFER_RESOURCE_FLAG_ALLOW_DECOMMIT));
}
}
void Application::ReclaimInterfaceResources (ID3D11Device* pD3D11Device)
{
CComPtr<IDXGIDevice4> pDXGIDevice;
ThrowIfFailed(pD3D11Device->QueryInterface(&pDXGIDevice));
for(Texture& t : m_Textures)
{
CComPtr<IDXGIResource> pDXGIResource;
ThrowIfFailed(t.pResource->QueryInterface(&pDXGIResource));
DXGI_RECLAIM_RESOURCE_RESULTS Result;
ThrowIfFailed(pDXGIDevice->ReclaimResources1(1, &pDXGIResource, &Result));
// If the surface lost its backing commitment, it must be recreated.
if(Result == DXGI_RECLAIM_RESOURCE_RESULT_NOT_COMMITTED)
{
t.pResource->Release();
t.pResource = CreateTexture(t.Width, t.Height, t.Mips);
}
// If the surface lost its content (either because it was discarded, or recreated
// due to lost commitment), we must regenerate the content.
if(Result != DXGI_RECLAIM_RESOURCE_RESULT_OK)
{
PopulateContent(t);
}
}
}
要件
対象プラットフォーム | Windows |
ヘッダー | dxgi1_5.h |
Library | Dxgi.lib |
[DLL] | Dxgi.dll |