GetXD/ReleaseDC的IDXGISurface1线程安全/同步规则?

ron*_*nag 7 c++ direct3d thread-safety dxgi

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

我可以交互ID3D11Device和ID3D11DeviceContext之间GetDC,并ReleaseDC在另一个线程,没有数据争或因阻止隐式同步?或者我是为了避免GPU空转被迫为D3D11Device执行GDI渲染的线程创建一个单独的,然后D3D11Device通过复制到"主"将其传回D3D11_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. 
Run Code Online (Sandbox Code Playgroud)

Unk*_*987 1

MSDN中的以下两个要点似乎表明,该线程不仅不安全,而且在 HDC 表现出色的同时,设备的功能也会降低。

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

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

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

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

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