Метод 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
Этот метод возвращает код успеха или ошибки HRESULT, который может включать E_INVALIDARG, если ресурс в массиве или приоритет является недопустимым.
Комментарии
OfferResources1 (расширение исходного API IDXGIDevice2::OfferResources ) позволяет приложениям на основе 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 |
Header | dxgi1_5.h |
Библиотека | Dxgi.lib |
DLL | Dxgi.dll |