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 () .