编组D3D11Device和D3D11DeviceContext对象

时间:2014-02-13 23:01:56

标签: c++ multithreading com marshalling direct3d11

This article说:

  

ID3D11DeviceContext方法(存在于其上的方法除外)   ID3D11DeviceChild)不是自由线程的,也就是说,它们需要单个   穿线。只有一个线程可以安全地调用它的任何方法   (一次绘制,复制,映射等)。

我想知道我是否可以让COM为我做ID3D11DeviceContext同步。

假设我这样做(简化代码):

CoInitializeEx( NULL, COINIT_APARTMENTTHREADED );
// Create D3D11Device
CComPtr<ID3D11DeviceContext> pD3D11DeviceContext;
pD3D11Device->GetImmediateContext(&pD3D11DeviceContext);

然后我要么将其编组:

IStream* pStreamD3D11DeviceContext = NULL;
CComPtr<IUnknown> pUnknownD3D11DeviceContext;
pD3D11DeviceContext->QueryInterface(IID_PPV_ARGS(&pUnknownD3D11DeviceContext));
::CoMarshalInterThreadInterfaceInStream( __uuidof(ID3D11DeviceContext), pUnknownD3D11DeviceContext, &pStreamD3D11DeviceContext );

或者我们是GIT表:

CComPtr<IGlobalInterfaceTable> pIGlobalInterfaceTable;
::CoCreateInstance( CLSID_StdGlobalInterfaceTable, NULL, CLSCTX_INPROC_SERVER, IID_IGlobalInterfaceTable, (void **)&pIGlobalInterfaceTable );
CComPtr<IUnknown> pUnknownD3D11DeviceContext;
DWORD    dwCookieD3D11DeviceContext = 0;
pD3D11DeviceContext->QueryInterface(IID_PPV_ARGS(&pUnknownD3D11DeviceContext));
pIGlobalInterfaceTable->RegisterInterfaceInGlobal( pUnknownD3D11DeviceContext, __uuidof(ID3D11DeviceContext), &dwCookieD3D11DeviceContext );

不幸的是,这似乎不起作用。 CoMarshalInterThreadInterfaceInStream返回REGDB_E_IIDNOTREG0x80040155, Interface not registered),pStreamD3D11DeviceContext仍为NULL。

GIT方法更进了一步。我得到了cookie,但是当我尝试在另一个MTA线程上使用它时,GetInterfaceFromGlobal返回E_INVALIDARG。

CComPtr<ID3D11DeviceContext> pD3D11DeviceContext;
hresult = pIGlobalInterfaceTable->GetInterfaceFromGlobal( dwCookieD3D11DeviceContext, __uuidof(ID3D11DeviceContext), (void**)&pD3D11DeviceContext );

GetInterfaceFromGlobal的参数似乎没问题,我测试了将指针放回原始线程并且它有效。

D3D11DeviceD3D11DeviceContext似乎是无编组的。显然我既没有代理DLL也没有d3d11的类型库。

我错过了什么吗?

谢谢。

0 个答案:

没有答案