OpenGL 4.3 API 和 glsl 语言安全吗?

Is OpenGL 4.3 API and glsl language safe?

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

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

一般来说,当您使用 OpenGL API 时,有很多方法可以使您的程序崩溃。有缺陷的驱动程序是一个你无法完全避免的不幸现实,以创造性的方式滥用 API 可能会导致崩溃而不是错误。事实上,我曾亲自导致计算机在多个平台和不同的 GPU 供应商上完全挂起(无响应),即使使用据称 "safe".

的 WebGL 也是如此。

所以唯一可能的答案是"no, OpenGL is not safe."

调试 OpenGL 的一些技巧:

  • 不要使用glGetError,而是使用KHR_debug(除非它不可用)。

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

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

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

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

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

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