集成显卡上的 OpenGL 访问冲突

OpenGL access violation on integrated graphics

抱歉标题有点模糊,但我遇到了一个非常模糊的错误。

我有一个用 MSVC 编写的 C++ 项目,它使用 GLEW 和 GLFW3,这样我就可以使用 OpenGL 4.3 计算着色器。该项目 运行 在配备 AMD 显卡的台式机上表现出色,但在配备 i5-4300u 的笔记本电脑上我遇到了一个令人困惑的小异常:

Exception thrown at 0x00007FFE99113E4A (ig75icd64.dll) in Examples.exe: 0xC0000005: Access violation reading location 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 是一个英特尔图形 driver 库,我确实在网上发现了一些关于损坏的 drivers 的提及,但重新安装了我的 drivers好像没修好。

我确定该项目在某些时候确实 运行 在我的笔记本电脑上,这表明我已经做了一些破坏它的事情,但我无法证实这一点。英特尔方舟官网也说集成显卡应该支持OpenGL 4.3

如有任何帮助,我们将不胜感激!谢谢!

最初我删除了这个 post 因为我努力重新创建产生异常的步骤。

希望这个答案可以帮助面临同样难以追踪错误的人们。

我遇到了访问冲突,因为我在我指定的 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);