Получение ошибки 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)

И я пробую эти коды в другом устройстве, все в порядке.
Я не знаю, как решить эту проблему, пожалуйста, помогите мне.

0 ответов

Другие вопросы по тегам