集成图形上的OpenGL访问冲突

时间:2018-03-19 12:26:08

标签: c++ opengl intel glew compute-shader

对于有点模糊的标题道歉,但我得到了一个非常模糊的错误。

我有一个用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是一个英特尔图形驱动程序库,我确实在网上发现了一些破损的驱动程序,但重新安装我的驱动程序似乎并没有解决它。

我确定该项目确实在我的笔记本电脑上运行了一段时间,这表明我已经采取了一些措施来打破它,但我无法确认这个。英特尔方舟网站也表示集成显卡应该支持OpenGL 4.3

任何帮助将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:0)

最初我删除了这篇文章,因为我努力重新创建产生异常的步骤。

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

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