ID3D11Device::OpenSharedResource-Methode (d3d11.h)

Gewähren Sie einem Gerät Zugriff auf eine freigegebene Ressource, die auf einem anderen Gerät erstellt wurde.

Syntax

HRESULT OpenSharedResource(
  [in]            HANDLE hResource,
  [in]            REFIID ReturnedInterface,
  [out, optional] void   **ppResource
);

Parameter

[in] hResource

Typ: HANDLE

Ein Ressourcenhandle. Siehe Bemerkungen.

[in] ReturnedInterface

Typ: REFIID

Der globally unique Identifier (GUID) für die Ressourcenschnittstelle. Siehe Bemerkungen.

[out, optional] ppResource

Typ: void**

Adresse eines Zeigers auf die Ressource, auf die wir Zugriff erhalten.

Rückgabewert

Typ: HRESULT

Diese Methode gibt einen der folgenden Direct3D 11-Rückgabecodes zurück.

Hinweise

Die REFIID oder GUID der Schnittstelle zur Ressource kann mithilfe des Makros __uuidof() abgerufen werden. Beispielsweise ruft __uuidof(ID3D11Buffer) die GUID der Schnittstelle zu einer Pufferressource ab.

Der eindeutige Handle der Ressource wird je nach Dem Typ des Geräts, das die Ressource ursprünglich erstellt hat, unterschiedlich abgerufen.

Um eine Ressource zwischen zwei Direct3D 11-Geräten zu teilen, muss die Ressource mit dem D3D11_RESOURCE_MISC_SHARED-Flag erstellt worden sein, wenn sie mithilfe der ID3D11Device-Schnittstelle erstellt wurde. Wenn sie mithilfe einer DXGI-Geräteschnittstelle erstellt wurde, wird die Ressource immer freigegeben.

Die REFIID oder GUID der Schnittstelle zur Ressource kann mithilfe des Makros __uuidof() abgerufen werden. Beispielsweise ruft __uuidof(ID3D11Buffer) die GUID der Schnittstelle zu einer Pufferressource ab.

Beim Freigeben einer Ressource zwischen zwei Direct3D 10/11-Geräten kann das eindeutige Handle der Ressource abgerufen werden, indem die Ressource für die IDXGIResource-Schnittstelle abgefragt und dann GetSharedHandle aufgerufen wird.


IDXGIResource* pOtherResource(NULL);
hr = pOtherDeviceResource->QueryInterface( __uuidof(IDXGIResource), (void**)&pOtherResource );
HANDLE sharedHandle;
pOtherResource->GetSharedHandle(&sharedHandle);
      

Die einzigen Ressourcen, die freigegeben werden können, sind 2D-Texturen ohne Mipmappen.

Um eine Ressource zwischen einem Direct3D 9-Gerät und einem Direct3D 11-Gerät freizugeben, muss die Textur mit dem pSharedHandle-Argument von CreateTexture erstellt worden sein.
Das freigegebene Direct3D 9-Handle wird dann im Argument hResource an OpenSharedResource übergeben.

Der folgende Code veranschaulicht die beteiligten Methodenaufrufe.


sharedHandle = NULL; // must be set to NULL to create, can use a valid handle here to open in D3D9 
pDevice9->CreateTexture(..., pTex2D_9, &sharedHandle); 
... 
pDevice11->OpenSharedResource(sharedHandle, __uuidof(ID3D11Resource), (void**)(&tempResource11)); 
tempResource11->QueryInterface(__uuidof(ID3D11Texture2D), (void**)(&pTex2D_11)); 
tempResource11->Release(); 
// now use pTex2D_11 with pDevice11   
      

Für Texturen, die von D3D9 bis D3D11 freigegeben werden, gelten die folgenden Einschränkungen.

  • Texturen müssen 2D sein
  • Nur 1 mip-Ebene ist zulässig.
  • Textur muss standardmäßig verwendet werden
  • Textur darf nur schreibbar sein
  • MSAA-Texturen sind nicht zulässig
  • Bindungsflags müssen SHADER_RESOURCE und RENDER_TARGET festgelegt haben
  • Nur R10G10B10A2_UNORM-, R16G16B16A16_FLOAT- und R8G8B8A8_UNORM-Formate sind zulässig.
Wenn eine freigegebene Textur auf einem Gerät aktualisiert wird , muss ID3D11DeviceContext::Flush auf diesem Gerät aufgerufen werden.

Anforderungen

   
Zielplattform Windows
Kopfzeile d3d11.h
Bibliothek D3D11.lib

Weitere Informationen

ID3D11Device