在DirectX 11中跨适配器传输纹理



我正在使用desktop Duplication API从一个GPU捕获桌面,并需要将纹理(在GPU内存中)复制到另一个GPU。为此,我有一个捕获线程,它获取桌面映像,然后使用ID3D11DeviceContext::CopyResource将其复制到临时资源(在同一设备上创建)。然后,我用Read映射临时资源,用WriteDiscard映射目标动态资源(在另一台设备上创建),并复制数据。在渲染线程上,我从动态纹理到最终渲染目标执行ID3D11DeviceContext::CopyResource。

这是可行的,但过一段时间(通常在30秒内),我会在nvwgf2umx.dll中随机崩溃(异常代码:0xc0000005)。这两个设备都是在没有SingleThreaded创建标志的情况下创建的。我做了一些研究,使用动态纹理似乎是最好的方法。

关于车祸的原因有什么想法吗?这可能是英伟达驱动程序特有的错误吗?

您必须查询与正在使用的其他设备共享资源的接口。这在C#中是这样的(我想你在C++中除了给定的片段之外,还真的在使用什么)

var sharedResource = aquiredDesktopTexture11.QueryInterface<SharpDX.DXGI.Resource>();
var sharedSurfDesktop = device11.OpenSharedResource<SharpDX.Direct3D11.Texture2D>(sharedResource.SharedHandle);

获得的DesktopTexture11是原始捕获的复制资源,然后其他设备可以使用sharedSurfDesktop。还要确保使用是互斥的。

最新更新