Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Directx 为什么在主图形卡上运行着色器时MRT渲染失败?_Directx_Direct3d_Directx 11_Direct3d11 - Fatal编程技术网

Directx 为什么在主图形卡上运行着色器时MRT渲染失败?

Directx 为什么在主图形卡上运行着色器时MRT渲染失败?,directx,direct3d,directx-11,direct3d11,Directx,Direct3d,Directx 11,Direct3d11,我有一台带有两块显卡的笔记本电脑:集成Intel one和NVidia GeForce 610M卡。我使用MRT使用Direct3D 11(使用D3D_功能_级别_11_0)执行一些GPGPU任务。我有混合的问题(图形卡应该支持像素后着色器混合),以及一个非常奇怪的行为 P>如果启用混合,Windows就开始了,集成图形卡作为首选显卡,运行英伟达的渲染一切都如期完成。 如果启用混合,Windows启动,英伟达图形卡作为首选图形卡并运行NVIDIA上的渲染,图形驱动程序挂起;d3d11调试层已启

我有一台带有两块显卡的笔记本电脑:集成Intel one和NVidia GeForce 610M卡。我使用MRT使用Direct3D 11(使用D3D_功能_级别_11_0)执行一些GPGPU任务。我有混合的问题(图形卡应该支持像素后着色器混合),以及一个非常奇怪的行为

<> P>如果启用混合,Windows就开始了,集成图形卡作为首选显卡,运行英伟达的渲染一切都如期完成。 <英伟达>如果启用混合,Windows启动,英伟达图形卡作为首选图形卡并运行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);
D3D11_TEXTURE3D_DESC td={};
纹理->获取描述(&td);
td.BindFlags=0;
td.Usage=D3D11_Usage_STAGING;
td.CPUAccessFlags=D3D11\u CPU\u访问\u读取;
结果.调整大小(td.Width*td.Height*td.Depth);
CComPtr tex3d;
HRESULT hr=device->CreateTexture3D(&td、nullptr和&tex3d);
如果(失败(小时))
{
投掷人力资源;
}
D3D11_映射_子资源ms={};
上下文->复制资源(tex3d,纹理);

在任何支持功能级别11的系统上,操作系统都会虚拟化GPU内存,这样,如果您过度使用,事情就会变慢,但它们不应该挂起。您是否尝试过更新视频驱动程序?还有,挂起发生在哪里?是抽签吗?派遣?此外,除非您明确禁用它,否则GPU挂起应该会导致错误。这是发生了还是只是硬挂起?它发生在映射暂存缓冲区(我在其中复制了一个渲染目标)期间。未启用混合时,复制工作正常。该错误类似于TDR,但不是TDR。错误消息显示在气泡中,表示“Diplay驱动程序停止工作并已恢复。显示驱动程序NVIDIA内核模式驱动程序版本327.02停止响应并已成功恢复”。我想我有最新的司机。我将在原始问题中添加一段代码。是否确实启用了调试层?如果驱动程序正在崩溃(伴随着“停止工作”消息),您至少应该按照
D3D11:Removing Device
得到一条调试消息,然后指出这可能是应用程序的错误还是驱动程序的错误。是的,如果我故意出错,错误将显示在调试窗口中。我还试着在参考设备上运行我的代码,它工作得很完美(但正如预期的那样非常慢)。我的项目相当复杂,但我将在周末汇编一个最小的失败代码,并将其发布在这里。@WebMonster
挂起发生在Map调用期间