2017-01-13 2 views
0

두 개의 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을 추가하면 함정이 늘어납니다.