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
傳回值
類型: HRESULT
這個方法會傳回 HRESULT 成功或錯誤碼,如果陣列中的資源或優先順序無效,可以包含E_INVALIDARG。
備註
OfferResources1 (原始 IDXGIDevice2::OfferResources API 的延伸模組,) 可讓以 D3D 為基礎的應用程式取消認可配置支援存放區,以降低低記憶體條件下的系統認可。 無法重複使用取消認可的配置,因此加入宣告新的DXGI_OFFER_RESOURCE_FLAG_ALLOW_DECOMMIT旗標表示必須正確處理新的回收結果。 請參閱 下列DXGI_RECLAIM_RESOURCE_RESULTS 和範例中的旗標描述。
OfferResources1 和 ReclaimResources1可能無法 與 OfferResources 和 ReclaimResources交換使用。
Priority參數所指定的優先順序值描述呼叫端考慮內容的價值。 作業系統會使用優先順序值,依優先順序捨棄資源。 作業系統會捨棄低優先順序提供的資源,再捨棄優先順序較高的資源。
如果您在資源系結至管線時呼叫 OfferResources1 來提供資源,則資源不會系結。 您無法在對應的資源上呼叫 OfferResources1 。 在您提供資源之後,必須先呼叫 ReclaimResources1 方法來回收資源,否則資源無法對應或系結至管線。 您無法呼叫 OfferResources1 來提供不可變的資源。
若要提供共用資源,請只在其中一個共用裝置上呼叫 OfferResources1 。 若要確保資源的獨佔存取權,您必須使用 IDXGIKeyedMutex 物件,然後只在您保存 mutex 時呼叫 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 |
程式庫 | Dxgi.lib |
Dll | Dxgi.dll |