OpenGL:MAX_SHADER_STORAGE_BLOCK_SIZE 与 SSBO 大小的实际限制有何关系?

OpenGL: How is MAX_SHADER_STORAGE_BLOCK_SIZE related to the real limit of SSBO size?

通过浏览 OpenGL 文档,我假设 MAX_SHADER_STORAGE_BLOCK_SIZE 是 SSBO 可能具有的实际大小限制。在我的 GPU 上,此值报告为 128 MB。但是,创建和使用更大的缓冲区(千兆字节)也能正常工作,只要它们适合显存即可。

几行代码来说明:
在我的计算着色器中,通过

访问缓冲区
layout(std430, binding=2) buffer renderedDataRed
{
    uint counts_SSBO[];
};

在 CPU 方面,我正在使用

创建缓冲区
glGenBuffers(1, &drawBuffer);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, drawBuffer);
glBufferData(GL_SHADER_STORAGE_BUFFER, 4 * pixelCount, nullptr, GL_DYNAMIC_COPY);
glClearBufferData(GL_SHADER_STORAGE_BUFFER,GL_R8,GL_RED,GL_UNSIGNED_INT,nullptr);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, drawBuffer);

如前所述,让 pixelCounts 导致缓冲区大小远远超过 MAX_SHADER_STORAGE_BLOCK_SIZE...

效果很好

所以,MAX_SHADER_STORAGE_BLOCK_SIZE 应该是实际的 SSBO 大小限制,而我的驱动程序 (mesa radeonsi) 只是报告了错误的数字,还是我误解了文档? 未明确确定大小的数组是否不计入 MAX_SHADER_STORAGE_BLOCK_SIZE?

最大存储块大小是存储的最大大小:您在 GLSL 中定义的将缓冲区对象挂钩到的东西。由于您的存储块我们完全由可变大小的数组组成,因此它没有定义大小。

对于绑定用作 SSBO 的缓冲区对象,绑定范围的大小没有其他限制。所以就OpenGL规范而言,这应该可行。

话虽如此,我不会依赖它。 Vulkan 等效项明确限制了存储缓冲区的缓冲区描述符中使用的大小。很明显,存在这样的限制。