繁体   English   中英

集成显卡上的OpenGL访问冲突

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM