为什么eglMakeCurrent()与EGL_BAD_MATCH失败?

我正在开发Android使用opengl / egl。 我的应用程序需要第二个上下文来从第二个线程加载纹理。

我的代码在Android 2.3上工作正常,但是当我尝试4.0.3 Android设备或模拟器上的代码时,eglMakeCurrent()失败,EGL_BAD_MATCH。

第二个上下文的初始化和它的像素缓冲区都可以正常工作,所以我不知道从哪里开始寻找这个错误。

这是初始化代码:

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 }; 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); eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format); ANativeWindow_setBuffersGeometry(window, 0, 0, format); surface = eglCreateWindowSurface(display, config, window, NULL); if(surface == NULL) Trace("error creating window surface: " + GetEglError()); context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs); if(context == NULL) Trace("error creating main context: " + GetEglError()); const EGLint auxConfigAttribs[] = { EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, EGL_BLUE_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_RED_SIZE, 8, EGL_ALPHA_SIZE, 8, 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); auxSurface = eglCreatePbufferSurface(display, auxConfig, pbufferAttribs); if(auxSurface == NULL) Trace("error creating pbuffer surface: " + GetEglError()); auxContext = eglCreateContext(display, auxConfig, context, contextAttribs); if(auxSurface == NULL) Trace("error creating auxilliary context: " + GetEglError()); if(!eglMakeCurrent(display, surface, surface, context)) Trace("could not make main context current: " + GetEglError()); 

在我的Android 2.3设备(HTC Desire)上,上面的初始化代码完美地工作,我可以使auxContext成为当前,并加载纹理就好了。

但是,在我的Android 4.0.3设备(三星Nexus S)和我的Android 4.1设备(Galaxy Note 2)eglMakeCurrent()成功初始化后EGL_BAD_MATCH失败。

有谁知道为什么我可能会得到这个错误?

Solutions Collecting From Web of "为什么eglMakeCurrent()与EGL_BAD_MATCH失败?"

啊,我其实知道一些事情。 ;)[花费了5年的时间来完成各种EGL实现的最佳部分]。

我很确定你的surface是与实际显示表面不同的格式。 我不确定究竟会有什么区别,或者你需要改变什么。 EGL_DEPTH_SIZE也许? 你可以尝试枚举可用的模式,看看是否有可能。 我知道,这有点痛苦,但过去我曾经在那里做过几次 – 不同之处在于,我通常可以通过EGL源代码查找并找出我做错了什么。 ;)

如果你得到这个错误,但没有处理这个表面或纹理的东西,去运行和input.android去AVD和您当前的模拟器通常删除用户date文件.img文件,重新启动您的模拟器,然后testing。 这适用于我,如果它发生在您的设备上进行testing,请清除数据并重新启动您的应用程序。 欢呼那些谁发现这有帮助。

 int config_attrs[] = { EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, EGL_ALPHA_SIZE, 8, EGL_BUFFER_SIZE, 16, EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_DEPTH_SIZE, 16, EGL_STENCIL_SIZE, 8, EGL_SAMPLE_BUFFERS, 0, EGL_SAMPLES, 0, #ifdef _IRR_COMPILE_WITH_OGLES1_ EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT, #else EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, #endif EGL_NONE, 0 }; int context_attrs[] = { #ifdef _IRR_COMPILE_WITH_OGLES1_ EGL_CONTEXT_CLIENT_VERSION, 1, #else EGL_CONTEXT_CLIENT_VERSION, 2, #endif EGL_NONE, 0 }; ///// //ogles1 and ogles2 use different libEGL.dll, make sure s_egl_display = eglGetDisplay ( g_hDC ); if ( s_egl_display == EGL_NO_DISPLAY ) { return; } if ( !eglInitialize ( s_egl_display, &major, &minor ) ) { return; } if ( !eglChooseConfig ( s_egl_display, config_attrs, &g_egl_config, 1, &configs ) || ( configs != 1 ) ) { return; } s_egl_surface = eglCreateWindowSurface ( s_egl_display, g_egl_config, g_hWnd, 0 ); if ( eglGetError() != EGL_SUCCESS ) { return; } eRet = eglBindAPI( EGL_OPENGL_ES_API ); s_egl_context = eglCreateContext ( s_egl_display, g_egl_config, EGL_NO_CONTEXT, context_attrs ); if ( eglGetError() != EGL_SUCCESS ) { return; } eglMakeCurrent ( s_egl_display, s_egl_surface, s_egl_surface, s_egl_context ); if ( eglGetError() != EGL_SUCCESS ) { return; }