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

时间:2018-03-11 22:20:08

标签: opengl shader-storage-buffer

从浏览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);

如上所述,像素挂载导致缓冲区大小远远超出MAX_SHADER_STORAGE_BLOCK_SIZE ......

那么,MAX_SHADER_STORAGE_BLOCK_SIZE应该是实际的SSBO大小限制吗?我的驱动程序(mesa radeonsi)只报告错误的数字,或者我是否误解了文档? 可以是未明确调整大小的数组不计入MAX_SHADER_STORAGE_BLOCK_SIZE吗?

1 个答案:

答案 0 :(得分:1)

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

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

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