【问题标题】:OpenGL: How is MAX_SHADER_STORAGE_BLOCK_SIZE related to the real limit of SSBO size?OpenGL:MAX_SHADER_STORAGE_BLOCK_SIZE 与 SSBO 大小的实际限制有何关系?
【发布时间】:2018-03-11 22:20:07
【问题描述】:

通过浏览 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 编译器应该如何检查。
  • 只是出于好奇:在着色器中访问 128MB 之后的缓冲区是否会影响输出?
  • 是的,计算着色器用数据填充缓冲区,这些数据由片段着色器渲染,然后也读回主内存并存储到图像文件中。由于图像中的每个像素都具有非零颜色,因此计算着色器显然会触及每个数组元素。

标签: opengl shader-storage-buffer


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢。然后,我将向用户公开“您可以选择尝试使用更大的缓冲区,但您是自己的”设置;-)
猜你喜欢
  • 2015-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
相关资源
最近更新 更多