0

我正在 Linux 上使用 jogl 和 OpenGL 开发 Java 图形应用程序。我的应用程序包含 30 多个着色器,它们在大多数情况下都能正常工作。但大约每周有一次驱动程序 (amdgpu pro) 错误 (SIGSEGV)。

请告诉我,OpenGL 是安全语言吗:它受到应用程序错误的保护,或者应用程序的不正确操作可能导致驱动程序的内存损坏(写入其他人的内存或数据竞争)。在不正确的驱动程序 (amdgpu pro) 或应用程序本身的错误中查找错误 (SIGSEGV) 的原因是什么?(glGetError 显示每个应用程序步骤都很好)。

4

2 回答 2

4

一般来说,当你使用 OpenGL API 时,会有很多方法让你的程序崩溃。错误的驱动程序是您无法完全避免的不幸现实,并且以创造性的方式滥用 API 可能会导致崩溃而不是错误。事实上,我个人导致计算机在多个平台和不同的 GPU 供应商上完全挂起(无响应),即使在使用据称是“安全”的 WebGL 时也是如此。

所以唯一可能的答案是“不,OpenGL 不安全”。

调试 OpenGL 的一些技巧:

  • 不要使用glGetErrorKHR_debug而是使用(除非它不可用)。

  • 使用 . 创建调试上下文GL_CONTEXT_FLAG_DEBUG_BIT

  • 测试时使用错误较少的 OpenGL 实现。根据我的经验,Mesa 的实现非常稳定。

于 2017-09-28T14:08:37.393 回答
3

OpenGL 4.3“安全”吗?绝对不。您可以做很多事情来使程序崩溃。例如,从缓冲区边界读取渲染操作。4.3 有很多方法可以做到这一点。

实际上,简单地编写一个执行时间过长的着色器可能会导致 GPU 故障。

理论上,您可以读取由其他应用程序写入的 GPU 内存,只需从未初始化的缓冲区中读取即可。

没有简单的方法来判断特定崩溃是由驱动程序错误还是由用户错误引起的。您必须实际调试它并对 OpenGL 规范有一定的了解才能确定。

于 2017-09-28T14:35:55.863 回答