我正在Linux上使用jogl和OpenGL开发Java图形应用程序。我的应用程序包含30多个着色器,它们在大多数情况下都能正常工作但大约每周一次有一个驱动程序(amdgpu pro)错误(SIGSEGV)。
请告诉我,是OpenGL安全语言:它受到应用程序的错误保护,或者应用程序的错误操作可能会损坏驱动程序的内存(写入别人的内存或数据竞争) 。我在错误的驱动程序(amdgpu pro)或应用程序本身的错误中查找错误(SIGSEGV)的原因是什么? (glGetError显示每个应用程序步骤都很好)。
答案 0 :(得分:4)
通常,在使用OpenGL API时,会有很多方法可以使程序崩溃。 Buggy驱动程序是一个令人遗憾的现实,您无法完全避免,并且以创造性方式滥用API会导致崩溃而不是错误。事实上,我个人已经让计算机在多个平台和不同的GPU供应商上完全挂起(无响应),即使在使用据称“安全”的WebGL时也是如此。
所以唯一可能的答案是“不,OpenGL不安全。”
调试OpenGL的一些提示:
请勿使用glGetError
,而是使用KHR_debug
代替(除非它不可用)。
使用GL_CONTEXT_FLAG_DEBUG_BIT
创建调试上下文。
在测试时使用较少的错误OpenGL实现。根据我的经验,Mesa实现非常稳定。
答案 1 :(得分:3)
OpenGL 4.3“安全”吗?绝对不。你可以做很多事情会导致程序崩溃。例如,从过去的缓冲区边界读取渲染操作。 4.3有很多方法可以做到这一点。
实际上,简单地写一个执行时间太长的着色器会导致GPU失败。
理论上你可以读取由其他应用程序编写的GPU内存,只需从未初始化的缓冲区中读取即可。
没有简单的方法来判断特定崩溃是由驱动程序错误还是由用户错误引起的。您必须对其进行实际调试,并对OpenGL规范有一定的了解才能确定。