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 对象,然后仅在持有互斥时调用 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 |