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);