GetDC/ReleaseDC的IDXGISurface1线程安全/同步规则
IDXGISurface1 thread-safety/synchronization rules for GetDC/ReleaseDC?
对于使用D3D11_RESOURCE_MISC_GDI_COMPATIBLE
创建的纹理,IDXGISurface1
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.
MSDN的以下两个要点似乎表明,这个线程不仅不安全,而且在HDC出色的同时,设备的功能也有所降低。
-
在发出任何新的Direct3D命令之前,必须释放设备(它们指的是HDC)并调用IDXGISurface1::ReleaseDC方法。
-
如果此方法已经创建了未完成的DC,则此方法将失败。
从DXGISurface获取HDC本质上涉及曲面的父D3D11 DC。D3D11 DC的多线程访问也不受支持。来自此MSDN页面:如果多个线程必须访问单个ID3D11DeviceContext,则它们必须使用一些同步机制,例如关键部分,来同步对该ID3D11Device上下文的访问。
正如你所说,我会尝试在一个单独的线程上准备GDI绘图,但将其呈现到系统内存缓冲区。然后简单地将内容blit到DXGI曲面。
还要注意,这些主题中的大多数涉及即时上下文的行为,D3D11延迟上下文可能具有不同的行为。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 虚拟决赛作为安全
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 通过网络、跨平台传递std::变体是否安全
- 松弛原子与无同步情况下的记忆连贯性
- 这种基于线程 ID 的同步是否安全整洁?
- 同步线程安全的API,用于暴露缓存数据
- Qt的事件循环线程是安全的还是原子的?处理"队列连接"时如何同步?
- 读取即将在没有同步的情况下同时增加的int是安全的吗?
- 线程安全关闭同步使用的 boost::asio::ip::tcp::socket
- 此同步对象实现线程是否安全
- 在同一进程中使用的两个模块中具有同步对象的通用名称是否安全
- 使用不同的线程访问不同的子数组而不同步是否安全
- 为什么是同步安全整数
- 是更好的同步或异步从boost asio时,有大量的计算和推/弹出线程安全容器
- GetDC/ReleaseDC的IDXGISurface1线程安全/同步规则
- 如果已知访问顺序是安全的,如何在没有互斥锁的情况下同步线程/CPU