Intereting Posts
Воспроизведение аудио RTMP-потока на Android Pass в объекте Java-класс встроен в качестве параметра Виджет приложения: эффект пульсации теряется в элементе списка, когда фон добавлен к внешней компоновке Звуковые эффекты игры в Android Показывать размытое эскиз перед загрузкой всего изображения (например, в Whatsapp)? RecyclerView item layout_weight, размеры не обновляются Положение MediaController внутри фрагмента Как сохранить координаты GeoFire вместе с другими элементами в базе данных Firebase? Как создать нечто похожее на макет Play Newsstand Как передавать данные игрового центра между действиями? Заменить панель инструментов для каждого фрагмента ящика навигации Какую платформу ведения журнала Android использовать? Как cenralize последний неровный ряд в GridView в android? Как стилизовать кнопки в Alert Dialog Fragment с помощью Material Design? Службы Google Play устарели. Требуется 3159100, но найдено 3158130

EGL работает на Linux, но не на Android

У меня есть код EGL / GLES 2.0, который я пытаюсь запустить на Linux (через Mesa) и Android (iOS для выхода). В Linux он отлично работает и выглядит так, как ожидалось. Запуск на Android (телефон, планшет и эмулятор – все 4.01) проходит отлично, но ничего не отображает (экран остается черным). Код на 99% одинаковый для всех 3 – с некоторой специальной обработкой для Android. Следуя моим атрибутам EGL:

EGLint attribList[] = { EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, //EGL_ALPHA_SIZE, (flags & ES_WINDOW_ALPHA) ? 8 : EGL_DONT_CARE, //EGL_DEPTH_SIZE, (flags & ES_WINDOW_DEPTH) ? 8 : EGL_DONT_CARE, //EGL_STENCIL_SIZE, (flags & ES_WINDOW_STENCIL) ? 8 : EGL_DONT_CARE, EGL_SAMPLE_BUFFERS, (flags & ES_WINDOW_MULTISAMPLE) ? 1 : 0, // For Android this is extremely important - eglCreateContext will fail without it EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_NONE, EGL_NONE }; 

После кода создания EGL:

 EGLint numConfigs; EGLint majorVersion; EGLint minorVersion; EGLDisplay display; EGLContext context; EGLSurface surface; EGLConfig config; EGLint contextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE, EGL_NONE }; // Get Display display = eglGetDisplay((EGLNativeDisplayType)x_display); if ( display == EGL_NO_DISPLAY ) { esLogMessage("eglGetDisplay failed %d\n", eglGetError()); return EGL_FALSE; } // Initialize EGL if ( !eglInitialize(display, &majorVersion, &minorVersion) ) { esLogMessage("eglInitialize failed %d\n", eglGetError()); return EGL_FALSE; } static const size_t CONFIG_COUNT = 128; EGLConfig configs[CONFIG_COUNT]; // Get configs if ( !eglGetConfigs(display, configs, CONFIG_COUNT, &numConfigs) ) { esLogMessage("eglGetConfigs failed %d\n", eglGetError()); return EGL_FALSE; } else if( numConfigs == 0 ) { esLogMessage("eglGetConfigs found no configs for the display\n"); return EGL_FALSE; } EGLint chosenConfigCount = 0; // Choose config if ( !eglChooseConfig(display, attribList, &config, 1, &chosenConfigCount) ) { esLogMessage("eglChooseConfig failed %d\n", eglGetError()); return EGL_FALSE; } else if( chosenConfigCount == 0 ) { esLogMessage("eglChooseConfig found no matching configs (%d available)\n", numConfigs); return EGL_FALSE; } EGLint format; /* EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig that is * guaranteed to be accepted by ANativeWindow_setBuffersGeometry(). * As soon as we picked a EGLConfig, we can safely reconfigure the * ANativeWindow buffers to match, using EGL_NATIVE_VISUAL_ID. */ if( !eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format) ) { esLogMessage("eglGetConfigAttrib failed %d\n", eglGetError()); return EGL_FALSE; } #ifdef ANDROID if( ANativeWindow_setBuffersGeometry(hWnd, 0, 0, format) ) { esLogMessage("ANativeWindow_setBuffersGeometry failed\n"); return EGL_FALSE; } #endif // Create a surface surface = eglCreateWindowSurface(display, config, (EGLNativeWindowType)hWnd, NULL); if ( surface == EGL_NO_SURFACE ) { esLogMessage("eglCreateWindowSurface failed %d\n", eglGetError()); return EGL_FALSE; } // Create a GL context context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs ); if ( context == EGL_NO_CONTEXT ) { esLogMessage("eglCreateContext failed %d\n", eglGetError()); return EGL_FALSE; } // Make the context current if ( !eglMakeCurrent(display, surface, surface, context) ) { esLogMessage("eglMakeCurrent failed %d\n", eglGetError()); return EGL_FALSE; } 

Может ли кто-то пролить свет, что проверить или как найти проблему?

РЕДАКТИРОВАТЬ:

Я исправил некоторые другие ошибки, и теперь он отлично работает в Android Emulator и HP Touchpad (Cyanogenmod 9 alpha), но все же ведет к черному экрану на моей Samsung Galaxy S1 с Cyanogenmod 9 * sigh *.

Во-первых, просто замечание: вам не нужно два EGL_NONE для завершения определения атрибутов.

Во-вторых, ваша проблема связана с тем, что eglGetConfigs() возвращает доступные конфигурации, но eglChooseConfig(...,1,..) не обязательно вернет конфигурацию, которая точно соответствует той, которую вы запросили. Таким образом, вы должны сканировать конфигурации, чтобы найти наиболее близкие к вашим потребностям.

Вы должны вызвать eglGetConfigAttrib() для сравнения, например, EGL_RED_SIZE , EGL_GREEN_SIZE , EGL_BLUE_SIZE , EGL_ALPHA_SIZE , EGL_RENDERABLE_TYPE , EGL_DEPTH_SIZE , EGL_STENCIL_SIZE .

Подробнее см. EglChooseConfig () .