IDXGIDevice4::OfferResources1, méthode (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 DXGI_OFFER_RESOURCE_PRIORITY typée qui indique la valeur des données précieuses.

[in] Flags

Type : UINT

Spécifie la 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 (extension de l’API IDXGIDevice2::OfferResources ) permet aux applications D3D de valider le 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é-validée ne peut pas être réutilisée, de sorte que l’inscription au nouvel indicateur de DXGI_OFFER_RESOURCE_FLAG_ALLOW_DECOMMIT signifie que 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 de manière interchangeable 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 le 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 faible priorité avant d’ignorer une ressource proposée avec une priorité plus élevée.

Si vous appelez OfferResources1 pour offrir une ressource pendant que la ressource est liée au pipeline, la ressource n’est pas liée. 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 jusqu’à ce que vous appeliez la méthode ReclaimResources1 pour récupérer la ressource. Vous ne pouvez pas appeler OfferResources1 pour offrir des ressources immuables.

Pour offrir des ressources partagées, appelez OfferResources1 sur un seul des appareils de partage. Pour garantir l’accès exclusif aux ressources, vous devez utiliser un objet IDXGIKeyedMutex , puis appeler OfferResources1 uniquement pendant que vous maintenez 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 les reporter 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 offrir ses ressources graphiques au système, en cas d’autre application qui les souhaite. L’application récupère ces ressources lorsqu’elle reprend. L’application réalise également que la validation système disponible totale est petite sur cette plateforme et est prête à autoriser ses ressources à être supprimées de la validation système. Si le processus de récupération échoue, car le système est hors 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); 
        } 
    } 
} 

Configuration requise

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

Voir aussi

DXGI_RECLAIM_RESOURCE_RESULTS

IDXGIDevice4