Warum schlägt eglMakeCurrent mit EGL_BAD_ALLOC fehl?

Ich verwende OpenGL ES 2.0 und Android NDK r8b. Ich habe einen gemeinsamen Kontext, den ich für Arbeitsthreads verwende. Wenn ich versuche, den freigegebenen Kontext mit eglMakeCurrent an einen Arbeitsthread zu binden, wird der Fehler EGL_BAD_ALLOC angezeigt.

Was mich jetzt verwirrt, ist, dass dieser Code zuvor einwandfrei funktioniert hat. Ich bin nicht sicher, was ich getan habe, um ihn zu brechen. Die EGL-Dokumente besagen, dass dieser Fehler damit zusammenhängt, dass Ressourcen nicht verfügbar sind, aber ich die gleiche App ausführe Das funktionierte früher perfekt auf genau demselben Gerät, und alle Texturen werden vom Haupt-Thread geladen.


Was könnte diesen Fehler verursachen?

Dies ist meine egl Initialisierung:

bool Initialize(void *displaySurface)
{
    assert(displaySurface);
    ANativeWindow *window = (ANativeWindow*)displaySurface;

    EGLint dummy, format;

    display = eglGetDisplay(EGL_DEFAULT_DISPLAY);

    eglInitialize(display, 0, 0);

    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
    };

    const EGLint auxConfigAttribs[] =
    {
        EGL_SURFACE_TYPE, EGL_PBUFFER_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 contextAttribs[] =
    {
        EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE
    };

    EGLint numConfigs;
    EGLConfig config;

//// create main context
    eglChooseConfig(display, configAttribs, &config, 1, &numConfigs);
    Trace("eglChooseConfig: " + GetEglError());

    eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format);
    Trace("eglGetConfigAttrib: " + GetEglError());

    ANativeWindow_setBuffersGeometry(window, 0, 0, format);
    Trace("ANativeWindow_setBuffersGeometry: " + GetEglError());

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

    context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs);
    Trace("eglCreateContext: " + GetEglError());

//// create auxiliary context
    eglChooseConfig(display, auxConfigAttribs, &config, 1, &numConfigs);
    Trace("AUX eglChooseConfig: " + GetEglError());

    auxSurface = eglCreatePbufferSurface(display, config, NULL);
    Trace("AUX eglCreatePbufferSurface: " + GetEglError());

    auxContext = eglCreateContext(display, config, context, contextAttribs);
    Trace("AUX eglCreateContext: " + GetEglError());

//// make main context current
    eglMakeCurrent(display, surface, surface, context);
    Trace("eglMakeCurrent: " + GetError());

    eglQuerySurface(display, surface, EGL_WIDTH, &width);
    eglQuerySurface(display, surface, EGL_HEIGHT, &height);

    SetViewport(width, height);

    EnableDepthBuffer(enableDepthTest);
    EnableBackfaceCulling(enableBackfaceCull);
    SetBackgroundColor(backgroundColor);

    glDisable(GL_DITHER);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    Trace("finished" + GetEglError());

    alive = true;

    return true;
}

bearbeiten:Ich könnte mich irren, aber dieser Fehler scheint zur selben Zeit aufgetreten zu sein, als die ndk-Toolchain aktualisiert wurde ... aber ich kann diese Theorie nicht testen, weil ich keine älteren Kopien des ndk mehr habe. Also, wenn jemand Hätte einen Link, wo ich NDK 7c bekommen kann, das wäre auch hilfreich.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage