为什么 eglMakeCurrent() 因 EGL_BAD_MATCH 而失败? [英] Why is eglMakeCurrent() failing with EGL_BAD_MATCH?
问题描述
我正在使用 opengl/egl 为 Android 开发.我的应用需要第二个上下文来从第二个线程加载纹理.
I am developing for Android using opengl/egl. My app requires a second context for loading textures from a second thread.
我的代码在 android 2.3 上运行良好,但是当我在 4.0.3 android 设备或模拟器上尝试该代码时,eglMakeCurrent() 失败并显示 EGL_BAD_MATCH.
My code works fine on android 2.3, but when I try the code on a 4.0.3 android device or emulator, eglMakeCurrent() fails with EGL_BAD_MATCH.
第二个上下文的初始化和它的像素缓冲区也都工作正常,所以我不确定从哪里开始寻找这个错误.
The initialization of the second context and it's pixel buffer all works fine too, so I am not sure where to begin looking for this error.
这是初始化代码:
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 设为当前,并且加载纹理就好了.
On my Android 2.3 device(HTC Desire), the above initialization code works perfectly, and I can make the auxContext current, and load textures just fine.
但是,在我的 android 4.0.3 设备(Samsung Nexus S)和我的 Android 4.1 设备(Galaxy Note 2)上,eglMakeCurrent() 在成功初始化后失败并显示 EGL_BAD_MATCH.
BUT, on my android 4.0.3 device(Samsung Nexus S) and my Android 4.1 device (Galaxy Note 2) eglMakeCurrent() fails with EGL_BAD_MATCH after a successful initialization.
有人知道我为什么会收到这个错误吗?
Does anyone know why I may be getting this error?
推荐答案
啊,我其实知道一些事情.;) [花费了 5 年中最好的部分来研究各种 EGL 实施].
Ah, something I actually know something about. ;) [Having spent best part of 5 years working on various EGL implementations].
我很确定您的 surface
与实际显示表面的格式不同.我不确定到底有什么区别,或者你需要改变什么.EGL_DEPTH_SIZE 也许?您可以尝试枚举可用的模式,看看是否有可能".我知道,这有点痛苦,但我过去曾做过几次——不同之处在于我通常可以查看 EGL 源代码并找出我做错了什么......;)
I'm pretty certain your surface
is a different format to the actual display surface. I'm not sure exactly WHAT the difference would be, or what you need to change. EGL_DEPTH_SIZE perhaps? You could try enumerating the modes that are available and see if any look "likely". I know, it's a bit of a pain, but I've been there done that a few times in the past - with the difference that I could usually look through the EGL source code and figure out what I'd done wrong... ;)
这篇关于为什么 eglMakeCurrent() 因 EGL_BAD_MATCH 而失败?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!