G
G
Gleb Igumnov2017-02-06 10:51:05
C++ / C#
Gleb Igumnov, 2017-02-06 10:51:05

What are the size limits for GL_SHADER_STORAGE_BUFFER?

I write ray tracing in OpenGL using compute shaders, I use buffers to transfer data.
When the size of the output buffer (consists of vec2, the size is respectively the number of rays * the number of triangles) exceeds about 30Mb, an attempt to map the buffer to the application memory stably and reproducibly returns NULL, as well as an attempt to map only part of the buffer.
In the documentation, I did not find information about the limitation on the size of GL_SHADER_STORAGE_BUFFERs, could the reason be something else than being too large, and is there any way to get around this, except by calling the shader multiple times with less input data?
Data declaration in the shader itself:

#version 440
layout(std430, binding=0) buffer rays{
    vec4 r[];
};
layout(std430, binding=1) buffer faces{
    vec4 f[];
};
layout(std430, binding=2) buffer outputs{
    vec2 o[];
};
uniform int face_count;
uniform vec4 origin;

Program code (wrappers from Qt5 are used)
QOpenGLBuffer ray_buffer;
QOpenGLBuffer face_buffer;
QOpenGLBuffer output_buffer;

QVector<QVector2D> output;

output.resize(rays[r].size()*faces.size());

if(!ray_buffer.create()) { /*...*/ }
if(!ray_buffer.bind()) { /*...*/ }
ray_buffer.allocate(rays.data(), rays.size()*sizeof(QVector4D));

if(!face_buffer.create()) { /*...*/ }
if(!face_buffer.bind()) { /*...*/ }
face_buffer.allocate(faces.data(), faces.size()*sizeof(QVector4D));

if(!output_buffer.create()) { /*...*/ }
if(!output_buffer.bind()) { /*...*/ }

output_buffer.allocate(output.size()*sizeof(QVector2D));

ogl->glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, ray_buffer.bufferId());
ogl->glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, face_buffer.bufferId());
ogl->glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, output_buffer.bufferId());

int face_count = faces.size();

compute.setUniformValue("face_count", face_count);
compute.setUniformValue("origin", pos);

ogl->glDispatchCompute(rays.size()/256, faces.size(), 1);

ray_buffer.destroy();
face_buffer.destroy();
QVector2D* data = (QVector2D*)output_buffer.map(QOpenGLBuffer::ReadOnly);

Answer the question

In order to leave comments, you need to log in

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question