IDXGISurface1 的 GetDC/ReleaseDC 方法的线程安全/同步规则是什么?

7
对于使用 D3D11_RESOURCE_MISC_GDI_COMPATIBLE 创建的纹理,ID3D11Surface1 的 GetDC/ReleaseDC 的线程安全规则是什么?
在 GetDC 和 ReleaseDC 之间,我可以与另一个线程交互 ID3D11Device 和 ID3D11DeviceContext,而不会出现数据竞争或因隐式同步而阻塞吗?还是应该避免 GPU 空闲强制为执行 GDI 渲染的线程创建单独的 D3D11Device,并通过复制到 D3D11_RESOURCE_MISC_SHARED_KEYED_MUTEX 将其传回到“主”D3D11Device?
即以下是否有效?
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. 
1个回答

1
以下来自MSDN的两个要点似乎表明,不仅该线程不安全,而且在HDC处于未完成状态时会减少设备的能力。
  • 在发出任何新的Direct3D命令之前,必须释放设备(指HDC)并调用IDXGISurface1::ReleaseDC方法。

  • 如果此方法已经创建了一个未完成的DC,则此方法失败。

从DXGISurface获取HDC固有地涉及表面的父D3D11 DC。对D3D11 DC的多线程访问也不受支持。从MSDN页面得知:如果多个线程必须访问单个ID3D11DeviceContext,则必须使用某些同步机制(例如临界区)来同步访问该ID3D11DeviceContext。

我会尝试按照您所说的,在单独的线程上准备GDI绘图,但将其呈现到系统内存缓冲区。然后只需将内容复制到DXGI表面即可。
此外,请注意大多数这些主题都涉及即时上下文的行为,D3D11延迟上下文可能具有不同的行为。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接