为什么eglmakeccurrent()与EGL_BAD_MATCH失败?
Why is eglMakeCurrent() failing with EGL_BAD_MATCH?
我正在使用opengl/egl开发Android。我的应用程序需要第二个上下文来从第二个线程加载纹理。
我的代码在android 2.3上工作得很好,但是当我在4.0.3的android设备或模拟器上尝试代码时,eglmakeccurrent()在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)上,eglmakecurcurrent()在初始化成功后使用EGL_BAD_MATCH失败。
有人知道为什么我可能得到这个错误吗?
啊,一些我确实知道的东西。[花了5年的大部分时间在各种EGL实现上]。
我很确定你的surface
与实际显示表面的格式不同。我不确定到底有什么不同,或者你需要改变什么。也许EGL_DEPTH_SIZE ?您可以尝试列举可用的模式,看看是否有"可能"的模式。我知道,这有点痛苦,但我过去已经这样做过几次了——不同的是,我通常可以查看EGL源代码并找出我做错了什么……div;)
如果你得到这个错误,但不处理这个表面或纹理的东西,去运行并输入。android去AVD和你当前的模拟器删除用户日期文件,通常在。img文件,重新启动你的模拟器,然后测试。这对我来说是有效的,如果它发生在你的设备上测试,清除数据并重新启动你的应用程序。为那些发现这有帮助的人干杯。
请确保在传递给eglChooseConfig()
call的属性中为EGL_SURFACE_TYPE
设置了EGL_PBUFFER_BIT
。这是我的工作
- 错误消息:使用"string* +="后"no match for 'operator+='"
- 在 Eclipse: "error: no match for 'operator='" 中获取错误消息
- 使用来自 Excel VBA 的 C++ dll 时"Bad DLL calling convention" - 如何解决?
- 模板函数参数到模板函数的"candidate template ignored: could not match ..."
- 开放CV垫"Sizes of input arguments do not match"的问题
- 如何'Invalid conversion'和'no match for operator'更正这些 c++ 错误
- 为什么当我没有变量或其他任何命名的东西时"no match for 'operator==' "错误?
- C++17 编解码器在将标准::字符串转换为标准::字符串时抛出"bad conversion"
- 如何修复以下错误"no match for call to '(std::tr1::shared_ptr<_iobuf*>) (FILE*&)'"
- 对于代理容器上的迭代器来说,"least bad implementation"可能是什么?
- 为什么我收到以下错误:"no match for 'operator=='"?(带模板的嵌套类)
- 获取错误:在抛出"std::bad::alloc"的实例后终止调用 what(): std::bad_alloc
- 如何修复类函数"prototype does not match"和"cadidate is"错误
- 在命名空间内的类中使用带有运算符重载的字符串流时"no match for ‘operator>>’"
- 为什么 GetSystemMetrics (SM_CXVIRTUALSCREEN) 返回'bad'值?
- MSVC:带函数的"error C2244: unable to match function definition to an existing declaration"是指专用模板类的类型别名
- 不使用系统Protobuf库时的"Protobuf compiler version doesn't match library version 3.6.1"
- 将 lambda 传递给 STL 集时出错"bad function call"
- 新的 C++14 位分隔符处"Bad Character" Eclipse Oxygen 错误
- 使用 #define 被认为是"bad practice"吗?