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

在DirectX 11中跨适配器传输纹理,directx,textures,gpu,nvidia,directx-11,Directx,Textures,Gpu,Nvidia,Directx 11,我用桌面复制API从一个GPU捕获桌面,需要将纹理(在GPU内存中)复制到另一个GPU。为此,我有一个捕获线程,该线程获取桌面映像,然后使用ID3D11DeviceContext::CopyResource将其复制到临时资源(在同一设备上创建)。然后,我将登台资源映射为Read,将目标动态资源(在另一个设备上创建)映射为WriteDiscard,并复制数据。在渲染线程上,我从动态纹理到最终渲染目标执行ID3D11DeviceContext::CopyResource 这是可行的,但我会在一段时间

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

这是可行的,但我会在一段时间后(通常在30秒内)在nvwgf2umx.dll(异常代码:0xc000005)中得到一个随机崩溃。这两个设备都是在没有单线程创建标志的情况下创建的。我做了一些研究,似乎是最好的方法


你知道是什么导致了这次车祸吗?它是否是英伟达驱动程序特有的一个bug?

< p>你必须与你正在使用的其他设备查询共享资源的接口。这在C#中看起来是这样的(我猜您在C++中使用的是给定代码片段之外的其他代码)

var sharedResource=aquiredDesktopTexture11.QueryInterface();
var sharedSurfDesktop=device11.OpenSharedResource(sharedResource.SharedHandle);

..WARE AquiredDesktOpterxture11是原始捕获中的复制资源,然后sharedSurfDesktop可由其他设备使用。还要确保使用是互斥的。

我已经这样做了。我只是觉得在当前的Nvidia驱动程序中有一个动态纹理的bug。我将向他们提交一个复制该问题的示例项目。在访问桌面复制纹理时,我在线程之间(但在同一gpu上)出现了相同的偶然错误,但没有以完全互斥的访问方式处理资源@guygodin:为了解决我们之前讨论过的旧AquireNextFrame(-1)/同步问题,我从您的最新版本中了解到,您解决了错误。这只是通过nVidia驱动程序更新的魔法,还是您在代码中以不同的方式处理它?这是如何解决的更新将是伟大的!
var sharedResource = aquiredDesktopTexture11.QueryInterface<SharpDX.DXGI.Resource>();
var sharedSurfDesktop = device11.OpenSharedResource<SharpDX.Direct3D11.Texture2D>(sharedResource.SharedHandle);