glDrawTransformFeedbackStream не работает на Mac с видеокартой Radeon

При использовании объектов обратной связи преобразования в сочетании с glDrawTransformFeedbackStream на видеокарте AMD Radeon R9 M370X ничего не отображается. Он работает при использовании графики Intel iris pro.

Если я использую запрос для получения количества написанных примитивов, он всегда будет возвращать 0 для вызовов glDrawTransformFeedbackStream.

Мои системные характеристики:
Mac OS X 10.12.1
Mac Book Pro 15 дюймов (середина 2015 года)
AMD Radeon R9 M370X 2048 МБ
Intel Iris Pro 1536 МБ

/**
 * This is vertex program code 
 *
 *
 *
 * #version 400 core
 * 
 * uniform bool initialization_run;
 * 
 * in vec4 inPosition;
 * out vec4 outPosition;
 * 
 * void main() {
 *     if (initialization_run) {
 *         float f = float(gl_VertexID) + 1.0;
 *         outPosition = vec4(f, f, f, f);
 *     } else {
 *         outPosition = (2.0 * inPosition);
 *     }
 * }
 */

StackAllocator allocator(MB(6));
const char* vertexCode = FileReader::readCompleteFile("@ENGINE/test.txt", &allocator);
GLuint gProgram = GraphicsProgramUtils::createProgram([](void* context, GLuint program) -> void {
    // This happens before linking
    const char* outputs[] = { "outPosition" };
    checkGL(glBindAttribLocation(program, 0, "inPosition"));
    checkGL(glTransformFeedbackVaryings(program, 1, outputs, GL_INTERLEAVED_ATTRIBS));
}, this, vertexCode, nullptr, nullptr);
GLuint uniformInitializationRun = checkGL(glGetUniformLocation(gProgram, "initialization_run"));

// create the vao and vbo
GLuint transformFeedbackBuffers[2];
// create a buffer with 2 vbo objects and 0 index buffers
_VAO<2, 0> vaos[2];
FOR(i, 2) {
    vaos[i].create();
    vaos[i].setActive();

    // create the buffers
    VBO vbo;
    vbo.create();
    vbo.setActive();
    vbo.fillBuffer(nullptr, 6, (sizeof(F32) * 4), GL_DYNAMIC_COPY);
    vaos[i].setVBO(vbo, [](void) -> void {
        glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, (sizeof(F32) * 4), 0);
        glEnableVertexAttribArray(0);
    }, 0);

    // bind them to the feedback buffer
    checkGL(glGenTransformFeedbacks(1, &(transformFeedbackBuffers[i])));
    checkGL(glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, transformFeedbackBuffers[i]));
    checkGL(glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, vbo._getID()));
}

glEnable(GL_RASTERIZER_DISCARD);
glUseProgram(gProgram);
UI32 r, w;

// initialize the data
r = 0; w = 1;
checkGL(glUniform1i(uniformInitializationRun, 1));
vaos[r].setActive();
checkGL(glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, transformFeedbackBuffers[w]));
checkGL(glBeginTransformFeedback(GL_POINTS));
checkGL(glDrawArrays(GL_POINTS, 0, 6));
checkGL(glEndTransformFeedback());
checkGL(glUniform1i(uniformInitializationRun, 0));

// do tf feedback
std::swap(r, w);
vaos[r].setActive();
checkGL(glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, transformFeedbackBuffers[w]));
checkGL(glBeginTransformFeedback(GL_POINTS));
checkGL(glDrawTransformFeedback(GL_POINTS, transformFeedbackBuffers[r]));
checkGL(glEndTransformFeedback());
checkGL(glUniform1i(uniformInitializationRun, 0));


std::swap(r, w);
vaos[r].setActive();
checkGL(glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, transformFeedbackBuffers[w]));
checkGL(glBeginTransformFeedback(GL_POINTS));
checkGL(glDrawTransformFeedback(GL_POINTS, transformFeedbackBuffers[r]));
checkGL(glEndTransformFeedback());
checkGL(glUniform1i(uniformInitializationRun, 0));


// read the data
F32 vboContent[4*6];
VAO::clearBinding();
vaos[w]._getVBO(0).setActive();
glGetBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(F32)*4*6, vboContent);
FOR(i, 6) { LOGW("vec4(%f, %f, %f, %f)\n", vboContent[i*4+0], vboContent[i*4+1], vboContent[i*4+2], vboContent[i*4+3]); }

glDisable(GL_RASTERIZER_DISCARD);

0 ответов

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