Why is eglMakeCurrent failing with EGL_BAD_ALLOC?

后端 未结 1 1899
走了就别回头了
走了就别回头了 2021-01-19 01:03

I am using OpenGL ES 2.0, and Android NDK r8b. I have a shared context that I use for worker threads. When I try to bind the shared context to a worker thread using eglMakeC

1条回答
  •  时光说笑
    2021-01-19 02:06

    Well, It seems that the problem was that the PBuffer needs to be at least 1x1 pixels for it to work, and the default is 0 for EGL_WIDTH and EGL_HEIGHT.

    The winning configurtation:

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

    0 讨论(0)
提交回复
热议问题