gpt4 book ai didi

c++ - GetDC/ReleaseDC 的 IDXGISurface1 线程安全/同步规则?

转载 作者:可可西里 更新时间:2023-11-01 18:39:40 27 4
gpt4 key购买 nike

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

我可以在另一个线程上的 GetDCReleaseDC 之间与 ID3D11DeviceID3D11DeviceContext 交互,没有数据争用吗还是由于隐式同步而阻塞?或者我是为了避免 GPU 空闲而被迫为执行 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.

最佳答案

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

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

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

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

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

另请注意,这些主题中的大部分都涉及直接上下文的行为,D3D11 Deferred Context可能有不同的行为。

关于c++ - GetDC/ReleaseDC 的 IDXGISurface1 线程安全/同步规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14682541/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com