2012-09-15 14 views
5

私はOpenGL ES 2.0とAndroid NDK r8bを使用しています。私は、ワーカースレッド用に共有するコンテキストを持っています。 eglMakeCurrentを使用して共有コンテキストをワーカースレッドにバインドしようとすると、エラーEGL_BAD_ALLOCが発生します。EGL_BAD_ALLOCでeglMakeCurrentが失敗するのはなぜですか?

私が混乱するのは、このコードが以前より完全に働いていたことです。私はそれを壊すために何をしたのかよくわかりません。EGLのドキュメントでは、このエラーはリソースが利用できないということですが、この全く同じデバイスで完全に動作していた同じアプリケーションを実行し、すべてのテクスチャがメインスレッドから正常に読み込まれます。


このエラーの原因は何ですか?

これは私の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; 
} 

編集: は私が間違っているかもしれないが、このエラーは、NDKツールチェーンが更新されたのと同じ時間に現れているようだ...しかし、私はテストすることはできません私はNDK 7cを入手できる場所へのリンクを誰かが持っていれば、それも役立つでしょう。

+1

私の想像では、私はアル・バンディは、C++のコードを書くことを想像しないでしょう決して... –

答えて

8

まあ、PBufferは動作させるには少なくとも1x1ピクセル必要で、EGL_WIDTHとEGL_HEIGHTのデフォルトは0です。

受賞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; 
} 
関連する問題