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 플래그 설명과 아래 예제를 참조하세요.

OfferResources1ReclaimResources1은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
라이브러리 Dxgi.lib
DLL Dxgi.dll

추가 정보

DXGI_RECLAIM_RESOURCE_RESULTS

IDXGIDevice4