【问题标题】:IDirect3D9::CreateDevice causes FPU exceptionIDirect3D9::CreateDevice 导致 FPU 异常
【发布时间】:2018-05-11 13:51:39
【问题描述】:

当我调用 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 都不会出现此问题。如果为我们的应用手动选择 Intel 显卡而不是 NVIDIA,也不会出现此问题。

我们的应用是在 Delphi (Pascal) 上编写的。

【问题讨论】:

  • 那么这个异常的调用栈是什么?您使用哪些参数来创建设备?
  • 这很可能是 NVIDIA 驱动程序中的错误。调用堆栈将有助于追踪它。
  • 感谢您的回复。我们使用 Delphi,很难检查异常发生的确切位置。我们只看到例外。

标签: exception directx directx-9 fpu


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的评论。您对文档中的注释是正确的。但是,本文档的早期版本不包含此警告。它是后来我们的代码主要完成时添加的。奇怪的是,一个标志添加了两件事——双精度和 FPU 异常。而且我不知道为什么我需要在基本函数 CreateDevice() 中获取 FPU 异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
  • 2011-06-08
  • 2017-02-16
  • 2018-11-09
相关资源
最近更新 更多