Получение ошибки GL_OUT_OF_MEMORY при вызове glMapBufferRange для SSBO
Я задал странный вопрос, который сводит меня с ума.
На Android я использую SSBO для ввода и вывода данных в вычислительном шейдере openGLES3.1.
Вот мои коды:
// NDK
GLuint gen_buffer(GLenum target, GLenum usage, GLsizei size, const void *data)
{
GLuint buffer;
glGenBuffers(1, &buffer);
glBindBuffer(target, buffer);
glBufferData(target, size, data, usage);
glBindBuffer(target, 0);
return buffer;
}
input_ssbo = gen_buffer(GL_SHADER_STORAGE_BUFFER, GL_DYNAMIC_DRAW, 2458624 * sizeof(float), input_data);
output_ssbo = gen_buffer(GL_SHADER_STORAGE_BUFFER, GL_DYNAMIC_DRAW, 1024 * sizeof(float), NULL);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, input_ssbo);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, output_ssbo);
glDispatchCompute(1024, 1, 1);
glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);
//GLSL
#version 310 es
layout(local_size_x = 64) in;
layout(binding = 0) readonly buffer Input {
float data[];
} input0;
layout(binding = 1) writeonly buffer Output {
float data[];
} output0;
void main()
{
uint idx = gl_GlobalInvocationID.x;
output0.data[idx] = input0.data[idx];
}
Как вы, ребята, видите, это очень просто, но при вызове glMapBufferRange выдает ошибку Out Of Memory:
glBindBuffer(GL_SHADER_STORAGE_BUFFER, output_ssbo);
float *out = (float *)malloc(1024 * sizeof(float));
float* buffer = (float*)glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, 1024 * sizeof(float), GL_MAP_READ_BIT);// buffer is NULL
GLenum err = glGetError(); // err is GL_OUT_OF_MEMORY(0x0505)
И я пробую эти коды в другом устройстве, все в порядке.
Я не знаю, как решить эту проблему, пожалуйста, помогите мне.