Condividi tramite


Metodo IDXGIDevice4::OfferResources1 (dxgi1_5.h)

Consente al sistema operativo di liberare la memoria video delle risorse, inclusa l'eliminazione del contenuto e il decomplicamento della memoria.

Sintassi

HRESULT OfferResources1(
  [in] UINT                         NumResources,
  [in] IDXGIResource                * const *ppResources,
  [in] DXGI_OFFER_RESOURCE_PRIORITY Priority,
  [in] UINT                         Flags
);

Parametri

[in] NumResources

Tipo: UINT

Numero di risorse nella matrice di argomenti ppResources .

[in] ppResources

Tipo: IDXGIResource*

Matrice di puntatori alle interfacce IDXGIResource per le risorse da offrire.

[in] Priority

Tipo: DXGI_OFFER_RESOURCE_PRIORITY

Valore tipizzato DXGI_OFFER_RESOURCE_PRIORITY che indica la quantità di dati importanti.

[in] Flags

Tipo: UINT

Specifica il DXGI_OFFER_RESOURCE_FLAGS.

Valore restituito

Tipo: HRESULT

Questo metodo restituisce un codice HRESULT riuscito o di errore, che può includere E_INVALIDARG se una risorsa nella matrice o la priorità non è valida.

Commenti

OfferResources1 (estensione dell'API IDXGIDevice2::OfferResources originale) consente alle applicazioni basate su D3D di consentire il de-commit dell'archivio di backup di un'allocazione per ridurre il commit del sistema in condizioni di memoria insufficiente. Non è possibile riutilizzare un'allocazione de-committed, pertanto acconsentire esplicitamente al nuovo flag di DXGI_OFFER_RESOURCE_FLAG_ALLOW_DECOMMIT significa che i nuovi risultati di recupero devono essere gestiti correttamente. Fare riferimento alle descrizioni dei flag in DXGI_RECLAIM_RESOURCE_RESULTS e all'esempio seguente.

OfferResources1 e ReclaimResources1non possono essere usati in modo intercambiabile con OfferResources e ReclaimResources.

Il valore di priorità specificato dal parametro Priority descrive il valore che il chiamante considera il contenuto. Il sistema operativo usa il valore di priorità per eliminare le risorse in ordine di priorità. Il sistema operativo elimina una risorsa offerta con priorità bassa prima che elimini una risorsa offerta con priorità più alta.

Se si chiama OfferResources1 per offrire una risorsa mentre la risorsa è associata alla pipeline, la risorsa non è associata. Non è possibile chiamare OfferResources1 su una risorsa mappata. Dopo aver offerto una risorsa, la risorsa non può essere mappata o associata alla pipeline finché non si chiama il metodo ReclaimResources1 per recuperare la risorsa. Non è possibile chiamare OfferResources1 per offrire risorse non modificabili.

Per offrire risorse condivise, chiamare OfferResources1 solo in uno dei dispositivi di condivisione. Per garantire l'accesso esclusivo alle risorse, è necessario usare un oggetto IDXGIKeyedMutex e quindi chiamare OfferResources1 solo mentre si mantiene il mutex. Infatti, non è possibile offrire risorse condivise a meno che non si usi IDXGIKeyedMutex perché l'offerta di risorse condivise senza l'uso di IDXGIKeyedMutex non è supportata.

Il driver di visualizzazione della modalità utente potrebbe non offrire immediatamente le risorse specificate in una chiamata a OfferResources1. Il driver può rimandare l'offerta fino alla chiamata successiva a IDXGISwapChain::P resent, IDXGISwapChain1::P resent1 o ID3D11DeviceContext::Flush.

Esempio

Un'applicazione basata su UWP viene sospesa in background e vuole offrire le risorse grafiche al sistema, nel caso in cui un'altra applicazione li voglia. L'applicazione recupererà queste risorse quando viene ripresa. L'applicazione si rende conto anche che il commit totale del sistema disponibile è ridotto in questa piattaforma ed è disposto a consentire la rimozione delle risorse dal commit del sistema. Se il processo di recupero non riesce perché il sistema non è in memoria, l'applicazione gestisce la condizione di errore.

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); 
        } 
    } 
} 

Requisiti

   
Piattaforma di destinazione Windows
Intestazione dxgi1_5.h
Libreria Dxgi.lib
DLL Dxgi.dll

Vedi anche

DXGI_RECLAIM_RESOURCE_RESULTS

IDXGIDevice4