2017-01-13 23 views
0

私は2つのD3D11デバイスを持っていますが、それぞれに独自のコンテキストがありますが、同じアダプタにあります。Direct3D11:デバイス間でテクスチャを共有する:黒いテクスチャ

私は両方のテクスチャを共有しようとしていますが、反対側で受け取ったテクスチャは常に黒です。

HRESULT hr; 

// Make a shared texture on device_A/context_A 
D3D11_TEXTURE2D_DESC desc; 
ZeroMemory(&desc, sizeof(desc)); 
desc.Width = 1024; 
desc.Height = 1024; 
desc.MipLevels = 1; 
desc.ArraySize = 1; 
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; 
desc.SampleDesc.Count = 1; 
desc.SampleDesc.Quality = 0; 
desc.Usage = D3D11_USAGE_DEFAULT; 
desc.CPUAccessFlags = 0; 
desc.MiscFlags = D3D11_RESOURCE_MISC_SHARED; 
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; 
ID3D11Texture2D* copy_tex; 
hr = device_A->CreateTexture2D(&desc, NULL, &copy_tex); 

// Test the texture by filling it with some color 
D3D11_RENDER_TARGET_VIEW_DESC rtvd = {}; 
rtvd.Format = DXGI_FORMAT_R8G8B8A8_UNORM; 
rtvd.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; 
rtvd.Texture2D.MipSlice = 0; 
ID3D11RenderTargetView* copy_tex_view = 0; 
hr = device_A->CreateRenderTargetView(copy_tex, &rtvd, &copy_tex_view); 
FLOAT clear_color[4] = {1, 0, 0, 1}; 
context_A->ClearRenderTargetView(copy_tex_view, clear_color); 

// Now try to share it to device_B: 
IDXGIResource* copy_tex_resource = 0; 
hr = copy_tex->QueryInterface(__uuidof(IDXGIResource), (void**)&copy_tex_resource); 
HANDLE copy_tex_shared_handle = 0; 
hr = copy_tex_resource->GetSharedHandle(&copy_tex_shared_handle); 
IDXGIResource* copy_tex_resource_mirror = 0; 
hr = device_B->OpenSharedResource(copy_tex_shared_handle, __uuidof(ID3D11Texture2D), (void**)&copy_tex_resource_mirror); 
ID3D11Texture2D* copy_tex_mirror = 0; 
hr = copy_tex_resource_mirror->QueryInterface(__uuidof(ID3D11Texture2D), (void**)(&copy_tex_mirror)); 

ただし、copy_tex_mirrorのテクスチャは常に黒です。

私はHRESULTエラーコードを取得せず、通常はdevice_B/context_Bでcopy_tex_mirrorを使用することもできますが、device_Aに貼り付けたピクセルデータは取得できません。

何か不足していますか?

ありがとうございます!

答えて

0

テクスチャが常に黒であることをどのように知っていますか? :-)

GPU操作がDirect3Dによってキューに入れられるため、device_Bに共有リソースを開くと、ClearRenderTargetView()device_Aがまだ実行されていない可能性があります。 ID3D11Device::OpenSharedResource Method上のMSDNライブラリのドキュメントによると:

共有テクスチャが一つのデバイスID3D11DeviceContext::Flushに更新されている場合は、そのデバイス上で呼び出さなければなりません。

作業中のデバイス間で共有テクスチャを実装した場合、このような問題が発生しました。ミックスにD3D9またはOpenGLを追加すると、落とし穴が増えます。

関連する問題