ID3D11Device::OpenSharedResource
デバイス上に作成した共有リソースに他のデバイスからアクセスできるようにします。
HRESULT
OpenSharedResource(
HANDLE hResource,
REFIID ReturnedInterface,
void **ppResource
);
パラメータ
- hResource
リソース ハンドルです。「解説」を参照してください。 - ReturnedInterface
リソース インターフェイスのグローバル一意識別子 (GUID) です。「解説」を参照してください。 - ppResource
アクセスを取得するリソースへのポインターのアドレスです。
戻り値
このメソッドは、「Direct3D 11 のリターン コード」のいずれかを返します。
解説
リソースへのインターフェイスの REFIID、または GUID は、__uuidof() マクロを使用して取得できます。たとえば、__uuidof(ID3D11Buffer) は、バッファー リソースへのインターフェイスの GUID を取得します。
リソースの一意のハンドルの取得方法は、リソースを最初に作成したデバイスの種類によって異なります。
ID3D11Device インターフェイスを使用して作成したリソースを 2 つの Direct3D 11 デバイス間で共有するには、そのリソースの作成で D3D11_RESOURCE_MISC_SHARED フラグを指定している必要があります。DXGI デバイス インターフェイスを使用して作成したリソースは必ず共有されます。
リソースへのインターフェイスの REFIID、または GUID は、__uuidof() マクロを使用して取得できます。たとえば、__uuidof(ID3D11Buffer) は、バッファー リソースへのインターフェイスの GUID を取得します。
Direct3D 10 と Direct3D 11 の 2 つの デバイス間でリソースを共有している場合、IDXGIResource インターフェイスについてそのリソースをクエリした後、GetSharedHandle を呼び出すと、そのリソースの一意のハンドルを取得できます。
IDXGIResource* pOtherResource(NULL); hr = pOtherDeviceResource->QueryInterface( __uuidof(IDXGIResource), (void**)&pOtherResource ); HANDLE sharedHandle; pOtherResource->GetSharedHandle(&sharedHandle);
共有可能なリソースは、2D の非ミップマップ テクスチャーのみです。
Direct3D 9 デバイスと Direct3D 11 デバイスとの間でリソースを共有するには、CreateTexture の pSharedHandle 引数を使用してテクスチャーを作成している必要があります。共有された Direct3D 9 ハンドルは hResource 引数で OpenSharedResource に渡されます。
次のコードは関連するメソッド呼び出しを示しています。
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
D3D9 から D3D11 までの間で共有するテクスチャーには、以下の制限があります。
- テクスチャーは 2D であることが必要です。
- 使用できるミップ レベルは 1 つのみです。
- テクスチャーには既定の使用法があることが必要です。
- テクスチャーは書き込み専用にする必要があります
- MSAA テクスチャーは使用できません
- バインド フラグには、SHADER_RESOURCE および RENDER_TARGET が設定されている必要があります
- R10G10B10A2_UNORM、R16G16B16A16_FLOAT、および R8G8B8A8_UNORM の各フォーマットのみが使用できます
共有しているテクスチャーを共有元のいずれかのデバイスで更新する場合、そのデバイスで ID3D11DeviceContext::Flush を呼び出す必要があります。
要件
ヘッダー: D3D11.h 宣言
ライブラリ: D3D11.lib 内容