7

IDXGISurface1 GetDC/ReleaseDC使用 创建的纹理的线程安全规则是D3D11_RESOURCE_MISC_GDI_COMPATIBLE什么?

我是否可以在另一个线程之间进行交互,ID3D11Device而不会由于隐式同步而导致数据争用或阻塞?或者我是为了避免 GPU 空闲被迫为执行 GDI 渲染的线程创建一个单独的线程,然后通过复制将其传输回“主” ?ID3D11DeviceContextGetDCReleaseDCD3D11DeviceD3D11DeviceD3D11_RESOURCE_MISC_SHARED_KEYED_MUTEX

即以下有效吗?

thread 1:

D3D11Device::CreateTexture2D // Create texture 1

IDXGISurface1::GetDC // Get DC for texture 1

... // Draw to texture1 using GDI

IDXGISurtface1::ReleaseDC // Release DC for texture1

thread 2:

// Is this valid if thread 1 is drawing using GDI?

D3D11DeviceContext::OMSetRenderTargets

D3D11DeviceContext::Draw // Draw texture2. 
4

1 回答 1

1

来自MSDN的以下两个要点似乎表明,该线程不仅不安全,而且在 HDC 非常出色时,设备的功能也会有所下降。

  • 在发出任何新的 Direct3D 命令之前,您必须释放设备(它们指的是 HDC)并调用 IDXGISurface1::ReleaseDC 方法。

  • 如果此方法已创建未完成的 DC,则此方法将失败。

从 DXGISurface 获取 HDC 本质上涉及到表面的父 D3D11 DC。也不支持 D3D11 DC 的多线程访问。来自此MSDN页面:如果多个线程必须访问单个 ID3D11DeviceContext,它们必须使用一些同步机制(例如临界区)来同步对该 ID3D11DeviceContext 的访问。

如您所述,我将尝试在单独的线程上准备 GDI 绘图,但将其渲染到系统内存缓冲区。然后简单地将内容传送到 DXGI 表面。

另请注意,这些主题中的大多数都涉及直接上下文的行为,D3D11 延迟上下文可能具有不同的行为。

于 2013-02-20T12:57:50.880 回答