Pourquoi eglMakeCurrent () échoue avec EGL BAD MATCH?

je développe pour Android en utilisant opengl / egl. Mon application nécessite un second contexte pour charger des textures à partir d'un second thread.

mon code fonctionne très bien sur android 2.3, mais quand j'essaie le code sur un appareil ou émulateur android 4.0.3, eglMakeCurrent() échoue avec EGL_BAD_MATCH.

l'initialisation du second contexte et de son tampon de pixels fonctionne aussi bien, donc je ne suis pas sûr où commencer à chercher cette erreur.

C'est l'initialisation 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());

sur mon appareil Android 2.3 (HTC Desire), le code d'initialisation ci-dessus fonctionne parfaitement, et je peux faire le courant auxContext, et charger les textures juste fine.

mais, sur mon appareil android 4.0.3(Samsung Nexus S) et mon appareil Android 4.1 (Galaxy Note 2) eglMakeCurrent() échoue avec EGL_BAD_MATCH après une initialisation réussie.

est-ce que quelqu'un sait pourquoi je peux avoir cette erreur?

18
demandé sur genpfault 2012-12-28 03:48:08

3 réponses

Ah, quelque chose dont je sais quelque chose en fait. ;) [Ayant passé la meilleure partie de 5 années à travailler sur diverses mises en œuvre de L'EGL].

je suis assez certain de votre surface est un format différent de la surface d'affichage réelle. Je ne sais pas exactement quelle serait la différence, ni ce que vous devez changer. EGL_DEPTH_SIZE peut-être? Vous pouvez essayer d'énumérer les modes qui sont disponibles et voir si un regard "probable". Je sais, c'est un peu de douleur, mais j'ai été là, fait cela à quelques reprises dans le passé - avec la différence que je pouvais habituellement regarder à travers le code source EGL et de comprendre ce que j'avais fait de mal... ;)

11
répondu Mats Petersson 2012-12-28 00:04:41

si vous avez cette erreur mais que vous ne vous occupez pas de la surface ou de la texture, allez à exécuter et taper .Android allez à AVD et votre émulateur actuel supprimer le fichier de date de l'utilisateur habituellement sur .img file, redémarrez votre émulateur puis testez. Cela fonctionne pour moi, si il arrive alors que des tests sur votre appareil, effacer les données et redémarrer votre application. Bravo pour ceux qui trouvent cela utile.

5
répondu ralphgabb 2014-08-28 08:25:06
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;
    }
-2
répondu Jesse Stone 2017-10-17 03:35:28