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.
Anforderungen
Zielplattform | Windows |
Kopfzeile | d3d11.h |
Bibliothek | D3D11.lib |