IDXGIDevice4::OfferResources1-Methode (dxgi1_5.h)

Ermöglicht dem Betriebssystem, den Videospeicher von Ressourcen freizugeben, einschließlich des Verwerfens des Inhalts und des Aufhebens des Commits für den Arbeitsspeicher.

Syntax

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

Parameter

[in] NumResources

Typ: UINT

Die Anzahl der Ressourcen im Argumentarray ppResources .

[in] ppResources

Typ: IDXGIResource*

Ein Array von Zeigern auf IDXGIResource-Schnittstellen für die zu bietenden Ressourcen.

[in] Priority

Typ: DXGI_OFFER_RESOURCE_PRIORITY

Ein DXGI_OFFER_RESOURCE_PRIORITY typisierter Wert, der angibt, wie wertvoll Daten sind.

[in] Flags

Typ: UINT

Gibt die DXGI_OFFER_RESOURCE_FLAGS an.

Rückgabewert

Typ: HRESULT

Diese Methode gibt einen HRESULT-Erfolgs- oder Fehlercode zurück, der E_INVALIDARG enthalten kann, wenn eine Ressource im Array oder die Priorität ungültig ist.

Hinweise

OfferResources1 (eine Erweiterung der ursprünglichen IDXGIDevice2::OfferResources-API ) ermöglicht es D3D-basierten Anwendungen, das Aufheben des Commits des Sicherungsspeichers einer Zuordnung zu ermöglichen, um den Systemcommit bei niedrigen Arbeitsspeicherbedingungen zu reduzieren. Eine De-Commit-Zuordnung kann nicht wiederverwendet werden. Wenn Sie sich also für das neue DXGI_OFFER_RESOURCE_FLAG_ALLOW_DECOMMIT-Flag anmelden, müssen die neuen Ergebnisse der Rückforderung ordnungsgemäß behandelt werden. Sehen Sie sich die Flagbeschreibungen in DXGI_RECLAIM_RESOURCE_RESULTS und das folgende Beispiel an.

OfferResources1 und ReclaimResources1 können nicht austauschbar mit OfferResources und ReclaimResources verwendet werden.

Der Prioritätswert, den der Priority-Parameter angibt, beschreibt, wie wertvoll der Aufrufer den Inhalt betrachtet. Das Betriebssystem verwendet den Prioritätswert, um Ressourcen in der Reihenfolge der Priorität zu verwerfen. Das Betriebssystem verwirft eine Ressource, die mit niedriger Priorität angeboten wird, bevor eine Ressource verworfen wird, die mit einer höheren Priorität angeboten wird.

Wenn Sie OfferResources1 aufrufen, um eine Ressource anzubieten, während die Ressource an die Pipeline gebunden ist, ist die Ressource ungebunden. Sie können OfferResources1 nicht für eine Ressource aufrufen, die zugeordnet ist. Nachdem Sie eine Ressource angeboten haben, kann die Ressource erst dann zugeordnet oder an die Pipeline gebunden werden, wenn Sie die ReclaimResources1-Methode aufrufen, um die Ressource zurückzugeben. Sie können OfferResources1 nicht aufrufen, um unveränderliche Ressourcen anzubieten.

Um freigegebene Ressourcen anzubieten, rufen Sie OfferResources1 nur auf einem der Freigabegeräte auf. Um den exklusiven Zugriff auf die Ressourcen sicherzustellen, müssen Sie ein IDXGIKeyedMutex-Objekt verwenden und dann OfferResources1 nur aufrufen, wenn Sie den Mutex halten. In der Tat können Sie freigegebene Ressourcen nur dann anbieten, wenn Sie IDXGIKeyedMutex verwenden, da das Anbieten freigegebener Ressourcen ohne Verwendung von IDXGIKeyedMutex nicht unterstützt wird.

Der Benutzermodusanzeigetreiber bietet möglicherweise nicht sofort die Ressourcen an, die Sie in einem Aufruf von OfferResources1 angegeben haben. Der Treiber kann das Angebot bis zum nächsten Aufruf von IDXGISwapChain::P resent, IDXGISwapChain1::P resent1 oder ID3D11DeviceContext:Flush verschieben.

Beispiele

Eine UWP-basierte Anwendung wird im Hintergrund angehalten und möchte ihre Grafikressourcen dem System zurückgeben, falls sie von einer anderen Anwendung gewünscht werden. Die Anwendung ruft diese Ressourcen zurück, wenn sie fortgesetzt wird. Die Anwendung erkennt auch, dass der gesamte verfügbare Systemcommit auf dieser Plattform gering ist, und ist bereit, die Ressourcen aus dem Systemcommit zu entfernen. Wenn beim Rückforderungsprozess ein Fehler auftritt, weil das System nicht genügend Arbeitsspeicher hat, verarbeitet die Anwendung die Fehlerbedingung.

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

Anforderungen

   
Zielplattform Windows
Kopfzeile dxgi1_5.h
Bibliothek Dxgi.lib
DLL Dxgi.dll

Weitere Informationen

DXGI_RECLAIM_RESOURCE_RESULTS

IDXGIDevice4