为什么eglMakeCurrent()与EGL失败
我正在为使用opengl / egl的Android进行开发。 我的应用程序需要第二个上下文来从第二个线程加载纹理。
我的代码在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设备(Samsung Nexus S)和我的Android 4.1设备(Galaxy Note 2)上,eglMakeCurrent()在初始化成功后失败并显示EGL_BAD_MATCH。
有谁知道为什么我可能会得到这个错误?
啊,我其实知道一些事情。 ;)[花了5年时间完成各种EGL实现的最佳部分]。
我很确定你的surface
是与实际显示表面不同的格式。 我不确定究竟会发生什么差别,或者你需要改变什么。 EGL_DEPTH_SIZE也许? 你可以尝试枚举可用的模式,看看是否有可能。 我知道,这有点痛苦,但过去我曾经在那里做过几次 - 不同之处在于我通常可以通过EGL源代码查看并确定我做错了什么...... ;)
如果你得到这个错误,但不处理这个表面或纹理的东西,去运行并键入.android去AVD和你当前的模拟器通常在.img文件上删除用户日期文件,重新启动你的模拟器然后测试。 这适用于我,如果它发生在您的设备上进行测试时,清除数据并重新启动您的应用程序。 欢呼那些认为这有帮助的人。
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;
}
链接地址: http://www.djcxy.com/p/69057.html