使用D3D11_RESOURCE_MISC_GDI_COMPATIBLE创建的纹理的IDXGISurface1 GetDC/ReleaseDC的线程安全规则是什么
我可以在另一个线程上的GetDC和ReleaseDC之间与ID3D11Device和ID3D11DeviceContext交互,而不会因为隐式同步而出现数据竞争或阻塞吗?或者我是为了避免GPU空闲而被迫为执行GDI渲染的线程创建单独的D3D11Device,然后通过复制到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. 发布于 2013-02-20 20:57:51
来自MSDN的以下两个要点似乎表明,不仅这个线程不安全,而且当HDC表现出色时,设备的能力也会降低。
从DXGISurface获取HDC本身就涉及到曲面的父D3D11 DC。也不支持对D3D11 DC的多线程访问。在此MSDN页面中:如果多个线程必须访问单个ID3D11DeviceContext,则它们必须使用某种同步机制(如临界区)来同步对该ID3D11DeviceContext的访问。
正如你所说的,我会尝试在一个单独的线程上准备GDI绘图,但将其渲染到系统内存缓冲区中。然后简单地将内容blit到DXGI表面。
还要注意,这些主题中的大多数都解决了直接上下文的行为,D3D11 Deferred Context可能有不同的行为。
https://stackoverflow.com/questions/14682541
复制相似问题