У меня есть код EGL/GLES 2.0, который я пытаюсь запустить на Linux (через Mesa) и Android (iOS для выхода). В Linux он отлично работает и выглядит так, как ожидалось. Выполняется на Android (телефон, планшет и эмулятор - все 4.01), он проходит отлично, но ничего не отображает (экран остается черным). Код на 99% одинаковый для всех 3 - с некоторой специальной обработкой для Android. После моего EGL атрибуты:EGL работает на Linux, но не на Android
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;
}
Может кто-то пролил свет, что проверить или как найти проблему?
EDIT:
Я исправил некоторые другие ошибки и теперь она прекрасно работает в эмуляторе Android и HP Touchpad (CyanogenMod 9 альфа), но по-прежнему приводит к черному экрану на моем Samsung Galaxy S1 с Cyanogenmod 9 * вздох *.
Вы пробовали glGetError? – Tim
Вы используете настоящее устройство или эмулятор Android? Если эмулятор, эта ссылка может вам помочь: http://www.androidng.com/how-to-boost-speedup-android-emulator – chrisendymion
Что такое «x_display»? Обычно вы хотите передать EGL_DEFAULT_DISPLAY на eglGetDisplay(). –