opengl 当使用足够大的SSBO时,着色器程序上的操作冻结GL上下文

xuo3flqw  于 2023-06-22  发布在  其他
关注(0)|答案(1)|浏览(138)

我正在计算着色器中进行并行减少。我递归地计算片段块的边界框(从场景渲染产生的G缓冲区开始),然后是边界框块的边界框,依此类推,直到我最终得到一个边界框。
最初我是用一个深度纹理和一个vec2来保存最小和最大深度,我把层次结构存储在SSBO中,如下所示:

// Each tile holds the min and max depth of the subtiles in the level under it.
// Each tile holds 32 items and is 8*4 or 4*8 depending on the level. Conceptually,
// the texDepth texture is level 4.
layout(std430, binding = 5) buffer aabbHierarchy
{
    vec2 level0[8 * 4], // one 8*4 tile
        level1[32 * 32], // 8*4 4*8 tiles
        level2[256 * 128], // 32*32 8*4 tiles
        level3[1024 * 1024]; // 256*128 4*8 tiles
};

最后我遇到了问题,并决定切换到完整的AABB。结构和SSBO的变化如下:

struct AABB
{
    vec4 low, high;
};

layout(std430, binding = 5) buffer aabbHierarchy
{
    AABB level0[8 * 4],
        level1[32 * 32],
        level2[256 * 128],
        level3[1024 * 1024];
};

当然,我相应地改变了与执行实际计算相关的所有内容。
但是现在,当我在这个程序上的glUseProgram之后发出任何调用时,GL上下文都会冻结。glUseProgram调用本身没有任何问题,但是在它挂起我的应用程序之后我所做的任何GL调用。在最初使用vec2时显然没有发生这种情况。
我做了数学计算,我的SSBO是34,636,800字节(使用AABB),这远远小于SSBO块大小限制128 MB。在我的应用程序中,glCheckError没有返回任何0以外的值,我所有的着色器编译、缓冲区分配和纹理创建都可以工作(至少它们没有返回错误)。作为一个额外的好处,分配与AABB相同大小的SSBO,但在着色器中将其用作vec2不会使应用程序冻结。
我在计算着色器中使用OpenGL 4.4上下文和#version 430,没有扩展。这是在华硕RoG fx553vd上运行的,其中包含Nvidia GeForce GTX 1050。
编辑:因为我不能在MCVE中复制,所以它必须与它周围的代码有关。尽管如此,完全缺乏错误报告确实很奇怪。我能够找到引起错误的那一行,并重现了这样一个事实:在这种情况下,任何GL调用(即使是像glGetIntegerv这样简单的调用)都会冻结应用程序。
这是一个很大的项目,所以很抱歉。有问题的行在那里,而项目的根是there。请注意,这是aabbHierarchy分支,而不是master分支。我添加了广泛的跟踪,只是为了清楚地说明程序何时何地崩溃。
编辑2:我添加了一个OpenGL调试上下文,它为我做的只是打印出几行“缓冲区详细信息”,这没有帮助。

neekobn8

neekobn81#

原来是司机的问题。我能够提供一个最小的工作示例,它在我的Nvidia上冻结,但在我的英特尔集成GPU上完美工作。
供将来参考,截至2019年2月6日,Nvidia驱动程序正在使用计算着色器,这些着色器在缓冲区接口块中声明结构数组。这工作得很好:

layout(std430, binding = 0) buffer bleh
{
    vec2 array[100000];
};

但是这将花费5秒来完成执行glUseProgram

struct AABB
{
    vec2 a;
};
layout(std430, binding = 0) buffer bleh
{
    AABB array[100000];
};

我的看起来像冻结,因为我通过一个结构分配了超过30 MB的缓冲区支持的着色器存储,这是一个完全可以做的事情,但看到Nvidia驱动程序需要5秒来处理100 KB,我只能想知道这需要多少时间。
在我的英特尔GPU上,对这两个的glUseProgram调用立即执行。我会尽快向Nvidia报告。

相关问题