Open GL: многопоточный glFlushMappedBufferRange?

Я знаю, что многопоточный OpenGL — деликатная тема, и я не пытаюсь здесь выполнять рендеринг из нескольких потоков. Я также не пытаюсь создавать несколько контекстов и делиться объектами с помощью списков общего доступа. У меня есть один контекст, и я выдаю команды рисования и изменения состояния gl только из основного потока.

Однако я динамически обновляю части VBO в каждом кадре. Я пишу только в VBO, мне не нужно читать его на стороне процессора. Я использую glMapBufferRange, поэтому я могу вычислять измененные данные на лету и мне не нужна дополнительная копия (которая будет создана блокирующим glBufferSubData).

Это работает, и теперь я хотел бы выполнить многопоточное обновление данных (поскольку ему нужно обновлять много вершин со стабильной скоростью 90 кадров в секунду) и использовать постоянно отображаемый буфер (используя GL_MAP_PERSISTENT_BIT). Это потребует запускать glFlushMappedBufferRange всякий раз, когда рабочий поток завершает обновление частей отображенного буфера.

Можно ли вызывать glFlushMappedBufferRange в отдельном потоке? Диапазоны, с которыми работают разные потоки, не перекрываются. Есть ли при этом накладные расходы или неявная синхронизация?


person matthias_buehlmann    schedule 23.10.2015    source источник
comment
Любой вызов OpenGL нуждается в контексте. Вам, безусловно, потребуется создать дополнительный контекст для рабочего потока, если вы хотите вызвать из него glFlushMappedBufferRange().   -  person Reto Koradi    schedule 23.10.2015
comment
Но вы можете передать сопоставленный указатель во вторичный поток и иметь там столько времени чтения/записи, сколько захотите. Просто убедитесь, что вторичный поток не касается диапазона, который вы очищаете, на время вызова основного потока glFlushMappedBufferRange().   -  person genpfault    schedule 23.10.2015


Ответы (1)


Нет, вам необходимо вызывать glFlushMappedBufferRange в потоке, выполняющем функции openGL.

Чтобы преодолеть это, у вас есть 2 варианта:

  1. получить контекст openGL и сделать его текущим в рабочем потоке. Это означает, что поток openGL должен отказаться от контекста, чтобы он работал.

  2. поместите соответствующий диапазон в потокобезопасную очередь и позвольте потоку openGL извлечь из него каждый диапазон и вызвать glFlushMappedBufferRange.

person ratchet freak    schedule 23.10.2015