Контексты однотридовые только: OpenGL является очень модальное API, так что позволяет несколько потоков одновременно использовать один и тот же контекст будет болезненным - если нить 1 вызывает glBindTexture
то, как он знает! что он не был прерван нитью 2, сделав другой вызов glBindTexture
, прежде чем он перейдет к следующему оператору?
Однако eglCreateContext
«s третий параметр определен как:
share_context
Указывает другой контекст рендеринга EGL, с которой к данных акций, как это определено в клиентском API, соответствующего контекстах. Данные также передаются во всех других контекстах, с которыми делится данные share_context. EGL_NO_CONTEXT
указывает, что общий доступ не равен .
(предостережение в спецификации предупреждает, что текстура 0 не разделяемая, если вы постоянно используете только результаты glGenTextures
как ваши идентификаторы, то не беспокойтесь об этом)
Так что ваш фон контексту необходимо назначить оригинал в качестве общего контекста. Затем он владеет собственным контекстом. Он может продолжить дорогостоящую работу по созданию текстур. Когда это будет сделано, созданные им текстурные имена могут быть переданы основному потоку и должны использоваться в контексте.
Единственное, на что можно обратить внимание, это потенциальные проблемы синхронизации между командной очередью на вашем основном потоке и на вашем фоне. Возможно, наиболее безопасно позвонить glFinish
в фоновом режиме, чтобы убедиться, что все работы завершены, передайте свой идентификатор текстуры на передний план, затем вызовите glFlush
в этом контексте, чтобы очистить незагруженную очередь команд.
ooh спасибоmmy, так как я понимаю в :: Thread2 мне нужно создать другой контекст, который делится с :: Thread1 вправо? но как создать контекст в фоновом потоке с помощью eglCreateWindowSurface или eglCreatePbufferSurface? – loki
Вам нужна поверхность? Если нет, то мое предположение (предупреждение: без проверки) заключается в том, что вы можете просто не выполнять - загружать текстуры, передавать их, никогда не интересоваться командами рисования. В противном случае, я думаю, 'eglCreatePbufferSurface', поскольку они предназначены для внеэкранного рисования без соответствующего окна. Это то, что вы предположительно хотите для контекста, который предназначен для обработки и загрузки ресурсов. – Tommy