1

通过浏览 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 吗?

4

1 回答 1

1

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

否则,对于绑定用作 SSBO 的缓冲区对象的绑定范围的大小没有限制。因此,就 OpenGL 规范而言,这应该可以工作。

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

于 2018-03-11T23:05:51.547 回答