我有一台带有两张显卡的笔记本电脑:集成的英特尔显卡和一张 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,我怎么能写出稳定的应用程序,然后就挂了?我应该怎么做才能防止这种情况发生?我的理论错了吗?
挂起发生在 Map 调用期间。
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);