2016-09-27 302 views
4

我想使用多个EGL上下文在我的主线程之外加载纹理。在拨打eglCreateContext后,我收到EGL_BAD_CONTEXT错误。在Android上的OpenGL上下文之间共享资源

里面我android.opengl.Renderer

public void onSurfaceCreated (javax.microedition.khronos.opengles.GL10 gl, EGLConfig config) { 
    // ... 
    EGLContext sharedContext = egl.getCurrentContext(); 
    EGLDisplay display = eglGetCurrentDisplay(); 
    eglCreateContext(display, config, sharedContext, new int[] { EGL_CONTEXT_CLIENT_VERSION, 2 }); 
} 

EGL_BAD_CONTEXT导致我的文档here,说,如果share_context是不一样的客户端的EGL渲染背景下产生

EGL_BAD_CONTEXT API类型作为新创建的上下文,而不是EGL_NO_CONTEXT。

这就是为什么我添加了EGL_CONTEXT_CLIENT_VERSION参数,但它似乎没有效果。

我所看到的是,即使我得到这个错误,上下文似乎是半有效的。我能够用它在另一个线程

egl.eglMakeCurrent(display, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, context); 

在此之后,该线程创建的纹理不原因的错误。但我确实看到纹理名称不是共享的,每个线程似乎都从0开始计数。


我的下一个假设是我需要共享上下文之间的界面。但是,如果我通过从原始上下文相同的表面到我eglMakeCurrent,但我

E/AndroidRuntime(3210): java.lang.IllegalArgumentException 
E/AndroidRuntime(3210):  at com.google.android.gles_jni.EGLImpl._eglCreateContext(Native Method) 
E/AndroidRuntime(3210):  at com.google.android.gles_jni.EGLImpl.eglCreateContext(EGLImpl.java:54) 

完全失败我觉得好像我几乎有,是否有人知道缺少了什么?

回答

0

this question原来,由于一些帮助:

我的辅环境要求的表面。它是而不是与原始上下文的表面相同。

我需要使用eglCreatePbufferSurface来创建新的曲面。我之前尝试过的失败的原因是它默认的宽度和高度为0.通过将它设置为1x1表面,它完美地工作。

egl.eglCreatePbufferSurface(display, config, new int[] { EGL10.EGL_WIDTH, 1, EGL10.EGL_HEIGHT, 1, EGL10.EGL_NONE });