Partager via


MÉTHODE IDXGIDevice4::OfferResources1 (dxgi1_5.h)

Permet au système d’exploitation de libérer la mémoire vidéo des ressources, y compris l’abandon du contenu et la désactivation de la mémoire.

Syntaxe

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

Paramètres

[in] NumResources

Type : UINT

Nombre de ressources dans le tableau d’arguments ppResources .

[in] ppResources

Type : IDXGIResource*

Tableau de pointeurs vers les interfaces IDXGIResource pour les ressources à offrir.

[in] Priority

Type : DXGI_OFFER_RESOURCE_PRIORITY

Valeur de type DXGI_OFFER_RESOURCE_PRIORITY qui indique la valeur des données.

[in] Flags

Type : UINT

Spécifie le DXGI_OFFER_RESOURCE_FLAGS.

Valeur retournée

Type : HRESULT

Cette méthode retourne un code de réussite ou d’erreur HRESULT, qui peut inclure E_INVALIDARG si une ressource dans le tableau, ou la priorité, n’est pas valide.

Notes

OfferResources1 (une extension de l’API IDXGIDevice2::OfferResources d’origine) permet aux applications D3D d’autoriser la désactivation du magasin de stockage d’une allocation afin de réduire la validation du système dans des conditions de mémoire faible. Une allocation dénouée ne peut pas être réutilisée. Par conséquent, si vous optez pour le nouvel indicateur DXGI_OFFER_RESOURCE_FLAG_ALLOW_DECOMMIT, les nouveaux résultats de récupération doivent être correctement gérés. Reportez-vous aux descriptions des indicateurs dans DXGI_RECLAIM_RESOURCE_RESULTS et à l’exemple ci-dessous.

OfferResources1 et ReclaimResources1ne peuvent pas être utilisés indifféremment avec OfferResources et ReclaimResources.

La valeur de priorité spécifiée par le paramètre Priority décrit la valeur que l’appelant considère comme étant du contenu. Le système d’exploitation utilise la valeur de priorité pour ignorer les ressources dans l’ordre de priorité. Le système d’exploitation ignore une ressource qui est proposée avec une priorité faible avant d’ignorer une ressource qui est proposée avec une priorité plus élevée.

Si vous appelez OfferResources1 pour proposer une ressource alors que la ressource est liée au pipeline, la ressource est indépendante. Vous ne pouvez pas appeler OfferResources1 sur une ressource mappée. Une fois que vous avez proposé une ressource, la ressource ne peut pas être mappée ou liée au pipeline tant que vous n’avez pas appelé la méthode ReclaimResources1 pour récupérer la ressource. Vous ne pouvez pas appeler OfferResources1 pour offrir des ressources immuables.

Pour proposer des ressources partagées, appelez OfferResources1 sur un seul des appareils de partage. Pour garantir un accès exclusif aux ressources, vous devez utiliser un objet IDXGIKeyedMutex , puis appeler OfferResources1 uniquement pendant que vous conservez le mutex. En fait, vous ne pouvez pas proposer de ressources partagées, sauf si vous utilisez IDXGIKeyedMutex , car l’offre de ressources partagées sans utiliser IDXGIKeyedMutex n’est pas prise en charge.

Le pilote d’affichage en mode utilisateur peut ne pas proposer immédiatement les ressources que vous avez spécifiées dans un appel à OfferResources1. Le pilote peut différer leur offre jusqu’à l’appel suivant à IDXGISwapChain::P resent, IDXGISwapChain1::P resent1 ou ID3D11DeviceContext::Flush.

Exemples

Une application basée sur UWP est suspendue en arrière-plan et souhaite proposer ses ressources graphiques au système, au cas où une autre application les souhaite. L’application récupère ces ressources à la reprise. L’application se rend également compte que la validation système totale disponible est faible sur cette plateforme et qu’elle est prête à autoriser la suppression de ses ressources de la validation système. Si le processus de récupération échoue parce que le système manque de mémoire, l’application gère la condition d’erreur.

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

Spécifications

   
Plateforme cible Windows
En-tête dxgi1_5.h
Bibliothèque Dxgi.lib
DLL Dxgi.dll

Voir aussi

DXGI_RECLAIM_RESOURCE_RESULTS

IDXGIDevice4