首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GetDC/ReleaseDC的IDXGISurface1线程安全/同步规则?

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

Stack Overflow用户
提问于 2013-02-04 16:00:38
回答 1查看 830关注 0票数 7

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

我可以在另一个线程上的GetDCReleaseDC之间与ID3D11DeviceID3D11DeviceContext交互,而不会因为隐式同步而出现数据竞争或阻塞吗?或者我是为了避免GPU空闲而被迫为执行GDI渲染的线程创建单独的D3D11Device,然后通过复制到D3D11Device将其传输回“主”D3D11_RESOURCE_MISC_SHARED_KEYED_MUTEX吗?

也就是说,以下条件是否有效?

代码语言:javascript
复制
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. 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-20 20:57:51

来自MSDN的以下两个要点似乎表明,不仅这个线程不安全,而且当HDC表现出色时,设备的能力也会降低。

  • 在发出任何新的Direct3D命令之前,您必须释放设备(它们指的是硬盘驱动器)并调用IDXGISurface1::ReleaseDC方法。
  • 如果已通过此方法创建了一个未完成的DC,则此方法将失败。

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

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

还要注意,这些主题中的大多数都解决了直接上下文的行为,D3D11 Deferred Context可能有不同的行为。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14682541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档