2016-04-11 11 views
0

я не очень хорошо знаю OPENGL, но у меня есть один контекст, который создается в основном потоке пользовательского интерфейса с:Как создать многопоточный контекст OpenGL

eglGetDisplay(EGL_DEFAULT_DISPLAY); 
eglCreateWindowSurface(..) 
eglCreateContext(..) 
eglMakeCurrent(...) 

, но теперь я хочу сделать также некоторые графические манипуляции (в основном для создания текстур и отправки позже этих текстур для рисования в основной поток ui) в фоновом потоке. но я не знаю, как инициализировать второй контекст во втором потоке (или как использовать первый контекст во втором потоке) :(Может быть, я должен использовать eglCreatePbufferSurface в моем втором потоке? Я не знаю ...

спасибо по заранее за вашу помощь

ответ

0

Контексты однотридовые только: OpenGL является очень модальное API, так что позволяет несколько потоков одновременно использовать один и тот же контекст будет болезненным - если нить 1 вызывает glBindTexture то, как он знает! что он не был прерван нитью 2, сделав другой вызов glBindTexture, прежде чем он перейдет к следующему оператору?

Однако eglCreateContext «s третий параметр определен как:

share_context

Указывает другой контекст рендеринга EGL, с которой к данных акций, как это определено в клиентском API, соответствующего контекстах. Данные также передаются во всех других контекстах, с которыми делится данные share_context. EGL_NO_CONTEXT указывает, что общий доступ не равен .

(предостережение в спецификации предупреждает, что текстура 0 не разделяемая, если вы постоянно используете только результаты glGenTextures как ваши идентификаторы, то не беспокойтесь об этом)

Так что ваш фон контексту необходимо назначить оригинал в качестве общего контекста. Затем он владеет собственным контекстом. Он может продолжить дорогостоящую работу по созданию текстур. Когда это будет сделано, созданные им текстурные имена могут быть переданы основному потоку и должны использоваться в контексте.

Единственное, на что можно обратить внимание, это потенциальные проблемы синхронизации между командной очередью на вашем основном потоке и на вашем фоне. Возможно, наиболее безопасно позвонить glFinish в фоновом режиме, чтобы убедиться, что все работы завершены, передайте свой идентификатор текстуры на передний план, затем вызовите glFlush в этом контексте, чтобы очистить незагруженную очередь команд.

+0

ooh спасибоmmy, так как я понимаю в :: Thread2 мне нужно создать другой контекст, который делится с :: Thread1 вправо? но как создать контекст в фоновом потоке с помощью eglCreateWindowSurface или eglCreatePbufferSurface? – loki

+0

Вам нужна поверхность? Если нет, то мое предположение (предупреждение: без проверки) заключается в том, что вы можете просто не выполнять - загружать текстуры, передавать их, никогда не интересоваться командами рисования. В противном случае, я думаю, 'eglCreatePbufferSurface', поскольку они предназначены для внеэкранного рисования без соответствующего окна. Это то, что вы предположительно хотите для контекста, который предназначен для обработки и загрузки ресурсов. – Tommy