在 glfwDestroyWindow 处提交稀疏纹理的第一页会崩溃

Kai*_*ack 5 c opengl glfw glad

以下 OpenGL/GLFW/GLAD 代码(MCVE 版本)使进程崩溃,并在 nvoglv64.dll 中出现以下访问冲突异常:

0x00007FFC731F586F (nvoglv64.dll) in ConsoleApplication2.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x0000000000024AA8.
Run Code Online (Sandbox Code Playgroud)

glfwDestroyWindow(window)下面的代码清单末尾的调用中,我不知道为什么。glTexPageCommitmentARB当不调用或使用commitof调用它时,此调用不会崩溃GL_FALSE/0

我现在已经阅读了ARB_sparse_texture的规范三遍,检查了每个参数的条件glTexPageCommitmentARB(x,y,z,宽度,高度,内部格式页面大小的深度倍数),我有点确定我已经遵循有关如何正确使用该功能的所有说明。我之前还使用调试上下文和调试消息回调检查了任何 OpenGL 错误,但没有输出。

更多信息:

  • 操作系统:Windows 10 x64 (20H2)
  • 驱动程序:Nvidia 461.09 (DCH)
  • GLAD 配置:OpenGL 4.3 核心 + ARB_sparse_texture + ARB_sparse_texture2
  • GLFW:来自 Git 提交0b9e48fa3df9c18的全新本地 MSVC x64 版本构建

下面代码中调用之前的 fprintfglTexPageCommitmentARB在程序结束时崩溃之前打印以下输出:

256 128 1 32768
Run Code Online (Sandbox Code Playgroud)
0x00007FFC731F586F (nvoglv64.dll) in ConsoleApplication2.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x0000000000024AA8.
Run Code Online (Sandbox Code Playgroud)

我是否在这里遗漏了任何内容,或者只是驱动程序或 GLFW 错误?

wglDeleteContext(...)编辑:更多信息:崩溃发生在主线程调用GL 上下文之后的驱动程序线程 (nvoglv64.dll) 中。当 Visual Studio 2019 调试器因异常而停止时,我可以看到存在三个驱动程序线程(全部来自 nvoglv64.dll)(其中一个发出访问冲突异常),而主线程在wglDeleteContext(...).

EDIT2:对此进行更多实验,当纹理在销毁 GL 上下文之前未取消引用(引用计数为 0)并由驱动程序处理时,总是会发生崩溃。例如,在上面的代码中,当我 glDeleteTextures(1, &tex);在 before调用时glDestroyWindow(window),不会发生崩溃(可重现)。在实际的应用程序中,我提取了上述 MCVE,纹理也作为颜色附件附加在 FBO 中。当我没有删除FBO 而只是减少纹理的引用计数时(通过调用 )glDeleteTextures(...),崩溃仍然会发生。只有当我也取消引用 FBOglDeleteFramebuffers(...)和纹理时,崩溃才不会再发生。