Поделиться через


Метод 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

См. также раздел

DXGI_RECLAIM_RESOURCE_RESULTS

IDXGIDevice4