首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确定DirectX 11驱动程序挂起原因

如何确定DirectX 11驱动程序挂起原因
EN

Stack Overflow用户
提问于 2013-08-01 21:32:38
回答 1查看 4.8K关注 0票数 4

我正在开发一个QT应用程序,我已经将DirectX 11集成到一个自定义小部件中。应用程序呈现滚动显示--从文件中读取数据的图形表示形式。用户可以加快和减慢滚动速度。

在大多数情况下,这是很好的工作。DirectX 11呈现就像我所期望的那样呈现到我的自定义小部件中。问题是图形驱动程序随机挂起并使我的程序崩溃。我说“随机”是因为我一直在用相同的数据文件测试这一点,而且它似乎从未在文件中的同一点崩溃,在特定的时间之后,或者在特定的滚动速度下(滚动速度越快,GPU每帧所做的工作就越多)。

当应用程序挂起时,我的屏幕会冻结一会儿,变黑,然后返回来自NVidia的一条很好的消息,说明它已经从一次驱动程序崩溃中恢复过来。Visual中的调试输出包含以下内容:

D3D11:移除装置。 D3D11错误: ID3D11Device::RemoveDevice:设备删除是由于以下原因触发的(DXGI_ERROR_DEVICE_HUNG:设备执行命令花费了不合理的时间,或者硬件崩溃/挂起)。因此,触发了TDR (超时值检测和恢复)机制。挂起时,当前设备上下文正在执行命令。应用程序可能希望重新出现并退回到不太积极地使用显示硬件)。执行错误#378: DEVICE_REMOVAL_PROCESS_AT_FAULT

我发现,通过简单地注释掉IDXGISwapChain1 1::Present调用,应用程序将以惊人的速度在文件中运行。图形-它仍然是推数据到GPU和绘制渲染目标,它只是从来没有被显示到我的窗口。

我希望的是帮助了解什么类型的东西会导致司机挂起。我的着色器非常简单-基本上只是使用投影矩阵定位我的顶点。考虑到我在上面一段中所描述的,即使现在还没有被调用,着色器仍然应该通过顶点和像素来运行,是吗?

我怀疑这可能是Qt的兼容性问题--我知道Qt没有正式支持DirectX。因此,我尝试使用CreateWindowEx创建一个单独的窗口,并将其用于交换链,而不是使用自定义Qt小部件。它呈现在那扇窗户上,但也像以前一样挂着司机。

我还怀疑我的笔记本电脑上有一个驱动程序漏洞,所以我试着在一个更强大的桌面PC上运行这个应用程序,它经常运行另一个DirectX 11应用程序(非Qt),没有任何问题(值得一提的是,这个应用程序在滚动显示中也呈现类似的数据,使用的着色器要复杂得多)。但是我的QT应用程序也将驱动程序挂在那台PC上。

有人知道一个方法,我可以得到一个更详细的描述是什么导致司机挂?

谢谢您能提供的任何帮助。

更新: 2013-08-01 17:16 CST I目前正在调查一个可能的线程同步问题,这可能是罪魁祸首。如果我自己解决这件事的话,明天早上还会继续发邮件。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-02 19:27:24

经过今天的一些测试,这似乎是一个线程问题。我已经运行了几次,今天没有图形崩溃。因此,我的问题必须得到解决,除非我只是在今天的测试中感到幸运(或者说是运气不好--如果这在一两天内再次显示出它丑陋的面孔)。

我知道即时设备上下文并不是线程安全的。不过,我没有使用延迟上下文,而是使用关键部分来同步线程和协调设备上下文的使用。我没有意识到的是,在另一个线程使用设备上下文时调用IDXGISwapChain1 1::存在是不安全的。这是有意义的,但由于它不是直接从设备上下文本身调用的,所以我忽略了它。我真的把我现在的()调用移动到了我的关键部分块中,从那以后我就再也没有崩溃过。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18004993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档