2012-09-15 34 views
5

Estoy usando OpenGL ES 2.0 y Android NDK r8b. Tengo un contexto compartido que utilizo para hilos de trabajo. Cuando intento vincular el contexto compartido a un hilo de trabajo utilizando eglMakeCurrent, aparece el error EGL_BAD_ALLOC.¿Por qué falla eglMakeCurrent con EGL_BAD_ALLOC?

Ahora lo que me confunde es que este código estaba funcionando perfectamente antes ... y no estoy seguro de qué he hecho para romperlo ... Los documentos de EGL dicen que este error tiene que ver con recursos que no están disponibles, pero yo soy ejecutando la misma aplicación que solía funcionar perfectamente en este mismo dispositivo, y todas las texturas cargan bien desde el hilo principal.


¿Qué podría estar causando este error?

Ésta es mi inicialización EGL:

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

edición: puedo estar equivocado, pero este error parece haber aparecido al mismo tiempo la cadena de herramientas NDK se actualiza ... pero no puedo probar esta teoría porque ya no tengo copias más antiguas del ndk ... Así que si alguien tuviera un enlace a donde puedo obtener NDK 7c, eso también sería útil.

+1

en mis sueños más salvajes habría que imaginar Al Bundy escribir código C++ ... –

Respuesta

8

Bueno, parece que el problema fue que el PBuffer necesita tener al menos 1x1 píxeles para que funcione, y el valor predeterminado es 0 para EGL_WIDTH y EGL_HEIGHT.

El configurtation ganar:

bool Initialize(void *displaySurface) 
{ 
    assert(displaySurface); 
    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 
    }; 

//// create main context 
    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); 
    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 

    const EGLint auxConfigAttribs[] = 
    { 
     EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, 
     EGL_BLUE_SIZE, 8, 
     EGL_GREEN_SIZE, 8, 
     EGL_RED_SIZE, 8, 
     EGL_ALPHA_SIZE, 0, 
     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); 
    Trace("AUX eglChooseConfig: " + GetEglError()); 

    auxSurface = eglCreatePbufferSurface(display, auxConfig, pbufferAttribs); 
    Trace("AUX eglCreatePbufferSurface: " + GetEglError()); 

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

//// make main context current 
    eglMakeCurrent(display, surface, surface, context); 
    Trace("eglMakeCurrent main: " + 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; 
} 
Nunca
Cuestiones relacionadas