我有一台带有两块显卡的笔记本电脑:集成的Intel显卡和NVidia GeForce 610M显卡。我使用MRT使用Direct3D 11(使用D3D_FEATURE_LEVEL_11_0)执行一些GPGPU任务。我有混合问题(显卡应支持后像素着色器混合),以及一个非常奇怪的行为。
如果启用了混合,则启动Windows,将集成显卡选为首选显卡,并在NVidia上运行渲染,一切正常。
如果启用了混合,并且启动了Windows,并选择NVidia显卡作为首选显卡并在Nvidia上运行渲染,则图形驱动程序会挂起; d3d11调试层已启用并正常工作,但我没有收到任何错误。
如果混合被注释掉,一切正常,但我需要混合。我多次测试这些场景。每次更改首选显卡后,我都必须重新启动计算机。
我的理论是,GeForce M610不足以处理Windows和我的应用程序(Windows使用自己的资源),这就是为什么当我使用第二种情况时程序挂起;但我怀疑这太不稳定了,实际上是不正确的。如果图形卡API支持D3D_FEATURE_LEVEL_11_0,那么我怎么能编写稳定的应用程序,然后挂起?我该怎么做才能防止这种情况发生?我的理论错了吗?
在地图通话期间发生挂起。
D3D11_TEXTURE3D_DESC td = {};
texture->GetDesc(&td);
td.BindFlags = 0;
td.Usage = D3D11_USAGE_STAGING;
td.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
result.resize(td.Width * td.Height * td.Depth);
CComPtr<ID3D11Texture3D> tex3d;
HRESULT hr = device->CreateTexture3D(&td, nullptr, &tex3d);
if(FAILED(hr))
{
throw hr;
}
D3D11_MAPPED_SUBRESOURCE ms = {};
context->CopyResource(tex3d, texture);