Как сделать QOpenGLContext текущим без поверхности в Qt5?

Я работаю над проектом, который будет использовать OpenCL для рендеринга графики для отображения в файле QOpenGLWidget. рекомендуемый способ сделать это, похоже, создать второй QOpenGLContext рядом с уже присутствующим в QOpenGLWidget, а затем создать поток, в котором этот вторичный контекст может жить вместе с кодом OpenCL.

Таким образом, Qt может работать как обычно с циклом обработки событий, работающим в основном потоке. И всякий раз, когда QOpenGLWidget решает рисовать, он просто извлекает данные из буфера, подготовленного во втором потоке вторичным контекстом и установленным там взаимодействием OpenCL.

Все это звучит великолепно на бумаге, но у меня возникли некоторые проблемы с тем, чтобы заставить это работать. Мой вопрос о том, как сделать вторичный QOpenGLContext «текущим» в потоке. Потому что QOpenGLContext::makeCurrent() принимает обязательный QSurface в качестве параметра, и единственная поверхность, которая у меня есть, это та, которая доступна из моего QOpenGLWidget, но использование ее во вторичном потоке не работает. Я получаю следующую ошибку:

Невозможно сделать QOpenGLContext текущим в другом потоке

Итак, какую поверхность следует использовать? Или я что-то пропустил, или нужно сделать по-другому?


person Lennart Rolland    schedule 22.09.2016    source источник
comment
Если у вас есть средство визуализации на основе OpenCL, зачем вам вообще нужен контекст GL? Кроме того, если ваш рендерер работает во втором потоке и предоставляет изображение всякий раз, когда оно готово, почему бы вам просто не уведомить свой графический интерфейс, что он может получить готовый новый кадр? Для этого вообще не нужен OpenGL. Или я что-то упускаю? Вы выполняете взаимодействие GL / CL?   -  person thokra    schedule 23.09.2016
comment
Да, взаимодействие :) извините, я должен был упомянуть об этом. Вывод используется в контексте gl   -  person Lennart Rolland    schedule 23.09.2016


Ответы (1)


Для этой цели вы можете создать и использовать QOffscreenSurface.

person peppe    schedule 24.09.2016