Сбой при управлении общими ресурсами OpenGL в многопоточном приложении на GeForce GTX 1060
Похоже на ошибку драйвера, но я не уверен) А может я что-то не так делаю
В моем приложении я использую два разных потока (и два общих контекста) для загрузки и рендеринга данных.
Приложение иногда падает (вероятно, когда рабочая нагрузка выше средней), когда рендерится основной поток (glMultiDrawArraysIndirect
), используя буферы (проблема с GL_DRAW_INDIRECT_BUFFER
Я полагаю) выложил в другой ветке.
какой-то упрощенный псевдокод:
Рабочая нить:
{
...
uploadContext->makeCurrent();
glCreateBuffers(1, &tile.geometryBuf);
glNamedBufferStorage(tile.geometryBuf, geometryBuffer.size(), geometryBuffer.constData(), 0);
glCreateBuffers(1, &tile.indirectBuffer);
glNamedBufferStorage(tile.indirectBuffer, indirectBuffer.size(), indirectBuffer.constData(), 0);
glCreateBuffers(1, &tile.settingsBuffer);//);
glNamedBufferStorage(tile.settingsBuffer, settingsBuffer.size(), settingsBuffer.constData(), 0);
//need this for syncronization between threads
tile.sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
glFlush();
emit tileReady(tile); //send a signal to the main thread
}
Основная тема:
{
.....
renderingContext->makeCurrent();
///sync
GLenum waitReturn = glClientWaitSync(tile.sync, 0, 0);
if (waitReturn != GL_ALREADY_SIGNALED && waitReturn != GL_CONDITION_SATISFIED)
return;
glDeleteSync(tile.sync);
//binding should validate the buffer in rendering context according to specs (but seems that it doesn't)
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, tile.indirectBuffer);
//vao is defined during initialization
//now only change arrayVertexBuffer binding
glVertexArrayVertexBuffer(vao, 0, tile.geometryBuf, 0, 2 * sizeof(float));
glBindVertexArray(vao);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, tile.settingsBuffer);
glMultiDrawArraysIndirect(GL_TRIANGLES, 0, tile.counts, 0);
....
}
Так что иногда он падает так:
(Исключение, выброшенное в 0x000001CD7121F302 в файле viewer.exe: 0xC0000005: расположение чтения нарушения доступа 0x0000000000000100)
если я использую режим отладки, то нет ошибок GL.
Это НЕ вылетает, если:
1) Я использую другой графический процессор (Nvidia Geforce 980 Titan X)
или же
2) я меняю glFlush()
в glFinish()
в теме загрузки
или же
3) я комментирую glMultiDrawArraysIndirect
или же
4) Перед рендерингом с GL_DRAW_INDIRECT_BUFFER
Я вставляю эти строки кода:
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, tile.indirectBuffer);
qint64 sz;
glGetBufferParameteri64v(GL_DRAW_INDIRECT_BUFFER, GL_BUFFER_SIZE, &sz);
(и это занимает около 0,4 мс). Кажется, что нет проблем с SSBO и VertexArrayBuffer.
Конфигурация: Windows 10 Pro, 64-битная GeForce GTX 1060 версия драйвера 416.81