Why is eglMakeCurrent() failing with EGL

I am developing for Android using opengl/egl. My app requires a second context for loading textures from a second thread.

My code works fine on android 2.3, but when I try the code on a 4.0.3 android device or emulator, eglMakeCurrent() fails with EGL_BAD_MATCH.

The initialization of the second context and it's pixel buffer all works fine too, so I am not sure where to begin looking for this error.

This is the initialization code:

ANativeWindow *window = (ANativeWindow*)displaySurface;

EGLint dummy, format;

display = eglGetDisplay(EGL_DEFAULT_DISPLAY);

eglInitialize(display, 0, 0);

EGLint contextAttribs[] =
{
    EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE
};

const EGLint configAttribs[] =
{
    EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
    EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
    EGL_BLUE_SIZE, 8,
    EGL_GREEN_SIZE, 8,
    EGL_RED_SIZE, 8,
    EGL_ALPHA_SIZE, 8,
    EGL_BUFFER_SIZE, 32,
    EGL_DEPTH_SIZE, 24,
    EGL_NONE
};

EGLint numConfigs;
EGLConfig config;

eglChooseConfig(display, configAttribs, &config, 1, &numConfigs);
eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format);
ANativeWindow_setBuffersGeometry(window, 0, 0, format);

surface = eglCreateWindowSurface(display, config, window, NULL);
if(surface == NULL)
    Trace("error creating window surface: " + GetEglError());

context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs);
if(context == NULL)
    Trace("error creating main context: " + GetEglError());

const EGLint auxConfigAttribs[] =
{
    EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
    EGL_BLUE_SIZE, 8,
    EGL_GREEN_SIZE, 8,
    EGL_RED_SIZE, 8,
    EGL_ALPHA_SIZE, 8,
    EGL_DEPTH_SIZE, 0,
    EGL_STENCIL_SIZE, 0,
    EGL_NONE
};

EGLint pbufferAttribs[] =
{
    EGL_WIDTH, 1,
    EGL_HEIGHT, 1,
    EGL_TEXTURE_TARGET, EGL_NO_TEXTURE,
    EGL_TEXTURE_FORMAT, EGL_NO_TEXTURE,
    EGL_NONE
};

EGLint auxNumConfigs;
EGLConfig auxConfig;

eglChooseConfig(display, auxConfigAttribs, &auxConfig, 1, &auxNumConfigs);

auxSurface = eglCreatePbufferSurface(display, auxConfig, pbufferAttribs);
if(auxSurface == NULL)
    Trace("error creating pbuffer surface: " + GetEglError());

auxContext = eglCreateContext(display, auxConfig, context, contextAttribs);
if(auxSurface == NULL)
    Trace("error creating auxilliary context: " + GetEglError());

if(!eglMakeCurrent(display, surface, surface, context))
    Trace("could not make main context current: " + GetEglError());

On my Android 2.3 device(HTC Desire), the above initialization code works perfectly, and I can make the auxContext current, and load textures just fine.

BUT, on my android 4.0.3 device(Samsung Nexus S) and my Android 4.1 device (Galaxy Note 2) eglMakeCurrent() fails with EGL_BAD_MATCH after a successful initialization.

Does anyone know why I may be getting this error?


Ah, something I actually know something about. ;) [Having spent best part of 5 years working on various EGL implementations].

I'm pretty certain your surface is a different format to the actual display surface. I'm not sure exactly WHAT the difference would be, or what you need to change. EGL_DEPTH_SIZE perhaps? You could try enumerating the modes that are available and see if any look "likely". I know, it's a bit of a pain, but I've been there done that a few times in the past - with the difference that I could usually look through the EGL source code and figure out what I'd done wrong... ;)


If your getting this error but not dealing with this surface or texture stuff, go to run and type .android go to AVD and your current Emulator delete the user-date file usually on .img file, restart your emulator then test. This works for me, if it happens on while testing on your device, clear the data and restart your app. Cheers for those who find this helpful.


int config_attrs[] =
    {
        EGL_RED_SIZE, 8,

EGL_GREEN_SIZE, 8,

        EGL_BLUE_SIZE, 8,

        EGL_ALPHA_SIZE, 8,

        EGL_BUFFER_SIZE, 16,

        EGL_SURFACE_TYPE, EGL_WINDOW_BIT,

        EGL_DEPTH_SIZE, 16,

        EGL_STENCIL_SIZE, 8,

        EGL_SAMPLE_BUFFERS, 0,

        EGL_SAMPLES, 0,
#ifdef _IRR_COMPILE_WITH_OGLES1_    
        EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT,
#else
        EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
#endif
        EGL_NONE, 0
    };

    int context_attrs[] = 
    {
#ifdef _IRR_COMPILE_WITH_OGLES1_        
        EGL_CONTEXT_CLIENT_VERSION, 1,
#else
        EGL_CONTEXT_CLIENT_VERSION, 2,
#endif
        EGL_NONE, 0
    };

/////
//ogles1 and ogles2 use different libEGL.dll,  make sure 

s_egl_display = eglGetDisplay ( g_hDC );

    if ( s_egl_display == EGL_NO_DISPLAY )
    {
        return;
    }

    if ( !eglInitialize ( s_egl_display, &major, &minor ) )
    {
        return;
    }

    if ( !eglChooseConfig ( s_egl_display, config_attrs, &g_egl_config, 1, &configs ) || ( configs != 1 ) )
    {
        return;
    }

    s_egl_surface = eglCreateWindowSurface ( s_egl_display, g_egl_config, g_hWnd, 0 );
    if ( eglGetError() != EGL_SUCCESS )
    {
        return;
    }

    eRet = eglBindAPI( EGL_OPENGL_ES_API );

    s_egl_context = eglCreateContext ( s_egl_display, g_egl_config, EGL_NO_CONTEXT, context_attrs );
    if ( eglGetError() != EGL_SUCCESS )
    {
        return;
    }

    eglMakeCurrent ( s_egl_display, s_egl_surface, s_egl_surface, s_egl_context );
    if ( eglGetError() != EGL_SUCCESS )
    {
        return;
    }
链接地址: http://www.djcxy.com/p/69058.html

上一篇: 视频录制仅适用于我的设备,但不适用于其他设备

下一篇: 为什么eglMakeCurrent()与EGL失败