web-dev-qa-db-fra.com

Pourquoi eglMakeCurrent () échoue avec EGL_BAD_MATCH?

Je développe pour Android utilisant opengl/egl. Mon application nécessite un deuxième contexte pour charger des textures à partir d'un deuxième fil.

Mon code fonctionne bien sur Android 2.3, mais lorsque j'essaie le code sur un appareil ou un émulateur 4.0.3 Android Android), eglMakeCurrent () échoue avec EGL_BAD_MATCH.

L'initialisation du deuxième contexte et son tampon de pixels fonctionnent également très bien, donc je ne sais pas par où commencer à chercher cette erreur.

Voici le code d'initialisation:

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 Android 2.3 (HTC Desire), le code d'initialisation ci-dessus fonctionne parfaitement, et je peux rendre le auxContext actuel et charger très bien les textures.

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

Est-ce que quelqu'un sait pourquoi je reçois cette erreur?

19
CuriousGeorge

Ah, quelque chose dont je sais quelque chose. ;) [Ayant passé la meilleure partie de 5 ans à travailler sur diverses implémentations EGL].

Je suis assez certain que votre surface est d'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 disponibles et voir s'ils semblent "probables". Je sais, c'est un peu pénible, mais j'y suis allé plusieurs fois dans le passé - avec la différence que je pouvais généralement parcourir le code source EGL et comprendre ce que j'avais mal fait ... ;)

11
Mats Petersson

Si vous obtenez cette erreur mais ne traitez pas ces éléments de surface ou de texture, exécutez et tapez .Android, accédez à AVD et votre émulateur actuel supprime le fichier de date utilisateur généralement sur le fichier .img, redémarrez votre émulateur puis testez. Cela fonctionne pour moi, si cela se produit lors des tests sur votre appareil, effacez les données et redémarrez votre application. Bravo à ceux qui trouvent cela utile.

5
ralphgabb