5

Нужна помощь Android программистов!

Нужна помощь Android программистов!

Привет, пикабу! Очень нужна помощь Android-программистов.

Имеется нативное приложение (c++ ndk SDL2) с графикой на Open GLES2.

На некоторых устройствах у меня происходит удаление EGL контекста ПРИ СВОРАЧИВАНИИ И РАЗВОРАЧИВАНИИ и создание нового, после чего я получаю указатель на него в нативной части и пересоздаю все текстуры и буфферы.

Все бы хорошо, но ничего не выводится на экран. Шейдеры компилятся без проблем, opengl trace показывает, что все нормально работает, но экран черный, будто я приложение отрисовываю в offscreen buffer, а потом вывожу... но не на экран... странно.

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

Всем котика-программиста в ленту!

Баянщик ругался на кота, но суть то не в нем.

Android

976 постов7.8K подписчиков

Правила сообщества

Сообщество посвящено обсуждению и обмену опытом использования устройств, работающих под управлением ОС Android/Linux, а также программного обеспечения для них. Обсуждение других операционных систем (в том числе GNU/Linux) - только в рамках их взаимодействия с Android.


В сообществе запрещены:

* заведомо деструктивные рекомендации

* бессодержательная переписка, особенно с переходом на личности собеседников

* обсуждение нужности рутового доступа (он нужен, и если у вас его нет - мы вам искренне посочувствуем, но искать другие способы решения вашей проблемы не будем)

* обсуждение нужности ПО от Google (необходимости в нем нет, и если вам этот функционал не нужен - смело запускайте pm disable-user или даже pm uninstall, только не забудьте предварительно сделать полную резервную копию)


Если вы просите о помощи, обязательно укажите максимально полную информацию об используемом вами устройстве, чего вы хотите добиться и какие шаги для этого предпринимали - это существенно ускорит получение ответа, так как из обсуждения будут исключены диалоги вида "попробуй вот так - пробовал, не помогает". Соответственно, и при ответе следует давать рекомендации, подходящие для любого устройства. Если вы не уверены в универсальности решения, напишите об этом явно: "у меня %s и мне помогло %s".


Данная редакция правил действует с момента ее публикации: 2022-01-27 22:00:00 +03:00

Автор поста оценил этот комментарий

Боюсь здесь никто не поможет. Может на тостер или стаковерфлоу.

Одно могу сказать, что просто андроидный activity lifecycle - тот еще пазл.

https://developer.android.com/training/basics/activity-lifec...

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Стак без результатен, спросил на тостере... но все же верю в силу пикабу! )

1
Автор поста оценил этот комментарий

да-да! и все исходники пожалуйста!

мы сейчас тут их подебажим.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Короче, дело обстоит так:

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(); // отрисовка оффскрина на экран

}

0
Автор поста оценил этот комментарий

у меня происходит удаление EGL контекста


ето как?

-----------

логи системы, логи видеодрайвера бы показал...


раскрыть ветку (1)
0
Автор поста оценил этот комментарий

ето как написано в Google документации на метод GLSurfaceView::SetPreserveGLContextOnPause(точно не помню его название) - "контекст вроде должен сохраниться при сворачивании, но не факт".... БЛИН! точно! забыл сказать, что это при сворачивании происходит!

показать ответы