Отображение SSBO, возвращающее NULL без ошибок - PullRequest
0 голосов
/ 27 сентября 2018

У меня были проблемы с этим в течение последних нескольких дней.Я читал много других SO сообщений и учебников: SO вопрос Учебник Khronos Это простая программа для ознакомления с буферами вычислений, прежде чем я займусь своей более крупной задачей.предполагается, что эта программа запускает только два потока, которые вставляют номер 1 в 1-й элемент буферного массива.

int main() {

    int SIZE = 3;
    float test[] = {0.f, 0.f, 0.f};
    GLuint buf = 0;

    // ... compile, setup code

    glUseProgram(progHandle);

    // some glUniform stuff to modify uniforms in shader

    glGenBuffers (1, &buf);
    glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, buf);
    glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(test), &test, GL_DYNAMIC_DRAW);

    glDispatchCompute(SIZE/2, 1, 1);
    glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);
    glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, 0);

    GLfloat *p = NULL;
    glBindBuffer(GL_SHADER_STORAGE_BUFFER, buf);
    p = (GLfloat *) glMapBuffer(GL_SHADER_STORAGE_BUFFER, GL_READ_ONLY);

    if (p)
        for(int i = 0; i < SIZE; i++)
            test[i] = p[i];
    else
        printf("p is null %d\n", glGetError();

    glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
    glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, 0);
    p = NULL;

    for(int i = 0; i < SIZE; i++)
        std::cout << test[i] << " ";
}

Шейдер:

    #version 430 core

    layout  (local_size_x  =  2)  in;

    layout(std430, binding=0) writeonly buffer res {
        float result[];
    };

    // some uniforms (these arn't being used rn)

    void main(){
        result[0] = 1.0f;
    }

Вывод:

p is null: 0
0 0 0

Я бы ожидал 1 0 0, но по какой-то причине p всегда возвращается ноль и БЕЗ ошибки из glGetError.Если бы был низкий VMem, чем я ожидал бы ошибку NO_MEMORY, но тот факт, что NULL возвращается без ошибок, вызывает недоумение.Тем более, потому что этот код очень похож на связанный пост SO.

Я делаю проверку ошибок по всему коду (во время компоновки, компиляции, связывания), но один никогда не возникает.

...