[英]OpenGL access violation on integrated graphics
抱歉,标题有点模糊,但我收到了一个相当模糊的错误。
我有一个用MSVC编写的C ++项目,该项目使用GLEW和GLFW3,以便可以使用OpenGL 4.3计算着色器。 该项目在装有AMD显卡的台式机上运行出色,但是在装有i5-4300u的笔记本电脑上,我却遇到一个令人困惑的小例外:
在Examples.exe中,在0x00007FFE99113E4A(ig75icd64.dll)处引发了异常:0xC0000005:访问冲突读取位置0x0000000000000028。
每当我调用glDispatchCompute(x,y,z)
后跟glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT)
时,就会发生这种情况。
当我调用此代码时,GLEW和GLFW肯定都已初始化,并且没有得到任何输出:
int glfw_err = glfwInit();
if (glfw_err == GLFW_FALSE)
{
printf("ERROR INITIALIZING GLFW\n");
glfwTerminate();
return;
}
和:
GLenum glew_err = glewInit();
if (glew_err != GLEW_OK) {
printf("ERROR INITIALIZING GLEW: %s\n", glewGetErrorString(glew_err));
return;
}
ig75icd64.dll
提到的ig75icd64.dll
是一个Intel图形驱动程序库,我确实在网上发现了一些损坏的驱动程序,但是重新安装驱动程序似乎并没有修复它。
我确定该项目确实在笔记本电脑上运行过,这表明我已经完成了此任务,但是我无法确认。 英特尔方舟网站还表示,集成显卡应支持OpenGL 4.3
任何帮助将非常感激! 谢谢!
最初,由于努力重新创建产生异常的步骤,我删除了这篇文章。
希望这个答案可以帮助人们面对同样难以发现的错误。
我遇到了访问冲突,因为我在指定的SSBO之外阅读。 Visual Studio可怕地暗示了此异常的实际来源,这使得调试非常困难。
我实际上一直在错误地使用块索引和绑定索引值。 考虑到没有绑定索引,我在着色器程序中使用SSBO的块索引对glBindBufferBase进行了调用,这显然是错误的。
我的理论为什么不在我的AMD GPU上发生,是因为我的块索引和绑定索引恰好可以方便地对齐。
因为我发现很难找到资源,所以这里是我将数据写入索引的SSBO的过程:
GLuint block_index = glGetProgramResourceIndex(shader_program, GL_SHADER_STORAGE_BLOCK, "name_of_ssbo");
GLuint ssbo;
glGenBuffers(1, &ssbo);
GLuint binding_index = <number lower than MAX_SHADER_STORAGE_BUFFER_BINDINGS>;
glShaderStorageBlockBinding(shader_program,block_index,binding_index);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(<data>), &<data>[0], GL_STATIC_DRAW);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, binding_index, ssbo);
后跟glDispatchCompute(x,y,z);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.