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

Вы смотрите срез комментариев. Показать все
0
Автор поста оценил этот комментарий

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


ето как?

-----------

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


раскрыть ветку (5)
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
Автор поста оценил этот комментарий

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

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

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

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

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

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

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

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку