IDirect3D9 :: CreateDevice导致FPU异常

时间:2018-05-11 13:51:40

标签: exception directx directx-9 fpu

当我调用IDirect3D9 :: CreateDevice时,我得到了FPU​​异常而我的应用程序崩溃了("浮点除以零")。

自Windows 10(2018年4月)的最新更新以及具有双显卡(NVIDIA + Intel)的笔记本电脑发生以来。

我们找到了一个临时解决方案 - 当我们的应用程序启动时,通过调用Set8087CW($ 133F)全局禁用我们应用中的所有FPU异常。

我确信我们使用DirectX的代码是正确的,并且我传递给CreateDevice()的参数没有错误。我还将D3DCREATE_FPU_PRESERVE标志传递给CreateDevice()。

任何以前版本的Windows 10或Windows 8/7 / Vista / XP都不会出现此问题。如果手动为我们的应用程序选择英特尔视频卡而不是NVIDIA,也不会出现此问题。

我们的应用程序是用Delphi(Pascal)编写的。

1 个答案:

答案 0 :(得分:0)

documentation for D3DCREATE_FPU_PRESERVE确实说“ Direct3D的部分假设浮点单元异常被屏蔽;取消屏蔽这些异常可能导致未定义的行为”。我想这意味着你过去很幸运;这是“未定义”意味着“过去工作而现在没有”的情况之一。

Floating point exceptions基本上导致任何从有限值产生NaN或无限值的操作(最常见的是除以零)。

如果它发生在一个驱动程序/ GPU组合而不是另一个驱动程序/ GPU组合上,则在某些极端情况下,驱动程序/ GPU可能会以不同方式进行舍入。留意边缘值 - 例如,非常小的值乘以非常大的值。例如(x * 1e10 + y)/ 1e10可能在某些情况下导致零,这可能允许除以零错误进入。这种调试可能非常烦人但是处理各种各样的现实的一部分GPU。