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

3
我正在使用桌面复制API从一个GPU捕获桌面并需要将纹理(位于GPU内存中)复制到另一个GPU。为此,我有一个捕获线程,它获取桌面图像,然后使用ID3D11DeviceContext :: CopyResource将其复制到分配在同一设备上的暂存资源中。然后,我使用Read映射该暂存资源,使用WriteDiscard映射目标动态资源(在其他设备上创建),并复制数据。在渲染线程上,我会从动态纹理到最终渲染目标进行ID3D11DeviceContext :: CopyResource。

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

您认为是什么导致了崩溃?可能是Nvidia驱动程序特定的错误吗?


2
我从你们最新的发布中看到,你们解决了这个错误。这是通过nVidia驱动程序更新的魔法吗?还是你们在代码中以不同的方式处理它?关于如何解决这个问题的更新将会很棒! - thewhiteambit
1个回答

0

你必须使用QueryInterface为您正在使用的其他设备共享资源。 在C#中,它看起来像这样(除了在C++中给出的片段之外)

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

..被获取的DesktopTexture11是从原始截图复制的资源,而sharedSurfDesktop可以被其他设备使用。还要确保使用是互斥的。


1
我已经这样做了。我只是认为当前Nvidia驱动程序中存在动态纹理的错误。我将提交一个复制该问题的示例项目给他们。 - Guy Godin
当我在访问桌面复制纹理时,由于没有以完全互斥的方式访问资源,我在线程之间(但在同一GPU上)遇到了相同的偶然错误。@guygodin:为了解决我们谈论过的旧的AquireNextFrame(-1)/ Synchronize问题,请参考https://github.com/sharpdx/SharpDX/issues/515。 - thewhiteambit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接