Имеется нативное приложение (c++ ndk SDL2) с графикой на Open GLES2.
На некоторых устройствах у меня происходит удаление EGL контекста ПРИ СВОРАЧИВАНИИ И РАЗВОРАЧИВАНИИ и создание нового, после чего я получаю указатель на него в нативной части и пересоздаю все текстуры и буфферы.
Все бы хорошо, но ничего не выводится на экран. Шейдеры компилятся без проблем, opengl trace показывает, что все нормально работает, но экран черный, будто я приложение отрисовываю в offscreen buffer, а потом вывожу... но не на экран... странно.
В общем, если кто может ткнуть меня носом в ошибку или поделиться куском плюсового или на худой конец java кода с корректным пересозданием контекста и off-screen буфферов - буду очень благодарен. Если кто-то сталкивался с этим при работе с SDL2 будет еще круче.
Инициализация рендера:
void GLRender::Init()
{
...
SDL_GLContext cur_ctx = SDL_GL_GetCurrentContext();
if (cur_ctx == nullptr)
{
m_glContext = SDL_GL_CreateContext(_window);
}
else
{
m_glContext = cur_ctx;
}
SDL_GL_MakeCurrent(_window, m_glContext);
...
GLint default_buffer; GL_CHECK(glGetIntegerv(GL_FRAMEBUFFER_BINDING, &default_buffer));
m_defaultFramebuffer = default_buffer; // индекс экранного буффера
InitBuffers(); // буфферы для эффектов
InitOffscreenBuffers(); // оффскрин буфферы
InitShaders(); // шейдеры
}
При первой инициализации у меня текущего контекста нет и я создаю новый. Все ок, все работает.
После того как я сворачиваю и разворачиваю - происходит что-то типа такого
void GLRender::OnResume(SDL_GLContext _ctx)
{
if(m_glContext != _ctx) // SDL_GLContext - это указатель
{
DeinitAll(); // удалить к чертям все текстуры, буфферы, шейдеры, сбросить все в 0
Init(); // к этому моменту SDL_GL_GetCurrentContext() вернет то же самое, что и _ctx в этом методе
}
}
При инициализации на возвращении Java обертка уже перекидывает мне НОВЫЙ контекст, если не удалось сохранить исходный. Я выставляю его как текущий и делаю абсолютно все те-же инициализации, что и при первом запуске. Все собирается хорошо, glGetError проверяется на каждом шаге и там все тоже хорошо, шейдеры отрендерились и процесс отрисовки пошел... но не на экран...
в m_defaultFramebuffer - как и при первом запуске лежит 0, собственно - индекс экранного буффера.
void GLRender::Flip()
{
// рисование в текстуры offscreen
...
glBindFramebuffer(GL_FRAMEBUFFER, m_defaultFramebuffer);
m_offscreenTexture->Draw(); // отрисовка оффскрина на экран
}
Итог - черный экран