2012-07-02 1 views
4

У меня есть код 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 * вздох *.

+0

Вы пробовали glGetError? – Tim

+1

Вы используете настоящее устройство или эмулятор Android? Если эмулятор, эта ссылка может вам помочь: http://www.androidng.com/how-to-boost-speedup-android-emulator – chrisendymion

+1

Что такое «x_display»? Обычно вы хотите передать EGL_DEFAULT_DISPLAY на eglGetDisplay(). –

ответ

0

Во-первых, просто замечание: вам не нужны два 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().

Смежные вопросы